aboutsummaryrefslogtreecommitdiffstats
path: root/sway/input/keyboard.c
diff options
context:
space:
mode:
authorLibravatar Tony Crisci <tony@dubstepdish.com>2017-12-27 19:07:17 -0500
committerLibravatar Tony Crisci <tony@dubstepdish.com>2017-12-27 19:07:17 -0500
commit27cd633b409bbe6692538a26738e052e7d865be0 (patch)
treeab4a259b1af037ff4c3971157074d65cbef5470e /sway/input/keyboard.c
parentrun binding command (diff)
downloadsway-27cd633b409bbe6692538a26738e052e7d865be0.tar.gz
sway-27cd633b409bbe6692538a26738e052e7d865be0.tar.zst
sway-27cd633b409bbe6692538a26738e052e7d865be0.zip
run compositor bindings last
Diffstat (limited to 'sway/input/keyboard.c')
-rw-r--r--sway/input/keyboard.c82
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 */
37static bool keyboard_execute_compositor_binding(xkb_keysym_t keysym) { 37static 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 */
61static bool keyboard_execute_binding(struct sway_keyboard *keyboard, 65static 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) {