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;