diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 8b43df82..032083e9 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -34,18 +34,22 @@ static ssize_t pressed_keysyms_index(xkb_keysym_t *pressed_keysyms, * Returns true if the keysym was handled by a binding and false if the event * should be propagated to clients. */ -static bool keyboard_execute_compositor_binding(xkb_keysym_t keysym) { - if (keysym >= XKB_KEY_XF86Switch_VT_1 && - keysym <= XKB_KEY_XF86Switch_VT_12) { - if (wlr_backend_is_multi(server.backend)) { - struct wlr_session *session = - wlr_multi_get_session(server.backend); - if (session) { - unsigned vt = keysym - XKB_KEY_XF86Switch_VT_1 + 1; - wlr_session_change_vt(session, vt); +static bool keyboard_execute_compositor_binding(struct sway_keyboard *keyboard, + xkb_keysym_t *pressed_keysyms, uint32_t modifiers, size_t keysyms_len) { + for (size_t i = 0; i < keysyms_len; ++i) { + xkb_keysym_t keysym = pressed_keysyms[i]; + if (keysym >= XKB_KEY_XF86Switch_VT_1 && + keysym <= XKB_KEY_XF86Switch_VT_12) { + if (wlr_backend_is_multi(server.backend)) { + struct wlr_session *session = + wlr_multi_get_session(server.backend); + if (session) { + unsigned vt = keysym - XKB_KEY_XF86Switch_VT_1 + 1; + wlr_session_change_vt(session, vt); + } } + return true; } - return true; } return false; @@ -58,16 +62,8 @@ static bool keyboard_execute_compositor_binding(xkb_keysym_t keysym) { * Returns true if the keysym was handled by a binding and false if the event * should be propagated to clients. */ -static bool keyboard_execute_binding(struct sway_keyboard *keyboard, - xkb_keysym_t *pressed_keysyms, uint32_t modifiers, - const xkb_keysym_t *keysyms, size_t keysyms_len) { - // compositor bindings - for (size_t i = 0; i < keysyms_len; ++i) { - if (keyboard_execute_compositor_binding(keysyms[i])) { - return true; - } - } - +static bool keyboard_execute_bindsym(struct sway_keyboard *keyboard, + xkb_keysym_t *pressed_keysyms, uint32_t modifiers, size_t keysyms_len) { // configured bindings int n = pressed_keysyms_length(pressed_keysyms); list_t *keysym_bindings = config->current_mode->keysym_bindings; @@ -208,28 +204,48 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { xkb_keycode_t keycode = event->keycode + 8; bool handled = false; - uint32_t modifiers; const xkb_keysym_t *keysyms; - size_t keysyms_len; + + // handle keycodes + // TODO + handled = keyboard_execute_bindcode(keyboard); // handle translated keysyms - keysyms_len = keyboard_keysyms_translated(keyboard, keycode, &keysyms, - &modifiers); + uint32_t translated_modifiers; + size_t translated_keysyms_len = + keyboard_keysyms_translated(keyboard, keycode, &keysyms, + &translated_modifiers); pressed_keysyms_update(keyboard->pressed_keysyms_translated, keysyms, - keysyms_len, event->state); - if (event->state == WLR_KEY_PRESSED) { - handled = keyboard_execute_binding(keyboard, - keyboard->pressed_keysyms_translated, modifiers, keysyms, - keysyms_len); + translated_keysyms_len, event->state); + if (event->state == WLR_KEY_PRESSED && !handled) { + handled = keyboard_execute_bindsym(keyboard, + keyboard->pressed_keysyms_translated, translated_modifiers, + translated_keysyms_len); } // Handle raw keysyms - keysyms_len = keyboard_keysyms_raw(keyboard, keycode, &keysyms, &modifiers); - pressed_keysyms_update(keyboard->pressed_keysyms_raw, keysyms, keysyms_len, + uint32_t raw_modifiers; + size_t raw_keysyms_len = keyboard_keysyms_raw(keyboard, keycode, &keysyms, &raw_modifiers); + pressed_keysyms_update(keyboard->pressed_keysyms_raw, keysyms, raw_keysyms_len, event->state); if (event->state == WLR_KEY_PRESSED && !handled) { - handled = keyboard_execute_binding(keyboard, - keyboard->pressed_keysyms_raw, modifiers, keysyms, keysyms_len); + handled = keyboard_execute_bindsym(keyboard, + keyboard->pressed_keysyms_raw, raw_modifiers, + raw_keysyms_len); + } + + // Compositor bindings + if (event->state == WLR_KEY_PRESSED && !handled) { + handled = + keyboard_execute_compositor_binding(keyboard, + keyboard->pressed_keysyms_translated, translated_modifiers, + translated_keysyms_len); + } + if (event->state == WLR_KEY_PRESSED && !handled) { + handled = + keyboard_execute_compositor_binding(keyboard, + keyboard->pressed_keysyms_raw, raw_modifiers, + raw_keysyms_len); } if (!handled) {