swc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/swc
Log | Files | Refs | README | LICENSE

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:
Mlibswc/bindings.c | 52++++++++++++++++++++++++++++++----------------------
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;