diff options
-rw-r--r-- | sway/input/keyboard.c | 56 |
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; |