commit a4ca660

Michael Forney  ·  2013-11-24 10:19:49 +0000 UTC
parent 1f848d1
Compute modifier state in keyboard.c
3 files changed,  +20, -25
+6, -24
 1@@ -52,31 +52,13 @@ static bool handle_key(struct swc_keyboard * keyboard, uint32_t time,
 2 
 3         wl_array_for_each(binding, &key_bindings)
 4         {
 5-            if (binding->value == keysym)
 6+            if (binding->value == keysym
 7+                && (binding->modifiers == keyboard->modifiers
 8+                    || binding->modifiers == SWC_MOD_ANY))
 9             {
10-                xkb_mod_mask_t mod_mask;
11-                uint32_t modifiers = 0;
12-                mod_mask = xkb_state_serialize_mods(keyboard->xkb.state,
13-                                                    XKB_STATE_MODS_EFFECTIVE);
14-                mod_mask = xkb_state_mod_mask_remove_consumed(keyboard->xkb.state, key + 8,
15-                                                              mod_mask);
16-
17-                if (mod_mask & (1 << keyboard->xkb.indices.ctrl))
18-                    modifiers |= SWC_MOD_CTRL;
19-                if (mod_mask & (1 << keyboard->xkb.indices.alt))
20-                    modifiers |= SWC_MOD_ALT;
21-                if (mod_mask & (1 << keyboard->xkb.indices.super))
22-                    modifiers |= SWC_MOD_LOGO;
23-                if (mod_mask & (1 << keyboard->xkb.indices.shift))
24-                    modifiers |= SWC_MOD_SHIFT;
25-
26-                if (binding->modifiers == SWC_MOD_ANY
27-                    || binding->modifiers == modifiers)
28-                {
29-                    binding->handler(time, keysym, binding->data);
30-                    printf("\t-> handled\n");
31-                    return true;
32-                }
33+                binding->handler(time, keysym, binding->data);
34+                printf("\t-> handled\n");
35+                return true;
36             }
37         }
38     }
+12, -1
 1@@ -1,3 +1,4 @@
 2+#include "swc.h"
 3 #include "keyboard.h"
 4 #include "util.h"
 5 
 6@@ -47,7 +48,7 @@ bool swc_keyboard_initialize(struct swc_keyboard * keyboard)
 7         goto error1;
 8 
 9     wl_array_init(&keyboard->keys);
10-
11+    keyboard->modifiers = 0;
12     keyboard->focus_handler.enter = &enter;
13     keyboard->focus_handler.leave = &leave;
14 
15@@ -176,6 +177,16 @@ void swc_keyboard_handle_key(struct swc_keyboard * keyboard, uint32_t time,
16         }
17     }
18 
19+    keyboard->modifiers = 0;
20+    if (mods_active & (1 << keyboard->xkb.indices.ctrl))
21+        keyboard->modifiers |= SWC_MOD_CTRL;
22+    if (mods_active & (1 << keyboard->xkb.indices.alt))
23+        keyboard->modifiers |= SWC_MOD_ALT;
24+    if (mods_active & (1 << keyboard->xkb.indices.super))
25+        keyboard->modifiers |= SWC_MOD_LOGO;
26+    if (mods_active & (1 << keyboard->xkb.indices.shift))
27+        keyboard->modifiers |= SWC_MOD_SHIFT;
28+
29     keyboard->mods_depressed = mods_depressed;
30     keyboard->mods_latched = mods_latched;
31     keyboard->mods_locked = mods_locked;
+2, -0
1@@ -34,6 +34,8 @@ struct swc_keyboard
2     uint32_t mods_latched;
3     uint32_t mods_locked;
4     uint32_t group;
5+
6+    uint32_t modifiers;
7 };
8 
9 bool swc_keyboard_initialize(struct swc_keyboard * keyboard);