aboutsummaryrefslogtreecommitdiffstats
path: root/sway/input/keyboard.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/input/keyboard.c')
-rw-r--r--sway/input/keyboard.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c
index f71a7909..2cfcd126 100644
--- a/sway/input/keyboard.c
+++ b/sway/input/keyboard.c
@@ -659,6 +659,11 @@ static bool keymaps_match(struct xkb_keymap *km1, struct xkb_keymap *km2) {
659 return result; 659 return result;
660} 660}
661 661
662static bool repeat_info_match(struct sway_keyboard *a, struct wlr_keyboard *b) {
663 return a->repeat_rate == b->repeat_info.rate &&
664 a->repeat_delay == b->repeat_info.delay;
665}
666
662static void destroy_empty_wlr_keyboard_group(void *data) { 667static void destroy_empty_wlr_keyboard_group(void *data) {
663 wlr_keyboard_group_destroy(data); 668 wlr_keyboard_group_destroy(data);
664} 669}
@@ -711,9 +716,10 @@ static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) {
711 sway_keyboard_group_remove(keyboard); 716 sway_keyboard_group_remove(keyboard);
712 break; 717 break;
713 case KEYBOARD_GROUP_DEFAULT: /* fallthrough */ 718 case KEYBOARD_GROUP_DEFAULT: /* fallthrough */
714 case KEYBOARD_GROUP_KEYMAP:; 719 case KEYBOARD_GROUP_SMART:;
715 struct wlr_keyboard_group *group = wlr_keyboard->group; 720 struct wlr_keyboard_group *group = wlr_keyboard->group;
716 if (!keymaps_match(keyboard->keymap, group->keyboard.keymap)) { 721 if (!keymaps_match(keyboard->keymap, group->keyboard.keymap) ||
722 !repeat_info_match(keyboard, &group->keyboard)) {
717 sway_keyboard_group_remove(keyboard); 723 sway_keyboard_group_remove(keyboard);
718 } 724 }
719 break; 725 break;
@@ -741,9 +747,10 @@ static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
741 // Nothing to do. This shouldn't even be reached 747 // Nothing to do. This shouldn't even be reached
742 return; 748 return;
743 case KEYBOARD_GROUP_DEFAULT: /* fallthrough */ 749 case KEYBOARD_GROUP_DEFAULT: /* fallthrough */
744 case KEYBOARD_GROUP_KEYMAP:; 750 case KEYBOARD_GROUP_SMART:;
745 struct wlr_keyboard_group *wlr_group = group->wlr_group; 751 struct wlr_keyboard_group *wlr_group = group->wlr_group;
746 if (keymaps_match(keyboard->keymap, wlr_group->keyboard.keymap)) { 752 if (keymaps_match(keyboard->keymap, wlr_group->keyboard.keymap) &&
753 repeat_info_match(keyboard, &wlr_group->keyboard)) {
747 sway_log(SWAY_DEBUG, "Adding keyboard %s to group %p", 754 sway_log(SWAY_DEBUG, "Adding keyboard %s to group %p",
748 device->identifier, wlr_group); 755 device->identifier, wlr_group);
749 wlr_keyboard_group_add_keyboard(wlr_group, wlr_keyboard); 756 wlr_keyboard_group_add_keyboard(wlr_group, wlr_keyboard);
@@ -767,6 +774,8 @@ static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
767 } 774 }
768 sway_group->wlr_group->data = sway_group; 775 sway_group->wlr_group->data = sway_group;
769 wlr_keyboard_set_keymap(&sway_group->wlr_group->keyboard, keyboard->keymap); 776 wlr_keyboard_set_keymap(&sway_group->wlr_group->keyboard, keyboard->keymap);
777 wlr_keyboard_set_repeat_info(&sway_group->wlr_group->keyboard,
778 keyboard->repeat_rate, keyboard->repeat_delay);
770 sway_log(SWAY_DEBUG, "Created keyboard group %p", sway_group->wlr_group); 779 sway_log(SWAY_DEBUG, "Created keyboard group %p", sway_group->wlr_group);
771 780
772 sway_group->seat_device = calloc(1, sizeof(struct sway_seat_device)); 781 sway_group->seat_device = calloc(1, sizeof(struct sway_seat_device));
@@ -836,14 +845,30 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) {
836 keyboard->keymap ? !keymaps_match(keyboard->keymap, keymap) : true; 845 keyboard->keymap ? !keymaps_match(keyboard->keymap, keymap) : true;
837 bool effective_layout_changed = keyboard->effective_layout != 0; 846 bool effective_layout_changed = keyboard->effective_layout != 0;
838 847
839 if (keymap_changed || config->reloading) { 848 int repeat_rate = 25;
849 if (input_config && input_config->repeat_rate != INT_MIN) {
850 repeat_rate = input_config->repeat_rate;
851 }
852 int repeat_delay = 600;
853 if (input_config && input_config->repeat_delay != INT_MIN) {
854 repeat_delay = input_config->repeat_delay;
855 }
856
857 bool repeat_info_changed = keyboard->repeat_rate != repeat_rate ||
858 keyboard->repeat_delay != repeat_delay;
859
860 if (keymap_changed || repeat_info_changed || config->reloading) {
840 xkb_keymap_unref(keyboard->keymap); 861 xkb_keymap_unref(keyboard->keymap);
841 keyboard->keymap = keymap; 862 keyboard->keymap = keymap;
842 keyboard->effective_layout = 0; 863 keyboard->effective_layout = 0;
864 keyboard->repeat_rate = repeat_rate;
865 keyboard->repeat_delay = repeat_delay;
843 866
844 sway_keyboard_group_remove_invalid(keyboard); 867 sway_keyboard_group_remove_invalid(keyboard);
845 868
846 wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); 869 wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap);
870 wlr_keyboard_set_repeat_info(wlr_device->keyboard,
871 keyboard->repeat_rate, keyboard->repeat_delay);
847 872
848 if (!wlr_device->keyboard->group) { 873 if (!wlr_device->keyboard->group) {
849 sway_keyboard_group_add(keyboard); 874 sway_keyboard_group_add(keyboard);
@@ -890,17 +915,6 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) {
890 } 915 }
891 } 916 }
892 917
893 int repeat_rate = 25;
894 if (input_config && input_config->repeat_rate != INT_MIN) {
895 repeat_rate = input_config->repeat_rate;
896 }
897 int repeat_delay = 600;
898 if (input_config && input_config->repeat_delay != INT_MIN) {
899 repeat_delay = input_config->repeat_delay;
900 }
901 wlr_keyboard_set_repeat_info(wlr_device->keyboard, repeat_rate,
902 repeat_delay);
903
904 struct wlr_seat *seat = keyboard->seat_device->sway_seat->wlr_seat; 918 struct wlr_seat *seat = keyboard->seat_device->sway_seat->wlr_seat;
905 wlr_seat_set_keyboard(seat, wlr_device); 919 wlr_seat_set_keyboard(seat, wlr_device);
906 920