commit 99d5aef

Michael Forney  ·  2014-01-21 04:41:29 +0000 UTC
parent 5f7077b
bindings: Check for bindings using both current shift-level and first shift-level

This way, a binding such as XKB_KEY_XF86Switch_VT_1 (which relies on the
current shift level), and bindings such as Ctrl-Shift-2 or Ctrl-Alt-F1
all work correctly.
1 files changed,  +30, -22
+30, -22
 1@@ -41,38 +41,46 @@ static struct
 2     struct wl_array keys;
 3 } bindings;
 4 
 5-static bool handle_key(struct swc_keyboard * keyboard, uint32_t time,
 6-                       uint32_t key, uint32_t state)
 7+static bool handle_keysym(xkb_keysym_t keysym,
 8+                          uint32_t modifiers, uint32_t time)
 9 {
10     struct binding * binding;
11 
12+    wl_array_for_each(binding, &bindings.keys)
13+    {
14+        if (binding->value == keysym
15+            && (binding->modifiers == modifiers
16+                || binding->modifiers == SWC_MOD_ANY))
17+        {
18+            binding->handler(time, keysym, binding->data);
19+            return true;
20+        }
21+    }
22+
23+    return false;
24+}
25+
26+static bool handle_key(struct swc_keyboard * keyboard, uint32_t time,
27+                       uint32_t key, uint32_t state)
28+{
29     if (state == WL_KEYBOARD_KEY_STATE_PRESSED)
30     {
31+        xkb_keysym_t keysym;
32+
33+        keysym = xkb_state_key_get_one_sym(keyboard->xkb.state, XKB_KEY(key));
34+
35+        if (handle_keysym(keysym, keyboard->modifiers, time))
36+            return true;
37+
38         xkb_layout_index_t layout;
39         const xkb_keysym_t * keysyms;
40-        int num_keysyms;
41 
42         layout = xkb_state_key_get_layout(keyboard->xkb.state, XKB_KEY(key));
43+        xkb_keymap_key_get_syms_by_level(keyboard->xkb.keymap.map, XKB_KEY(key),
44+                                         layout, 0, &keysyms);
45 
46-        /* XXX: Maybe someone might want to register a key binding for a
47-         * keysym with a different shift-level? */
48-        num_keysyms = xkb_keymap_key_get_syms_by_level
49-            (keyboard->xkb.keymap.map, XKB_KEY(key), layout, 0, &keysyms);
50-
51-        if (num_keysyms == 1)
52-        {
53-            wl_array_for_each(binding, &bindings.keys)
54-            {
55-                if (binding->value == keysyms[0]
56-                    && (binding->modifiers == keyboard->modifiers
57-                        || binding->modifiers == SWC_MOD_ANY))
58-                {
59-                    binding->handler(time, keysyms[0], binding->data);
60-                    printf("\t-> handled\n");
61-                    return true;
62-                }
63-            }
64-        }
65+        if (keysyms && handle_keysym(keysyms[0], keyboard->modifiers, time))
66+            return true;
67     }
68 
69     return false;