[mutter] keybindings: Keep virtual modifier masks around



commit 82a247ccf5b7c3cc78127374a8e9bc15d6deab67
Author: Rui Matos <tiagomatos gmail com>
Date:   Tue Nov 3 17:52:10 2015 +0100

    keybindings: Keep virtual modifier masks around
    
    Besides the resolved real modifier masks, having the virtual masks
    around will be useful too.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=748526

 src/core/keybindings-private.h |    3 +++
 src/core/keybindings.c         |   17 ++++++++++++-----
 2 files changed, 15 insertions(+), 5 deletions(-)
---
diff --git a/src/core/keybindings-private.h b/src/core/keybindings-private.h
index 793966e..5a17c99 100644
--- a/src/core/keybindings-private.h
+++ b/src/core/keybindings-private.h
@@ -94,8 +94,11 @@ typedef struct
   GHashTable     *key_bindings_index;
   xkb_mod_mask_t ignored_modifier_mask;
   xkb_mod_mask_t hyper_mask;
+  xkb_mod_mask_t virtual_hyper_mask;
   xkb_mod_mask_t super_mask;
+  xkb_mod_mask_t virtual_super_mask;
   xkb_mod_mask_t meta_mask;
+  xkb_mod_mask_t virtual_meta_mask;
   MetaKeyCombo overlay_key_combo;
   MetaResolvedKeyCombo overlay_resolved_key_combo;
   gboolean overlay_key_only_pressed;
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index a5cb0d7..2a8063e 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -185,16 +185,18 @@ reload_modmap (MetaKeyBindingManager *keys)
   struct xkb_keymap *keymap = meta_backend_get_keymap (backend);
   struct xkb_state *scratch_state;
   xkb_mod_mask_t scroll_lock_mask;
+  xkb_mod_mask_t dummy_mask;
 
   /* Modifiers to find. */
   struct {
     const char *name;
     xkb_mod_mask_t *mask_p;
+    xkb_mod_mask_t *virtual_mask_p;
   } mods[] = {
-    { "ScrollLock", &scroll_lock_mask },
-    { "Meta",       &keys->meta_mask },
-    { "Hyper",      &keys->hyper_mask },
-    { "Super",      &keys->super_mask },
+    { "ScrollLock", &scroll_lock_mask, &dummy_mask },
+    { "Meta",       &keys->meta_mask,  &keys->virtual_meta_mask },
+    { "Hyper",      &keys->hyper_mask, &keys->virtual_hyper_mask },
+    { "Super",      &keys->super_mask, &keys->virtual_super_mask },
   };
 
   scratch_state = xkb_state_new (keymap);
@@ -203,6 +205,7 @@ reload_modmap (MetaKeyBindingManager *keys)
   for (i = 0; i < G_N_ELEMENTS (mods); i++)
     {
       xkb_mod_mask_t *mask_p = mods[i].mask_p;
+      xkb_mod_mask_t *virtual_mask_p = mods[i].virtual_mask_p;
       xkb_mod_index_t idx = xkb_keymap_mod_get_index (keymap, mods[i].name);
 
       if (idx != XKB_MOD_INVALID)
@@ -210,9 +213,13 @@ reload_modmap (MetaKeyBindingManager *keys)
           xkb_mod_mask_t vmodmask = (1 << idx);
           xkb_state_update_mask (scratch_state, vmodmask, 0, 0, 0, 0, 0);
           *mask_p = xkb_state_serialize_mods (scratch_state, XKB_STATE_MODS_DEPRESSED) & ~vmodmask;
+          *virtual_mask_p = vmodmask;
         }
       else
-        *mask_p = 0;
+        {
+          *mask_p = 0;
+          *virtual_mask_p = 0;
+        }
     }
 
   xkb_state_unref (scratch_state);


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