commit 99d5aefb6ed133d41b14acebb8e72c349451b3ec
parent 5f7077b420fb300f2c1abe5bcd745eadb898bd3b
Author: Michael Forney <mforney@mforney.org>
Date: Mon, 20 Jan 2014 20:41:29 -0800
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.
Diffstat:
1 file changed, 30 insertions(+), 22 deletions(-)
diff --git a/libswc/bindings.c b/libswc/bindings.c
@@ -41,38 +41,46 @@ static struct
struct wl_array keys;
} bindings;
-static bool handle_key(struct swc_keyboard * keyboard, uint32_t time,
- uint32_t key, uint32_t state)
+static bool handle_keysym(xkb_keysym_t keysym,
+ uint32_t modifiers, uint32_t time)
{
struct binding * binding;
+ wl_array_for_each(binding, &bindings.keys)
+ {
+ if (binding->value == keysym
+ && (binding->modifiers == modifiers
+ || binding->modifiers == SWC_MOD_ANY))
+ {
+ binding->handler(time, keysym, binding->data);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static bool handle_key(struct swc_keyboard * keyboard, uint32_t time,
+ uint32_t key, uint32_t state)
+{
if (state == WL_KEYBOARD_KEY_STATE_PRESSED)
{
+ xkb_keysym_t keysym;
+
+ keysym = xkb_state_key_get_one_sym(keyboard->xkb.state, XKB_KEY(key));
+
+ if (handle_keysym(keysym, keyboard->modifiers, time))
+ return true;
+
xkb_layout_index_t layout;
const xkb_keysym_t * keysyms;
- int num_keysyms;
layout = xkb_state_key_get_layout(keyboard->xkb.state, XKB_KEY(key));
+ xkb_keymap_key_get_syms_by_level(keyboard->xkb.keymap.map, XKB_KEY(key),
+ layout, 0, &keysyms);
- /* XXX: Maybe someone might want to register a key binding for a
- * keysym with a different shift-level? */
- num_keysyms = xkb_keymap_key_get_syms_by_level
- (keyboard->xkb.keymap.map, XKB_KEY(key), layout, 0, &keysyms);
-
- if (num_keysyms == 1)
- {
- wl_array_for_each(binding, &bindings.keys)
- {
- if (binding->value == keysyms[0]
- && (binding->modifiers == keyboard->modifiers
- || binding->modifiers == SWC_MOD_ANY))
- {
- binding->handler(time, keysyms[0], binding->data);
- printf("\t-> handled\n");
- return true;
- }
- }
- }
+ if (keysyms && handle_keysym(keysyms[0], keyboard->modifiers, time))
+ return true;
}
return false;