aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-08-01 11:23:08 -0400
committerLibravatar Simon Ser <contact@emersion.fr>2019-08-01 18:27:01 +0300
commit14562fdbeed99e8d608de3dc46f1e04407e9258f (patch)
tree9301b79416fcd4175e454b932864f5ef84cc0c68
parentFix typo in sway(5) manpage (diff)
downloadsway-14562fdbeed99e8d608de3dc46f1e04407e9258f.tar.gz
sway-14562fdbeed99e8d608de3dc46f1e04407e9258f.tar.zst
sway-14562fdbeed99e8d608de3dc46f1e04407e9258f.zip
input/keyboard: don't reset layout for same keymap
In sway_keyboard_config, do not change the keymap when the new keymap is unchanged, unless this is during a config reload. The reasoning for this is to prevent the effective layout from being reset to index 0 for input config changes unrelated to the keymap.
-rw-r--r--sway/input/keyboard.c56
1 files changed, 32 insertions, 24 deletions
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c
index 328458fa..aecabbf4 100644
--- a/sway/input/keyboard.c
+++ b/sway/input/keyboard.c
@@ -622,34 +622,42 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) {
622 keymap_changed = true; 622 keymap_changed = true;
623 } 623 }
624 624
625 xkb_keymap_unref(keyboard->keymap); 625 if (keymap_changed || config->reloading) {
626 keyboard->keymap = keymap; 626 xkb_keymap_unref(keyboard->keymap);
627 keyboard->effective_layout = 0; 627 keyboard->keymap = keymap;
628 wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); 628 keyboard->effective_layout = 0;
629 629 wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap);
630 xkb_mod_mask_t locked_mods = 0; 630
631 if (input_config && input_config->xkb_numlock > 0) { 631 xkb_mod_mask_t locked_mods = 0;
632 xkb_mod_index_t mod_index = xkb_map_mod_get_index(keymap, XKB_MOD_NAME_NUM); 632 if (input_config && input_config->xkb_numlock > 0) {
633 if (mod_index != XKB_MOD_INVALID) { 633 xkb_mod_index_t mod_index = xkb_map_mod_get_index(keymap,
634 locked_mods |= (uint32_t)1 << mod_index; 634 XKB_MOD_NAME_NUM);
635 if (mod_index != XKB_MOD_INVALID) {
636 locked_mods |= (uint32_t)1 << mod_index;
637 }
635 } 638 }
636 } 639 if (input_config && input_config->xkb_capslock > 0) {
637 if (input_config && input_config->xkb_capslock > 0) { 640 xkb_mod_index_t mod_index = xkb_map_mod_get_index(keymap,
638 xkb_mod_index_t mod_index = xkb_map_mod_get_index(keymap, XKB_MOD_NAME_CAPS); 641 XKB_MOD_NAME_CAPS);
639 if (mod_index != XKB_MOD_INVALID) { 642 if (mod_index != XKB_MOD_INVALID) {
640 locked_mods |= (uint32_t)1 << mod_index; 643 locked_mods |= (uint32_t)1 << mod_index;
644 }
641 } 645 }
642 } 646 if (locked_mods) {
643 if (locked_mods) { 647 wlr_keyboard_notify_modifiers(wlr_device->keyboard, 0, 0,
644 wlr_keyboard_notify_modifiers(wlr_device->keyboard, 0, 0, locked_mods, 0); 648 locked_mods, 0);
645 uint32_t leds = 0; 649 uint32_t leds = 0;
646 for (uint32_t i = 0; i < WLR_LED_COUNT; ++i) { 650 for (uint32_t i = 0; i < WLR_LED_COUNT; ++i) {
647 if (xkb_state_led_index_is_active(wlr_device->keyboard->xkb_state, 651 if (xkb_state_led_index_is_active(
648 wlr_device->keyboard->led_indexes[i])) { 652 wlr_device->keyboard->xkb_state,
649 leds |= (1 << i); 653 wlr_device->keyboard->led_indexes[i])) {
654 leds |= (1 << i);
655 }
650 } 656 }
657 wlr_keyboard_led_update(wlr_device->keyboard, leds);
651 } 658 }
652 wlr_keyboard_led_update(wlr_device->keyboard, leds); 659 } else {
660 xkb_keymap_unref(keymap);
653 } 661 }
654 662
655 int repeat_rate = 25; 663 int repeat_rate = 25;