[mutter] keybindings: Simplify our keycode/mask pairs with MetaKeyDevirtCombo



commit 5bc2bcd109769578b7a3581a8a659537d9aac5ba
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Tue Jan 6 19:11:23 2015 -0800

    keybindings: Simplify our keycode/mask pairs with MetaKeyDevirtCombo

 src/core/keybindings.c |  121 ++++++++++++++++++++++++++---------------------
 1 files changed, 67 insertions(+), 54 deletions(-)
---
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 30e1789..5ea8376 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -164,8 +164,7 @@ meta_key_grab_free (MetaKeyGrab *grab)
 }
 
 static guint32
-key_binding_key (guint32 keycode,
-                 guint32 mask)
+key_combo_key (MetaKeyDevirtCombo *devirt_combo)
 {
   /* On X, keycodes are only 8 bits while libxkbcommon supports 32 bit
      keycodes, but since we're using the same XKB keymaps that X uses,
@@ -175,8 +174,8 @@ key_binding_key (guint32 keycode,
      can use a 32 bit integer to safely concatenate both keycode and
      mask and thus making it easy to use them as an index in a
      GHashTable. */
-  guint32 key = keycode & 0xffff;
-  return (key << 16) | (mask & 0xffff);
+  guint32 key = devirt_combo->keycode & 0xffff;
+  return (key << 16) | (devirt_combo->mask & 0xffff);
 }
 
 static void
@@ -552,7 +551,7 @@ index_binding (MetaKeyBindingManager *keys,
 {
   guint32 index_key;
 
-  index_key = key_binding_key (binding->devirt_combo.keycode, binding->devirt_combo.mask);
+  index_key = key_combo_key (&binding->devirt_combo);
   g_hash_table_replace (keys->key_bindings_index,
                         GINT_TO_POINTER (index_key), binding);
 }
@@ -701,14 +700,10 @@ grab_key_bindings (MetaDisplay *display)
 
 static MetaKeyBinding *
 get_keybinding (MetaKeyBindingManager *keys,
-                guint32                 keycode,
-                guint32                 mask)
+                MetaKeyDevirtCombo    *devirt_combo)
 {
   guint32 key;
-
-  mask = mask & 0xff & ~keys->ignored_modifier_mask;
-  key = key_binding_key (keycode, mask);
-
+  key = key_combo_key (devirt_combo);
   return g_hash_table_lookup (keys->key_bindings_index, GINT_TO_POINTER (key));
 }
 
@@ -827,26 +822,10 @@ meta_display_remove_keybinding (MetaDisplay *display,
   return TRUE;
 }
 
