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);