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     }