-/**
- * meta_display_get_keybinding_action:
- * @display: A #MetaDisplay
- * @keycode: Raw keycode
- * @mask: Event mask
- *
- * Get the keybinding action bound to @keycode. Builtin keybindings
- * have a fixed associated #MetaKeyBindingAction, for bindings added
- * dynamically the function will return the keybinding action
- * meta_display_add_keybinding() returns on registration.
- *
- * Returns: The action that should be taken for the given key, or
- * %META_KEYBINDING_ACTION_NONE.
- */
-guint
-meta_display_get_keybinding_action (MetaDisplay  *display,
-                                    unsigned int  keycode,
-                                    unsigned long mask)
+static guint
+get_keybinding_action (MetaKeyBindingManager *keys,
+                       MetaKeyDevirtCombo    *devirt_combo)
 {
-  MetaKeyBindingManager *keys = &display->key_binding_manager;
   MetaKeyBinding *binding;
 
   /* This is much more vague than the MetaDisplay::overlay-key signal,
@@ -855,11 +834,10 @@ meta_display_get_keybinding_action (MetaDisplay  *display,
    * of mutter keybindings while holding a grab, the overlay-key-only-pressed
    * tracking is left to the plugin here.
    */
-  if (keycode == (unsigned int)keys->overlay_key_devirt_combo.keycode)
+  if (devirt_combo->keycode == (unsigned int)keys->overlay_key_devirt_combo.keycode)
     return META_KEYBINDING_ACTION_OVERLAY_KEY;
 
-  binding = get_keybinding (keys, keycode, mask);
-
+  binding = get_keybinding (keys, devirt_combo);
   if (binding)
     {
       MetaKeyGrab *grab = g_hash_table_lookup (external_grabs, binding->name);
@@ -875,6 +853,41 @@ meta_display_get_keybinding_action (MetaDisplay  *display,
 }
 
 static void
+devirt_combo_from_event_params (MetaKeyDevirtCombo *devirt_combo,
+                                MetaKeyBindingManager *keys,
+                                unsigned int keycode,
+                                unsigned long mask)
+{
+  devirt_combo->keycode = keycode;
+  devirt_combo->mask = mask & 0xff & ~keys->ignored_modifier_mask;
+}
+
+/**
+ * meta_display_get_keybinding_action:
+ * @display: A #MetaDisplay
+ * @keycode: Raw keycode
+ * @mask: Event mask
+ *
+ * Get the keybinding action bound to @keycode. Builtin keybindings
+ * have a fixed associated #MetaKeyBindingAction, for bindings added
+ * dynamically the function will return the keybinding action
+ * meta_display_add_keybinding() returns on registration.
+ *
+ * Returns: The action that should be taken for the given key, or
+ * %META_KEYBINDING_ACTION_NONE.
+ */
+guint
+meta_display_get_keybinding_action (MetaDisplay  *display,
+                                    unsigned int  keycode,
+                                    unsigned long mask)
+{
+  MetaKeyBindingManager *keys = &display->key_binding_manager;
+  MetaKeyDevirtCombo devirt_combo;
+  devirt_combo_from_event_params (&devirt_combo, keys, keycode, mask);
+  return get_keybinding_action (keys, &devirt_combo);
+}
+
+static void
 on_keymap_changed (MetaBackend *backend,
                    gpointer     user_data)
 {
@@ -1381,9 +1394,8 @@ handle_external_grab (MetaDisplay     *display,
                       MetaKeyBinding  *binding,
                       gpointer         user_data)
 {
-  guint action = meta_display_get_keybinding_action (display,
-                                                     binding->devirt_combo.keycode,
-                                                     binding->devirt_combo.mask);
+  MetaKeyBindingManager *keys = &display->key_binding_manager;
+  guint action = get_keybinding_action (keys, &binding->devirt_combo);
   meta_display_accelerator_activate (display, action, event);
 }
 
@@ -1413,7 +1425,7 @@ meta_display_grab_accelerator (MetaDisplay *display,
   if (devirt_combo.keycode == 0)
     return META_KEYBINDING_ACTION_NONE;
 
-  if (get_keybinding (keys, devirt_combo.keycode, devirt_combo.mask))
+  if (get_keybinding (keys, &devirt_combo))
     return META_KEYBINDING_ACTION_NONE;
 
   if (META_IS_BACKEND_X11 (backend))
@@ -1447,8 +1459,7 @@ meta_display_ungrab_accelerator (MetaDisplay *display,
   MetaKeyBinding *binding;
   MetaKeyGrab *grab;
   char *key;
-  guint mask = 0;
-  guint keycode = 0;
+  MetaKeyDevirtCombo devirt_combo;
 
   g_return_val_if_fail (action != META_KEYBINDING_ACTION_NONE, FALSE);
 
@@ -1457,10 +1468,8 @@ meta_display_ungrab_accelerator (MetaDisplay *display,
   if (!grab)
     return FALSE;
 
-  devirtualize_modifiers (keys, grab->combo.modifiers, &mask);
-  keycode = get_first_keycode_for_keysym (keys, grab->combo.keysym);
-
-  binding = get_keybinding (keys, keycode, mask);
+  devirtualize_key_combo (keys, &grab->combo, &devirt_combo);
+  binding = get_keybinding (keys, &devirt_combo);
   if (binding)
     {
       guint32 index_key;
@@ -1468,7 +1477,7 @@ meta_display_ungrab_accelerator (MetaDisplay *display,
       if (META_IS_BACKEND_X11 (backend))
         meta_change_keygrab (keys, display->screen->xroot, FALSE, &binding->devirt_combo);
 
-      index_key = key_binding_key (binding->devirt_combo.keycode, binding->devirt_combo.mask);
+      index_key = key_combo_key (&binding->devirt_combo);
       g_hash_table_remove (keys->key_bindings_index, GINT_TO_POINTER (index_key));
 
       g_hash_table_remove (keys->key_bindings, binding);
@@ -1684,15 +1693,19 @@ process_event (MetaDisplay          *display,
                ClutterKeyEvent      *event)
 {
   MetaKeyBindingManager *keys = &display->key_binding_manager;
+  MetaKeyDevirtCombo devirt_combo;
   MetaKeyBinding *binding;
 
   /* we used to have release-based bindings but no longer. */
   if (event->type == CLUTTER_KEY_RELEASE)
     return FALSE;
 
-  binding = get_keybinding (keys,
-                            event->hardware_keycode,
-                            event->modifier_state);
+  devirt_combo_from_event_params (&devirt_combo, keys,
+                                  event->hardware_keycode,
+                                  event->modifier_state);
+
+  binding = get_keybinding (keys, &devirt_combo);
+
   if (!binding ||
       (!window && binding->flags & META_KEY_BINDING_PER_WINDOW))
     goto not_found;
@@ -1796,7 +1809,7 @@ process_overlay_key (MetaDisplay *display,
                            clutter_input_device_get_device_id (event->device),
                            XIAsyncDevice, event->time);
 
-          binding = get_keybinding (keys, keys->overlay_key_devirt_combo.keycode, 0);
+          binding = get_keybinding (keys, &keys->overlay_key_devirt_combo);
           if (binding &&
               meta_compositor_filter_keybinding (display->compositor, binding))
             return TRUE;
@@ -1848,8 +1861,7 @@ process_iso_next_group (MetaDisplay *display,
 {
   MetaKeyBindingManager *keys = &display->key_binding_manager;
   gboolean activate;
-  guint32 keycode;
-  guint32 modifiers;
+  MetaKeyDevirtCombo devirt_combo;
   int i;
 
   if (event->type == CLUTTER_KEY_RELEASE)
@@ -1857,13 +1869,14 @@ process_iso_next_group (MetaDisplay *display,
 
   activate = FALSE;
 
-  keycode = event->hardware_keycode;
-  modifiers = event->modifier_state & 0xff & ~keys->ignored_modifier_mask;
+  devirt_combo_from_event_params (&devirt_combo, keys,
+                                  event->hardware_keycode,
+                                  event->modifier_state);
 
   for (i = 0; i < keys->n_iso_next_group_combos; ++i)
     {
-      if (keycode == keys->iso_next_group_combos[i].keycode &&
-          modifiers == keys->iso_next_group_combos[i].mask)
+      if (devirt_combo.keycode == keys->iso_next_group_combos[i].keycode &&
+          devirt_combo.mask == keys->iso_next_group_combos[i].mask)
         {
           /* If the signal handler returns TRUE the keyboard will
              remain frozen. It's the signal handler's responsibility


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]