diff options
author | Brian Ashworth <bosrsf04@gmail.com> | 2019-12-15 01:33:33 -0500 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2019-12-16 12:03:11 -0500 |
commit | 452a615bb8f546fbeaddd7bacc71b5c597ab5629 (patch) | |
tree | a8a2b726fd510e906f7c27eb8510eae2bdd986b3 /sway/input/keyboard.c | |
parent | input/seatop_default: fix focusing floating titles (diff) | |
download | sway-452a615bb8f546fbeaddd7bacc71b5c597ab5629.tar.gz sway-452a615bb8f546fbeaddd7bacc71b5c597ab5629.tar.zst sway-452a615bb8f546fbeaddd7bacc71b5c597ab5629.zip |
seat_cmd_keyboard_grouping: change keymap to smart
This removes `seat <seat> keyboard_grouping keymap` and replaces it with
`seat <seat> keyboard_grouping smart`. The smart keyboard grouping will
group based on both the keymap and repeat info. The reasoning for this
is that deciding what the repeat info should be for a group is either
arbitrary or non-deterministic when multiple keyboards in the group have
repeat info configured (unless somehow exposed to the user in a
reproducible uniquely identifiable fashion).
Diffstat (limited to 'sway/input/keyboard.c')
-rw-r--r-- | sway/input/keyboard.c | 46 |
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 | ||
662 | static 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 | |||
662 | static void destroy_empty_wlr_keyboard_group(void *data) { | 667 | static 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 | ||