summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRui Matos <tiagomatos@gmail.com>2013-03-31 20:18:54 +0200
committerRui Matos <tiagomatos@gmail.com>2013-05-27 13:55:33 +0200
commitf86032d700cbe1e14dd952ccb8610fb984722ae5 (patch)
tree2e6646ea4915a65ad4bc2b6f43bd67d6a7bce626
parenta8eb33f6fd1e15b3210c5992e64e90ebd7c53456 (diff)
downloadmutter-f86032d700cbe1e14dd952ccb8610fb984722ae5.tar.gz
prefs: Fix binding remaining grabbed after clearing all strokes
If a binding is updated with a clear set of strokes (effectively disabling it) we aren't signaling that the binding changed and thus the previous strokes will continue to be grabbed. This fixes that and tries to do a better effort at checking if the binding changed or not. https://bugzilla.gnome.org/show_bug.cgi?id=697000
-rw-r--r--src/core/prefs.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/src/core/prefs.c b/src/core/prefs.c
index b05ae7f2a..e95f91267 100644
--- a/src/core/prefs.c
+++ b/src/core/prefs.c
@@ -1850,10 +1850,11 @@ static gboolean
update_binding (MetaKeyPref *binding,
gchar **strokes)
{
+ GSList *old_bindings, *a, *b;
+ gboolean changed;
unsigned int keysym;
unsigned int keycode;
MetaVirtualModifier mods;
- gboolean changed = FALSE;
MetaKeyCombo *combo;
int i;
@@ -1861,13 +1862,9 @@ update_binding (MetaKeyPref *binding,
"Binding \"%s\" has new GSettings value\n",
binding->name);
- /* Okay, so, we're about to provide a new list of key combos for this
- * action. Delete any pre-existing list.
- */
- g_slist_foreach (binding->bindings, (GFunc) g_free, NULL);
- g_slist_free (binding->bindings);
+ old_bindings = binding->bindings;
binding->bindings = NULL;
-
+
for (i = 0; strokes && strokes[i]; i++)
{
keysym = 0;
@@ -1902,8 +1899,6 @@ update_binding (MetaKeyPref *binding,
* Changing the key in response to a modification could lead to cyclic calls. */
continue;
}
-
- changed = TRUE;
combo = g_malloc0 (sizeof (MetaKeyCombo));
combo->keysym = keysym;
@@ -1918,6 +1913,34 @@ update_binding (MetaKeyPref *binding,
binding->bindings = g_slist_reverse (binding->bindings);
+ a = old_bindings;
+ b = binding->bindings;
+ while (TRUE)
+ {
+ if ((!a && b) || (a && !b))
+ {
+ changed = TRUE;
+ break;
+ }
+ else if (!a && !b)
+ {
+ changed = FALSE;
+ break;
+ }
+ else if (memcmp (a->data, b->data, sizeof (MetaKeyCombo)) != 0)
+ {
+ changed = TRUE;
+ break;
+ }
+ else
+ {
+ a = a->next;
+ b = b->next;
+ }
+ }
+
+ g_slist_free_full (old_bindings, g_free);
+
return changed;
}