summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRui Matos <tiagomatos@gmail.com>2014-03-03 19:33:08 +0100
committerRui Matos <tiagomatos@gmail.com>2014-03-04 14:04:26 +0100
commit266ac00e566c5aa39b96267920ba7477c67f58cd (patch)
treee841aed2bf565b521e0be0631627644a29fc2a46
parent2b3fc741fb12f6db4386d76046853deba3c5b0aa (diff)
downloadmutter-266ac00e566c5aa39b96267920ba7477c67f58cd.tar.gz
keybindings: Use display_get_keybinding() instead of looping explicitly
Instead of looping over an array of keybindings to find the correct binding, just use display_get_keybinding(). In the next commit, we'll change the array to be a hash map, so this helps the patch be cleaner. https://bugzilla.gnome.org/show_bug.cgi?id=725588
-rw-r--r--src/core/keybindings.c118
1 files changed, 56 insertions, 62 deletions
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 1394ae664..0b5b63896 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -754,6 +754,8 @@ display_get_keybinding (MetaDisplay *display,
{
int i;
+ mask = mask & 0xff & ~display->ignored_modifier_mask;
+
i = display->n_key_bindings - 1;
while (i >= 0)
{
@@ -917,7 +919,6 @@ meta_display_get_keybinding_action (MetaDisplay *display,
if (keycode == (unsigned int)display->overlay_key_combo.keycode)
return META_KEYBINDING_ACTION_OVERLAY_KEY;
- mask = mask & 0xff & ~display->ignored_modifier_mask;
binding = display_get_keybinding (display, keycode, mask);
if (binding)
@@ -1301,7 +1302,6 @@ meta_display_grab_accelerator (MetaDisplay *display,
guint mask = 0;
MetaVirtualModifier modifiers = 0;
GSList *l;
- int i;
if (!meta_ui_parse_accelerator (accelerator, &keysym, &keycode, &modifiers))
{
@@ -1318,10 +1318,8 @@ meta_display_grab_accelerator (MetaDisplay *display,
if (keycode == 0)
return META_KEYBINDING_ACTION_NONE;
- for (i = 0; i < display->n_key_bindings; i++)
- if (display->key_bindings[i].keycode == keycode &&
- display->key_bindings[i].mask == mask)
- return META_KEYBINDING_ACTION_NONE;
+ if (display_get_keybinding (display, keycode, mask))
+ return META_KEYBINDING_ACTION_NONE;
for (l = display->screens; l; l = l->next)
{
@@ -1359,9 +1357,9 @@ gboolean
meta_display_ungrab_accelerator (MetaDisplay *display,
guint action)
{
+ MetaKeyBinding *binding;
MetaKeyGrab *grab;
char *key;
- int i;
g_return_val_if_fail (action != META_KEYBINDING_ACTION_NONE, FALSE);
@@ -1370,27 +1368,26 @@ meta_display_ungrab_accelerator (MetaDisplay *display,
if (!grab)
return FALSE;
- for (i = 0; i < display->n_key_bindings; i++)
- if (display->key_bindings[i].keysym == grab->combo->keysym &&
- display->key_bindings[i].keycode == grab->combo->keycode &&
- display->key_bindings[i].modifiers == grab->combo->modifiers)
- {
- GSList *l;
- for (l = display->screens; l; l = l->next)
- {
- MetaScreen *screen = l->data;
- meta_change_keygrab (display, screen->xroot, FALSE,
- display->key_bindings[i].keysym,
- display->key_bindings[i].keycode,
- display->key_bindings[i].mask);
- }
-
- display->key_bindings[i].keysym = 0;
- display->key_bindings[i].keycode = 0;
- display->key_bindings[i].modifiers = 0;
- display->key_bindings[i].mask = 0;
- break;
- }
+ binding = display_get_keybinding (display,
+ grab->combo->keycode,
+ grab->combo->modifiers);
+ if (binding)
+ {
+ GSList *l;
+ for (l = display->screens; l; l = l->next)
+ {
+ MetaScreen *screen = l->data;
+ meta_change_keygrab (display, screen->xroot, FALSE,
+ binding->keysym,
+ binding->keycode,
+ binding->mask);
+ }
+
+ binding->keysym = 0;
+ binding->keycode = 0;
+ binding->modifiers = 0;
+ binding->mask = 0;
+ }
g_hash_table_remove (external_grabs, key);
g_free (key);
@@ -1673,7 +1670,7 @@ process_event (MetaKeyBinding *bindings,
XIDeviceEvent *event,
gboolean on_window)
{
- int i;
+ MetaKeyBinding *binding;
/* we used to have release-based bindings but no longer. */
if (event->evtype == XI_KeyRelease)
@@ -1683,46 +1680,43 @@ process_event (MetaKeyBinding *bindings,
* TODO: This would be better done with a hash table;
* it doesn't suit to use O(n) for such a common operation.
*/
- for (i=0; i<n_bindings; i++)
- {
- MetaKeyHandler *handler = bindings[i].handler;
+ binding = display_get_keybinding (display,
+ event->detail,
+ event->mods.effective);
+ if (!binding ||
+ (!on_window && binding->flags & META_KEY_BINDING_PER_WINDOW) ||
+ meta_compositor_filter_keybinding (display->compositor, screen, binding))
+ goto not_found;
- if ((!on_window && handler->flags & META_KEY_BINDING_PER_WINDOW) ||
- bindings[i].keycode != event->detail ||
- ((event->mods.effective & 0xff & ~(display->ignored_modifier_mask)) !=
- bindings[i].mask) ||
- meta_compositor_filter_keybinding (display->compositor, screen, &bindings[i]))
- continue;
-
- /*
- * window must be non-NULL for on_window to be true,
- * and so also window must be non-NULL if we get here and
- * this is a META_KEY_BINDING_PER_WINDOW binding.
- */
+ /*
+ * window must be non-NULL for on_window to be true,
+ * and so also window must be non-NULL if we get here and
+ * this is a META_KEY_BINDING_PER_WINDOW binding.
+ */
- meta_topic (META_DEBUG_KEYBINDINGS,
- "Binding keycode 0x%x mask 0x%x matches event 0x%x state 0x%x\n",
- bindings[i].keycode, bindings[i].mask,
- event->detail, event->mods.effective);
+ meta_topic (META_DEBUG_KEYBINDINGS,
+ "Binding keycode 0x%x mask 0x%x matches event 0x%x state 0x%x\n",
+ binding->keycode, binding->mask,
+ event->detail, event->mods.effective);
- if (handler == NULL)
- meta_bug ("Binding %s has no handler\n", bindings[i].name);
- else
- meta_topic (META_DEBUG_KEYBINDINGS,
- "Running handler for %s\n",
- bindings[i].name);
+ if (binding->handler == NULL)
+ meta_bug ("Binding %s has no handler\n", binding->name);
+ else
+ meta_topic (META_DEBUG_KEYBINDINGS,
+ "Running handler for %s\n",
+ binding->name);
- /* Global keybindings count as a let-the-terminal-lose-focus
- * due to new window mapping until the user starts
- * interacting with the terminal again.
- */
- display->allow_terminal_deactivation = TRUE;
+ /* Global keybindings count as a let-the-terminal-lose-focus
+ * due to new window mapping until the user starts
+ * interacting with the terminal again.
+ */
+ display->allow_terminal_deactivation = TRUE;
- invoke_handler (display, screen, handler, window, event, &bindings[i]);
+ invoke_handler (display, screen, binding->handler, window, event, binding);
- return TRUE;
- }
+ return TRUE;
+ not_found:
meta_topic (META_DEBUG_KEYBINDINGS,
"No handler found for this event in this binding table\n");
return FALSE;