summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--panels/keyboard/cc-keyboard-item.c60
-rw-r--r--panels/keyboard/cc-keyboard-item.h2
2 files changed, 62 insertions, 0 deletions
diff --git a/panels/keyboard/cc-keyboard-item.c b/panels/keyboard/cc-keyboard-item.c
index 0810c7bd6..f68d64a13 100644
--- a/panels/keyboard/cc-keyboard-item.c
+++ b/panels/keyboard/cc-keyboard-item.c
@@ -371,6 +371,8 @@ cc_keyboard_item_finalize (GObject *object)
g_free (item->command);
g_free (item->schema);
g_free (item->key);
+ g_list_free_full (item->key_combos, g_free);
+ g_list_free_full (item->default_combos, g_free);
G_OBJECT_CLASS (cc_keyboard_item_parent_class)->finalize (object);
}
@@ -387,6 +389,52 @@ cc_keyboard_item_new (CcKeyboardItemType type)
return CC_KEYBOARD_ITEM (object);
}
+static GList *
+variant_get_key_combos (GVariant *variant)
+{
+ GList *combos = NULL;
+ char **bindings = NULL, **str;
+
+ if (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING))
+ {
+ bindings = g_malloc0_n (2, sizeof(char *));
+ bindings[0] = g_variant_dup_string (variant, NULL);
+ }
+ else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING_ARRAY))
+ {
+ bindings = g_variant_dup_strv (variant, NULL);
+ }
+
+ for (str = bindings; *str; str++)
+ {
+ CcKeyCombo *combo = g_new (CcKeyCombo, 1);
+
+ binding_from_string (*str, combo);
+ combos = g_list_prepend (combos, combo);
+ }
+ g_strfreev (bindings);
+
+ return g_list_reverse (combos);
+}
+
+static GList *
+settings_get_key_combos (GSettings *settings,
+ const char *key,
+ gboolean use_default)
+{
+ GList *key_combos;
+ GVariant *variant;
+
+ if (use_default)
+ variant = g_settings_get_default_value (settings, key);
+ else
+ variant = g_settings_get_value (settings, key);
+ key_combos = variant_get_key_combos (variant);
+ g_variant_unref (variant);
+
+ return key_combos;
+}
+
/* wrapper around g_settings_get_str[ing|v] */
static char *
settings_get_binding (GSettings *settings,
@@ -418,6 +466,9 @@ binding_changed (GSettings *settings,
{
char *value;
+ g_list_free_full (item->key_combos, g_free);
+ item->key_combos = settings_get_key_combos (item->settings, item->key, FALSE);
+
value = settings_get_binding (item->settings, item->key);
item->editable = g_settings_is_writable (item->settings, item->key);
_set_binding (item, value, FALSE);
@@ -450,6 +501,9 @@ cc_keyboard_item_load_from_gsettings_path (CcKeyboardItem *item,
g_settings_bind (item->settings, "command",
G_OBJECT (item), "command", G_SETTINGS_BIND_DEFAULT);
+ g_list_free_full (item->key_combos, g_free);
+ item->key_combos = settings_get_key_combos (item->settings, item->key, FALSE);
+
g_free (item->priv->binding);
item->priv->binding = settings_get_binding (item->settings, item->key);
binding_from_string (item->priv->binding, item->primary_combo);
@@ -477,6 +531,12 @@ cc_keyboard_item_load_from_gsettings (CcKeyboardItem *item,
item->editable = g_settings_is_writable (item->settings, item->key);
binding_from_string (item->priv->binding, item->primary_combo);
+ g_list_free_full (item->key_combos, g_free);
+ item->key_combos = settings_get_key_combos (item->settings, item->key, FALSE);
+
+ g_list_free_full (item->default_combos, g_free);
+ item->default_combos = settings_get_key_combos (item->settings, item->key, TRUE);
+
signal_name = g_strdup_printf ("changed::%s", item->key);
g_signal_connect (G_OBJECT (item->settings), signal_name,
G_CALLBACK (binding_changed), item);
diff --git a/panels/keyboard/cc-keyboard-item.h b/panels/keyboard/cc-keyboard-item.h
index 22ffd1ba2..755d46dfa 100644
--- a/panels/keyboard/cc-keyboard-item.h
+++ b/panels/keyboard/cc-keyboard-item.h
@@ -69,6 +69,8 @@ typedef struct
GtkTreeModel *model;
char *description;
gboolean editable;
+ GList *key_combos;
+ GList *default_combos;
/* GSettings path */
char *gsettings_path;