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
This commit is contained in:
parent
a8eb33f6fd
commit
f86032d700
@ -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,11 +1862,7 @@ 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++)
|
||||
@ -1903,8 +1900,6 @@ update_binding (MetaKeyPref *binding,
|
||||
continue;
|
||||
}
|
||||
|
||||
changed = TRUE;
|
||||
|
||||
combo = g_malloc0 (sizeof (MetaKeyCombo));
|
||||
combo->keysym = keysym;
|
||||
combo->keycode = keycode;
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user