Author: jannis
Date: 2008-07-16 19:44:23 +0000 (Wed, 16 Jul 2008)
New Revision: 27314
Modified:
xfce4-settings/trunk/ChangeLog
xfce4-settings/trunk/xfce4-settings-helper/keyboard-shortcuts.c
Log:
* xfce4-settings-helper/keyboard-shortcuts.c: Connect to the
"property-changed" signal of the XfconfChannel. Ungrab keys when a
property is removed and grab keys when a new property is added.
Update the shortcuts -> command hash table according to the changes.
Modified: xfce4-settings/trunk/ChangeLog
===================================================================
--- xfce4-settings/trunk/ChangeLog 2008-07-16 17:45:40 UTC (rev 27313)
+++ xfce4-settings/trunk/ChangeLog 2008-07-16 19:44:23 UTC (rev 27314)
@@ -5,6 +5,13 @@
2008-07-16 Jannis Pohlmann <[EMAIL PROTECTED]>
+ * xfce4-settings-helper/keyboard-shortcuts.c: Connect to the
+ "property-changed" signal of the XfconfChannel. Ungrab keys when a
+ property is removed and grab keys when a new property is added.
+ Update the shortcuts -> command hash table according to the changes.
+
+2008-07-16 Jannis Pohlmann <[EMAIL PROTECTED]>
+
* dialogs/keyboard-settings/keyboard-dialog.glade: In the last commit
I forgot to mention that I've removed the keyboard theme stuff from
the dialog because this would be too complicated to implement before
Modified: xfce4-settings/trunk/xfce4-settings-helper/keyboard-shortcuts.c
===================================================================
--- xfce4-settings/trunk/xfce4-settings-helper/keyboard-shortcuts.c
2008-07-16 17:45:40 UTC (rev 27313)
+++ xfce4-settings/trunk/xfce4-settings-helper/keyboard-shortcuts.c
2008-07-16 19:44:23 UTC (rev 27314)
@@ -76,7 +76,7 @@
const
GValue *value,
XfceKeyboardShortcutsHelper *helper);
static gboolean xfce_keyboard_shortcuts_helper_grab_shortcut
(XfceKeyboardShortcutsHelper *helper,
- const
char *shortcut,
+ const
gchar *shortcut,
gboolean grab);
static gboolean xfce_keyboard_shortcuts_helper_parse_shortcut
(XfceKeyboardShortcutsHelper *helper,
GdkDisplay *display,
@@ -93,9 +93,19 @@
gboolean grab);
static void xfce_keyboard_shortcuts_helper_handle_key_press
(XfceKeyboardShortcutsHelper *helper,
XKeyEvent *xevent);
+static void xfce_keyboard_shortcuts_helper_property_changed
(XfconfChannel *channel,
+ gchar
*property,
+ GValue
*value,
+
XfceKeyboardShortcutsHelper *helper);
+static gboolean xfce_keyboard_shortcuts_helper_extract_values
(XfceKeyboardShortcutsHelper *helper,
+ const
gchar *key,
+ const
GValue *value,
+ gchar
**shortcut,
+ gchar
**action);
+
struct _XfceKeyboardShortcutsHelperClass
{
GObjectClass __parent__;
@@ -192,6 +202,9 @@
}
xfce_keyboard_shortcuts_helper_add_filter (helper);
+
+ /* Be notified of property changes */
+ g_signal_connect (helper->channel, "property-changed", G_CALLBACK
(xfce_keyboard_shortcuts_helper_property_changed), helper);
}
@@ -316,48 +329,27 @@
const GValue
*value,
XfceKeyboardShortcutsHelper
*helper)
{
- const GPtrArray *array;
- const GValue *type_value;
- const GValue *action_value;
- const gchar *type;
- const gchar *action;
+ gchar *shortcut;
+ gchar *action;
g_return_if_fail (XFCE_IS_KEYBOARD_SHORTCUTS_HELPER (helper));
+ g_return_if_fail (G_IS_VALUE (value));
- /* MAke sure we only load shortcuts from string arrays */
- if (G_UNLIKELY (G_VALUE_TYPE (value) != dbus_g_type_get_collection
("GPtrArray", G_TYPE_VALUE)))
- return;
-
- /* Get the pointer array */
- array = g_value_get_boxed (value);
-
- /* Make sure the array has exactly two members */
- if (G_UNLIKELY (array->len != 2))
- return;
-
- /* Get GValues for the array members */
- type_value = g_ptr_array_index (array, 0);
- action_value = g_ptr_array_index (array, 1);
-
- /* Make sure both are string values */
- if (G_UNLIKELY (G_VALUE_TYPE (type_value) != G_TYPE_STRING || G_VALUE_TYPE
(action_value) != G_TYPE_STRING))
- return;
-
- /* Get shortcut type and action */
- type = g_value_get_string (type_value);
- action = g_value_get_string (action_value);
-
/* Only add shortcuts of type 'execute' */
- if (g_utf8_collate (type, "execute") == 0)
+ if (G_LIKELY (xfce_keyboard_shortcuts_helper_extract_values (helper, key,
value, &shortcut, &action)))
{
/* Establish passive grab on the shortcut and add it to the hash table */
- if (G_LIKELY (xfce_keyboard_shortcuts_helper_grab_shortcut (helper, key
+ 1, TRUE)))
+ if (G_LIKELY (xfce_keyboard_shortcuts_helper_grab_shortcut (helper,
shortcut, TRUE)))
{
/* Add shortcut -> action pair to the hash table */
- g_hash_table_insert (helper->shortcuts, g_strdup (key + 1), g_strdup
(action));
+ g_hash_table_insert (helper->shortcuts, g_strdup (shortcut),
g_strdup (action));
}
else
g_warning ("Failed to load shortcut '%s'", key + 1);
+
+ /* Free strings */
+ g_free (shortcut);
+ g_free (action);
}
}
@@ -545,3 +537,106 @@
/* Free accelerator string */
g_free (accelerator_name);
}
+
+
+
+static void
+xfce_keyboard_shortcuts_helper_property_changed (XfconfChannel
*channel,
+ gchar
*property,
+ GValue
*value,
+ XfceKeyboardShortcutsHelper
*helper)
+{
+ gchar *shortcut;
+ gchar *action;
+
+ g_return_if_fail (XFCE_IS_KEYBOARD_SHORTCUTS_HELPER (helper));
+ g_return_if_fail (XFCONF_IS_CHANNEL (channel));
+
+ /* Check whether the property was removed */
+ if (!G_IS_VALUE (value) || G_VALUE_TYPE (value) == G_TYPE_INVALID)
+ {
+ /* Remove shortcut and ungrab keys if we're monitoring it already */
+ if (G_LIKELY (g_hash_table_lookup (helper->shortcuts, property + 1)))
+ {
+ /* Remove shortcut from the hash table */
+ g_hash_table_remove (helper->shortcuts, property + 1);
+
+ /* Ungrab the shortcut */
+ xfce_keyboard_shortcuts_helper_grab_shortcut (helper, property + 1,
FALSE);
+ }
+ }
+ else
+ {
+ /* Try to read shortcut information from the GValue. If not, it's
probably an Xfwm4 shortcut */
+ if (G_LIKELY (xfce_keyboard_shortcuts_helper_extract_values (helper,
property, value, &shortcut, &action)))
+ {
+ /* Check whether the shortcut already exists */
+ if (g_hash_table_lookup (helper->shortcuts, shortcut))
+ {
+ /* Replace the current action. The key combination hasn't
changed so don't ungrab/grab */
+ g_hash_table_replace (helper->shortcuts, shortcut, g_strdup
(action));
+ }
+ else
+ {
+ /* Insert shortcut into the hash table */
+ g_hash_table_insert (helper->shortcuts, g_strdup (shortcut),
g_strdup (action));
+
+ /* Establish passive keyboard grab for the new shortcut */
+ xfce_keyboard_shortcuts_helper_grab_shortcut (helper, shortcut,
TRUE);
+ }
+
+ /* Free strings */
+ g_free (shortcut);
+ g_free (action);
+ }
+ }
+}
+
+
+
+static gboolean
+xfce_keyboard_shortcuts_helper_extract_values (XfceKeyboardShortcutsHelper
*helper,
+ const gchar
*key,
+ const GValue
*value,
+ gchar
**shortcut,
+ gchar
**action)
+{
+ const GPtrArray *array;
+ const GValue *type_value;
+ const GValue *action_value;
+ gboolean result = FALSE;
+
+ g_return_val_if_fail (XFCE_IS_KEYBOARD_SHORTCUTS_HELPER (helper), FALSE);
+ g_return_val_if_fail (G_IS_VALUE (value), FALSE);
+
+ /* Non-arrays will not be accepted */
+ if (G_UNLIKELY (G_VALUE_TYPE (value) != dbus_g_type_get_collection
("GPtrArray", G_TYPE_VALUE)))
+ return FALSE;
+
+ /* Get the pointer array */
+ array = g_value_get_boxed (value);
+
+ /* Make sure the array has exactly two members */
+ if (G_UNLIKELY (array->len != 2))
+ return FALSE;
+
+ /* Get GValues for the array members */
+ type_value = g_ptr_array_index (array, 0);
+ action_value = g_ptr_array_index (array, 1);
+
+ /* Make sure both are string values */
+ if (G_UNLIKELY (G_VALUE_TYPE (type_value) != G_TYPE_STRING || G_VALUE_TYPE
(action_value) != G_TYPE_STRING))
+ return FALSE;
+
+ /* Check whether the type is 'execute' */
+ if (G_LIKELY (g_utf8_collate (g_value_get_string (type_value), "execute") ==
0))
+ {
+ /* Get shortcut and action strings */
+ *shortcut = g_strdup (key + 1);
+ *action = g_strdup (g_value_get_string (action_value));
+
+ result = TRUE;
+ }
+
+ return result;
+}
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits