diff options
-rw-r--r-- | sway/input/keyboard.c | 82 |
1 files changed, 49 insertions, 33 deletions
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, | |||
34 | * Returns true if the keysym was handled by a binding and false if the event | 34 | * Returns true if the keysym was handled by a binding and false if the event |
35 | * should be propagated to clients. | 35 | * should be propagated to clients. |
36 | */ | 36 | */ |
37 | static bool keyboard_execute_compositor_binding(xkb_keysym_t keysym) { | 37 | static bool keyboard_execute_compositor_binding(struct sway_keyboard *keyboard, |
38 | if (keysym >= XKB_KEY_XF86Switch_VT_1 && | 38 | xkb_keysym_t *pressed_keysyms, uint32_t modifiers, size_t keysyms_len) { |
39 | keysym <= XKB_KEY_XF86Switch_VT_12) { | 39 | for (size_t i = 0; i < keysyms_len; ++i) { |
40 | if (wlr_backend_is_multi(server.backend)) { | 40 | xkb_keysym_t keysym = pressed_keysyms[i]; |
41 | struct wlr_session *session = | 41 | if (keysym >= XKB_KEY_XF86Switch_VT_1 && |
42 | wlr_multi_get_session(server.backend); | 42 | keysym <= XKB_KEY_XF86Switch_VT_12) { |
43 | if (session) { | 43 | if (wlr_backend_is_multi(server.backend)) { |
44 | unsigned vt = keysym - XKB_KEY_XF86Switch_VT_1 + 1; | 44 | struct wlr_session *session = |
45 | wlr_session_change_vt(session, vt); | 45 | wlr_multi_get_session(server.backend); |
46 | if (session) { | ||
47 | unsigned vt = keysym - XKB_KEY_XF86Switch_VT_1 + 1; | ||
48 | wlr_session_change_vt(session, vt); | ||
49 | } | ||
46 | } | 50 | } |
51 | return true; | ||
47 | } | 52 | } |
48 | return true; | ||
49 | } | 53 | } |
50 | 54 | ||
51 | return false; | 55 | return false; |
@@ -58,16 +62,8 @@ static bool keyboard_execute_compositor_binding(xkb_keysym_t keysym) { | |||
58 | * Returns true if the keysym was handled by a binding and false if the event | 62 | * Returns true if the keysym was handled by a binding and false if the event |
59 | * should be propagated to clients. | 63 | * should be propagated to clients. |
60 | */ | 64 | */ |
61 | static bool keyboard_execute_binding(struct sway_keyboard *keyboard, | 65 | static bool keyboard_execute_bindsym(struct sway_keyboard *keyboard, |
62 | xkb_keysym_t *pressed_keysyms, uint32_t modifiers, | 66 | xkb_keysym_t *pressed_keysyms, uint32_t modifiers, size_t keysyms_len) { |
63 | const xkb_keysym_t *keysyms, size_t keysyms_len) { | ||
64 | // compositor bindings | ||
65 | for (size_t i = 0; i < keysyms_len; ++i) { | ||
66 | if (keyboard_execute_compositor_binding(keysyms[i])) { | ||
67 | return true; | ||
68 | } | ||
69 | } | ||
70 | |||
71 | // configured bindings | 67 | // configured bindings |
72 | int n = pressed_keysyms_length(pressed_keysyms); | 68 | int n = pressed_keysyms_length(pressed_keysyms); |
73 | list_t *keysym_bindings = config->current_mode->keysym_bindings; | 69 | list_t *keysym_bindings = config->current_mode->keysym_bindings; |
@@ -208,28 +204,48 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { | |||
208 | 204 | ||
209 | xkb_keycode_t keycode = event->keycode + 8; | 205 | xkb_keycode_t keycode = event->keycode + 8; |
210 | bool handled = false; | 206 | bool handled = false; |
211 | uint32_t modifiers; | ||
212 | const xkb_keysym_t *keysyms; | 207 | const xkb_keysym_t *keysyms; |
213 | size_t keysyms_len; | 208 | |
209 | // handle keycodes | ||
210 | // TODO | ||
211 | handled = keyboard_execute_bindcode(keyboard); | ||
214 | 212 | ||
215 | // handle translated keysyms | 213 | // handle translated keysyms |
216 | keysyms_len = keyboard_keysyms_translated(keyboard, keycode, &keysyms, | 214 | uint32_t translated_modifiers; |
217 | &modifiers); | 215 | size_t translated_keysyms_len = |
216 | keyboard_keysyms_translated(keyboard, keycode, &keysyms, | ||
217 | &translated_modifiers); | ||
218 | pressed_keysyms_update(keyboard->pressed_keysyms_translated, keysyms, | 218 | pressed_keysyms_update(keyboard->pressed_keysyms_translated, keysyms, |
219 | keysyms_len, event->state); | 219 | translated_keysyms_len, event->state); |
220 | if (event->state == WLR_KEY_PRESSED) { | 220 | if (event->state == WLR_KEY_PRESSED && !handled) { |
221 | handled = keyboard_execute_binding(keyboard, | 221 | handled = keyboard_execute_bindsym(keyboard, |
222 | keyboard->pressed_keysyms_translated, modifiers, keysyms, | 222 | keyboard->pressed_keysyms_translated, translated_modifiers, |
223 | keysyms_len); | 223 | translated_keysyms_len); |
224 | } | 224 | } |
225 | 225 | ||
226 | // Handle raw keysyms | 226 | // Handle raw keysyms |
227 | keysyms_len = keyboard_keysyms_raw(keyboard, keycode, &keysyms, &modifiers); | 227 | uint32_t raw_modifiers; |
228 | pressed_keysyms_update(keyboard->pressed_keysyms_raw, keysyms, keysyms_len, | 228 | size_t raw_keysyms_len = keyboard_keysyms_raw(keyboard, keycode, &keysyms, &raw_modifiers); |
229 | pressed_keysyms_update(keyboard->pressed_keysyms_raw, keysyms, raw_keysyms_len, | ||
229 | event->state); | 230 | event->state); |
230 | if (event->state == WLR_KEY_PRESSED && !handled) { | 231 | if (event->state == WLR_KEY_PRESSED && !handled) { |
231 | handled = keyboard_execute_binding(keyboard, | 232 | handled = keyboard_execute_bindsym(keyboard, |
232 | keyboard->pressed_keysyms_raw, modifiers, keysyms, keysyms_len); | 233 | keyboard->pressed_keysyms_raw, raw_modifiers, |
234 | raw_keysyms_len); | ||
235 | } | ||
236 | |||
237 | // Compositor bindings | ||
238 | if (event->state == WLR_KEY_PRESSED && !handled) { | ||
239 | handled = | ||
240 | keyboard_execute_compositor_binding(keyboard, | ||
241 | keyboard->pressed_keysyms_translated, translated_modifiers, | ||
242 | translated_keysyms_len); | ||
243 | } | ||
244 | if (event->state == WLR_KEY_PRESSED && !handled) { | ||
245 | handled = | ||
246 | keyboard_execute_compositor_binding(keyboard, | ||
247 | keyboard->pressed_keysyms_raw, raw_modifiers, | ||
248 | raw_keysyms_len); | ||
233 | } | 249 | } |
234 | 250 | ||
235 | if (!handled) { | 251 | if (!handled) { |