diff options
author | Kenny Levinsen <kl@kl.wtf> | 2022-12-04 01:20:06 +0100 |
---|---|---|
committer | Ronan Pigott <rpigott@berkeley.edu> | 2022-12-04 13:01:41 -0700 |
commit | e1b268af98edeb09e570e8855ef64f0719cbafe2 (patch) | |
tree | d0cdfc81540dcdb2603e57b8f5acbd9433a2249d /sway/input/seat.c | |
parent | sway/lock: handle mode in output commit handler (diff) | |
download | sway-e1b268af98edeb09e570e8855ef64f0719cbafe2.tar.gz sway-e1b268af98edeb09e570e8855ef64f0719cbafe2.tar.zst sway-e1b268af98edeb09e570e8855ef64f0719cbafe2.zip |
seat: Avoid sending redundant keymaps on reload
When we reload the config, we reset every input device and re-apply
configuration from the config file. This means that the keyboard keymap
is updated at least once during config reload, more if the config file
contains keyboard configuration.
When they keyboard keymap changes and is updated through wlr_seat, the
keymap ends up sent to every keyboard bound in every client, seemingly
multiple times. On an x230 of mine with a keyboard layout set in the
config file, I see 42 keymap events sent to foot on config reload.
Reduce events from keyboard configurations by skipping all but the
currently active keyboard for the seat, and by clearing the active
keyboard during input manager device reset. After this change, I only
see a single just-in-time keymap event.
Fixes: https://github.com/swaywm/sway/issues/6654
Diffstat (limited to 'sway/input/seat.c')
-rw-r--r-- | sway/input/seat.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/sway/input/seat.c b/sway/input/seat.c index 4919bed0..151303a9 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c | |||
@@ -823,8 +823,15 @@ static void seat_configure_keyboard(struct sway_seat *seat, | |||
823 | sway_keyboard_create(seat, seat_device); | 823 | sway_keyboard_create(seat, seat_device); |
824 | } | 824 | } |
825 | sway_keyboard_configure(seat_device->keyboard); | 825 | sway_keyboard_configure(seat_device->keyboard); |
826 | wlr_seat_set_keyboard(seat->wlr_seat, | 826 | |
827 | wlr_keyboard_from_input_device(seat_device->input_device->wlr_device)); | 827 | // We only need to update the current keyboard, as the rest will be updated |
828 | // as they are activated. | ||
829 | struct wlr_keyboard *wlr_keyboard = | ||
830 | wlr_keyboard_from_input_device(seat_device->input_device->wlr_device); | ||
831 | struct wlr_keyboard *current_keyboard = seat->wlr_seat->keyboard_state.keyboard; | ||
832 | if (wlr_keyboard != current_keyboard) { | ||
833 | return; | ||
834 | } | ||
828 | 835 | ||
829 | // force notify reenter to pick up the new configuration. This reuses | 836 | // force notify reenter to pick up the new configuration. This reuses |
830 | // the current focused surface to avoid breaking input grabs. | 837 | // the current focused surface to avoid breaking input grabs. |