commit 58622c7
Michael Forney
·
2013-11-24 10:25:41 +0000 UTC
parent 39fe549
binding: Use the first shift-level for matching keysyms
1 files changed,
+22,
-10
+22,
-10
1@@ -42,23 +42,35 @@ static bool handle_key(struct swc_keyboard * keyboard, uint32_t time,
2 uint32_t key, uint32_t state)
3 {
4 struct binding * binding;
5- char keysym_name[64];
6
7 if (state == WL_KEYBOARD_KEY_STATE_PRESSED)
8 {
9- xkb_keysym_t keysym;
10+ xkb_layout_index_t layout;
11+ const xkb_keysym_t * keysyms;
12+ int num_keysyms;
13
14- keysym = xkb_state_key_get_one_sym(keyboard->xkb.state, key + 8);
15+ /* XKB key codes are offset by 8 */
16+ key += 8;
17
18- wl_array_for_each(binding, &key_bindings)
19+ layout = xkb_state_key_get_layout(keyboard->xkb.state, key);
20+
21+ /* XXX: Maybe someone might want to register a key binding for a
22+ * keysym with a different shift-level? */
23+ num_keysyms = xkb_keymap_key_get_syms_by_level
24+ (keyboard->xkb.keymap.map, key, layout, 0, &keysyms);
25+
26+ if (num_keysyms == 1)
27 {
28- if (binding->value == keysym
29- && (binding->modifiers == keyboard->modifiers
30- || binding->modifiers == SWC_MOD_ANY))
31+ wl_array_for_each(binding, &key_bindings)
32 {
33- binding->handler(time, keysym, binding->data);
34- printf("\t-> handled\n");
35- return true;
36+ if (binding->value == keysyms[0]
37+ && (binding->modifiers == keyboard->modifiers
38+ || binding->modifiers == SWC_MOD_ANY))
39+ {
40+ binding->handler(time, keysyms[0], binding->data);
41+ printf("\t-> handled\n");
42+ return true;
43+ }
44 }
45 }
46 }