input: reset modifiers in keyboard_leave()

Closes #2034
This commit is contained in:
Daniel Eklöf 2025-04-19 08:05:15 +02:00
parent cb2a64c585
commit ef4a680ae8
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 11 additions and 0 deletions

View file

@ -71,8 +71,11 @@
* Grapheme shaping was allowed to be "enabled" at runtime, even though
disabled at compile time. This caused mis-rendering of certain
codepoints ([#2039][2039]).
* Keyboard modifiers not being reset on keyboard leave events
([#2034][2034]).
[2039]: https://codeberg.org/dnkl/foot/issues/2039
[2034]: https://codeberg.org/dnkl/foot/issues/2034
### Security

View file

@ -765,9 +765,17 @@ keyboard_leave(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
seat->kbd.alt = false;
seat->kbd.ctrl = false;
seat->kbd.super = false;
if (seat->kbd.xkb_compose_state != NULL)
xkb_compose_state_reset(seat->kbd.xkb_compose_state);
if (seat->kbd.xkb_state != NULL && seat->kbd.xkb_keymap != NULL) {
const xkb_layout_index_t layout_count = xkb_keymap_num_layouts(seat->kbd.xkb_keymap);
for (xkb_layout_index_t i = 0; i < layout_count; i++)
xkb_state_update_mask(seat->kbd.xkb_state, 0, 0, 0, i, i, i);
}
if (old_focused != NULL) {
seat->pointer.hidden = false;
term_xcursor_update_for_seat(old_focused, seat);