diff options
author | Ben Challenor <ben@challenor.org> | 2019-03-10 20:26:50 +0000 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2019-03-10 23:01:49 +0100 |
commit | 30931ad9e77b106956007530821d98bc20bca969 (patch) | |
tree | b0038a7cfef6e0c56d52f4ee25bcbda1dc8b7cd8 | |
parent | Fix crash in cmd_workspace when layer surface has focus (diff) | |
download | sway-30931ad9e77b106956007530821d98bc20bca969.tar.gz sway-30931ad9e77b106956007530821d98bc20bca969.tar.zst sway-30931ad9e77b106956007530821d98bc20bca969.zip |
Make raw keysyms take precedence over translated
Allows both BackSpace and Shift+BackSpace to be bound under the US
keyboard layout, per #3705.
-rw-r--r-- | sway/input/keyboard.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 00fc6a13..06ae99c4 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c | |||
@@ -292,32 +292,32 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { | |||
292 | // Identify new keycode, raw keysym(s), and translated keysym(s) | 292 | // Identify new keycode, raw keysym(s), and translated keysym(s) |
293 | xkb_keycode_t keycode = event->keycode + 8; | 293 | xkb_keycode_t keycode = event->keycode + 8; |
294 | 294 | ||
295 | const xkb_keysym_t *raw_keysyms; | ||
296 | uint32_t raw_modifiers; | ||
297 | size_t raw_keysyms_len = | ||
298 | keyboard_keysyms_raw(keyboard, keycode, &raw_keysyms, &raw_modifiers); | ||
299 | |||
295 | const xkb_keysym_t *translated_keysyms; | 300 | const xkb_keysym_t *translated_keysyms; |
296 | uint32_t translated_modifiers; | 301 | uint32_t translated_modifiers; |
297 | size_t translated_keysyms_len = | 302 | size_t translated_keysyms_len = |
298 | keyboard_keysyms_translated(keyboard, keycode, &translated_keysyms, | 303 | keyboard_keysyms_translated(keyboard, keycode, &translated_keysyms, |
299 | &translated_modifiers); | 304 | &translated_modifiers); |
300 | 305 | ||
301 | const xkb_keysym_t *raw_keysyms; | ||
302 | uint32_t raw_modifiers; | ||
303 | size_t raw_keysyms_len = | ||
304 | keyboard_keysyms_raw(keyboard, keycode, &raw_keysyms, &raw_modifiers); | ||
305 | |||
306 | uint32_t code_modifiers = wlr_keyboard_get_modifiers(wlr_device->keyboard); | 306 | uint32_t code_modifiers = wlr_keyboard_get_modifiers(wlr_device->keyboard); |
307 | 307 | ||
308 | // Update shortcut model state | 308 | // Update shortcut model state |
309 | update_shortcut_state(&keyboard->state_keycodes, event, | 309 | update_shortcut_state(&keyboard->state_keycodes, event, |
310 | (uint32_t)keycode, code_modifiers); | 310 | (uint32_t)keycode, code_modifiers); |
311 | for (size_t i = 0; i < translated_keysyms_len; ++i) { | ||
312 | update_shortcut_state(&keyboard->state_keysyms_translated, | ||
313 | event, (uint32_t)translated_keysyms[i], | ||
314 | code_modifiers); | ||
315 | } | ||
316 | for (size_t i = 0; i < raw_keysyms_len; ++i) { | 311 | for (size_t i = 0; i < raw_keysyms_len; ++i) { |
317 | update_shortcut_state(&keyboard->state_keysyms_raw, | 312 | update_shortcut_state(&keyboard->state_keysyms_raw, |
318 | event, (uint32_t)raw_keysyms[i], | 313 | event, (uint32_t)raw_keysyms[i], |
319 | code_modifiers); | 314 | code_modifiers); |
320 | } | 315 | } |
316 | for (size_t i = 0; i < translated_keysyms_len; ++i) { | ||
317 | update_shortcut_state(&keyboard->state_keysyms_translated, | ||
318 | event, (uint32_t)translated_keysyms[i], | ||
319 | code_modifiers); | ||
320 | } | ||
321 | 321 | ||
322 | bool handled = false; | 322 | bool handled = false; |
323 | 323 | ||
@@ -326,12 +326,12 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { | |||
326 | get_active_binding(&keyboard->state_keycodes, | 326 | get_active_binding(&keyboard->state_keycodes, |
327 | config->current_mode->keycode_bindings, &binding_released, | 327 | config->current_mode->keycode_bindings, &binding_released, |
328 | code_modifiers, true, input_inhibited, device_identifier); | 328 | code_modifiers, true, input_inhibited, device_identifier); |
329 | get_active_binding(&keyboard->state_keysyms_translated, | ||
330 | config->current_mode->keysym_bindings, &binding_released, | ||
331 | translated_modifiers, true, input_inhibited, device_identifier); | ||
332 | get_active_binding(&keyboard->state_keysyms_raw, | 329 | get_active_binding(&keyboard->state_keysyms_raw, |
333 | config->current_mode->keysym_bindings, &binding_released, | 330 | config->current_mode->keysym_bindings, &binding_released, |
334 | raw_modifiers, true, input_inhibited, device_identifier); | 331 | raw_modifiers, true, input_inhibited, device_identifier); |
332 | get_active_binding(&keyboard->state_keysyms_translated, | ||
333 | config->current_mode->keysym_bindings, &binding_released, | ||
334 | translated_modifiers, true, input_inhibited, device_identifier); | ||
335 | 335 | ||
336 | // Execute stored release binding once no longer active | 336 | // Execute stored release binding once no longer active |
337 | if (keyboard->held_binding && binding_released != keyboard->held_binding && | 337 | if (keyboard->held_binding && binding_released != keyboard->held_binding && |
@@ -352,13 +352,13 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { | |||
352 | get_active_binding(&keyboard->state_keycodes, | 352 | get_active_binding(&keyboard->state_keycodes, |
353 | config->current_mode->keycode_bindings, &binding, | 353 | config->current_mode->keycode_bindings, &binding, |
354 | code_modifiers, false, input_inhibited, device_identifier); | 354 | code_modifiers, false, input_inhibited, device_identifier); |
355 | get_active_binding(&keyboard->state_keysyms_raw, | ||
356 | config->current_mode->keysym_bindings, &binding, | ||
357 | raw_modifiers, false, input_inhibited, device_identifier); | ||
355 | get_active_binding(&keyboard->state_keysyms_translated, | 358 | get_active_binding(&keyboard->state_keysyms_translated, |
356 | config->current_mode->keysym_bindings, &binding, | 359 | config->current_mode->keysym_bindings, &binding, |
357 | translated_modifiers, false, input_inhibited, | 360 | translated_modifiers, false, input_inhibited, |
358 | device_identifier); | 361 | device_identifier); |
359 | get_active_binding(&keyboard->state_keysyms_raw, | ||
360 | config->current_mode->keysym_bindings, &binding, | ||
361 | raw_modifiers, false, input_inhibited, device_identifier); | ||
362 | } | 362 | } |
363 | 363 | ||
364 | // Set up (or clear) keyboard repeat for a pressed binding. Since the | 364 | // Set up (or clear) keyboard repeat for a pressed binding. Since the |