From ba9a8bc8ff6b5ea0e8481c4a408a48aa06384ea6 Mon Sep 17 00:00:00 2001 From: Christophe Fergeau Date: Sat, 28 Jun 2014 00:21:01 +0200 Subject: [PATCH] keyboard: Add support for hidden keybinding XML data If a KeyListEntry has a hidden="true" attribute, then the corresponding binding information will be loaded as usual, but the binding won't be displayed in the user interface. This is useful as the keyboard panel will take into account hidden keybindings when detecting conflicting shortcuts, or to suggest to set a reverse shortcut. For now, this will be used for the various reverse mutter keybindings ({switch,cycle}.*-backward) as they should not be shown in the UI, but we still want the keyboard panel to know about them. https://bugzilla.gnome.org/show_bug.cgi?id=731618 --- panels/keyboard/cc-keyboard-item.c | 15 +++++++++++++++ panels/keyboard/cc-keyboard-item.h | 3 +++ panels/keyboard/keyboard-shortcuts.c | 26 ++++++++++++++++++-------- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/panels/keyboard/cc-keyboard-item.c b/panels/keyboard/cc-keyboard-item.c index 4e3817ed2..fc1028eb8 100644 --- a/panels/keyboard/cc-keyboard-item.c +++ b/panels/keyboard/cc-keyboard-item.c @@ -40,6 +40,7 @@ struct CcKeyboardItemPrivate /* internal */ CcKeyboardItem *reverse_item; gboolean is_reversed; + gboolean hidden; }; enum { @@ -495,6 +496,20 @@ cc_keyboard_item_get_reverse_item (CcKeyboardItem *item) { return item->priv->reverse_item; } + + +void +cc_keyboard_item_set_hidden (CcKeyboardItem *item, gboolean hidden) +{ + item->priv->hidden = !!hidden; +} + + +gboolean +cc_keyboard_item_is_hidden (CcKeyboardItem *item) +{ + return item->priv->hidden; +} /* * vim: sw=2 ts=8 cindent noai bs=2 */ diff --git a/panels/keyboard/cc-keyboard-item.h b/panels/keyboard/cc-keyboard-item.h index 1e8eb56d6..4006f484b 100644 --- a/panels/keyboard/cc-keyboard-item.h +++ b/panels/keyboard/cc-keyboard-item.h @@ -107,6 +107,9 @@ void cc_keyboard_item_add_reverse_item (CcKeyboardItem *item, gboolean is_reversed); CcKeyboardItem * cc_keyboard_item_get_reverse_item (CcKeyboardItem *item); +void cc_keyboard_item_set_hidden (CcKeyboardItem *item, + gboolean hidden); +gboolean cc_keyboard_item_is_hidden (CcKeyboardItem *item); G_END_DECLS diff --git a/panels/keyboard/keyboard-shortcuts.c b/panels/keyboard/keyboard-shortcuts.c index 5b679883a..7b37932b5 100644 --- a/panels/keyboard/keyboard-shortcuts.c +++ b/panels/keyboard/keyboard-shortcuts.c @@ -62,6 +62,7 @@ typedef struct char *name; /* GSettings schema path, or GSettings key name depending on type */ char *reverse_entry; gboolean is_reversed; + gboolean hidden; } KeyListEntry; typedef enum @@ -278,6 +279,7 @@ append_section (GtkBuilder *builder, continue; } + cc_keyboard_item_set_hidden (item, keys_list[i].hidden); item->model = shortcut_model; item->group = group; @@ -339,7 +341,7 @@ parse_start_tag (GMarkupParseContext *ctx, KeyList *keylist = (KeyList *) user_data; KeyListEntry key = { 0, }; const char *name, *schema, *description, *package, *context, *orig_description, *reverse_entry; - gboolean is_reversed; + gboolean is_reversed, hidden; name = NULL; schema = NULL; @@ -425,6 +427,7 @@ parse_start_tag (GMarkupParseContext *ctx, orig_description = NULL; reverse_entry = NULL; is_reversed = FALSE; + hidden = FALSE; while (*attr_names && *attr_values) { @@ -449,7 +452,10 @@ parse_start_tag (GMarkupParseContext *ctx, } else if (g_str_equal (*attr_names, "is-reversed")) { if (g_str_equal (*attr_values, "true")) is_reversed = TRUE; - } + } else if (g_str_equal (*attr_names, "hidden")) { + if (g_str_equal (*attr_values, "true")) + hidden = TRUE; + } ++attr_names; ++attr_values; @@ -476,6 +482,7 @@ parse_start_tag (GMarkupParseContext *ctx, key.schema = schema ? g_strdup (schema) : g_strdup (keylist->schema); key.reverse_entry = g_strdup (reverse_entry); key.is_reversed = is_reversed; + key.hidden = hidden; g_array_append_val (keylist->entries, key); } @@ -943,12 +950,15 @@ section_selection_changed (GtkTreeSelection *selection, gpointer data) GtkTreeIter new_row; CcKeyboardItem *item = g_ptr_array_index (keys, i); - gtk_list_store_append (GTK_LIST_STORE (shortcut_model), &new_row); - gtk_list_store_set (GTK_LIST_STORE (shortcut_model), &new_row, - DETAIL_DESCRIPTION_COLUMN, item->description, - DETAIL_KEYENTRY_COLUMN, item, - DETAIL_TYPE_COLUMN, SHORTCUT_TYPE_KEY_ENTRY, - -1); + if (!cc_keyboard_item_is_hidden (item)) + { + gtk_list_store_append (GTK_LIST_STORE (shortcut_model), &new_row); + gtk_list_store_set (GTK_LIST_STORE (shortcut_model), &new_row, + DETAIL_DESCRIPTION_COLUMN, item->description, + DETAIL_KEYENTRY_COLUMN, item, + DETAIL_TYPE_COLUMN, SHORTCUT_TYPE_KEY_ENTRY, + -1); + } } if (g_str_equal (id, "Typing"))