input: Reset keyboard state when releasing last seat keyboard
Don't rely on the input driver to properly send button-up events for every pressed key. Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
This commit is contained in:
parent
7395ea05c7
commit
91fed5419c
24
src/input.c
24
src/input.c
@ -1987,6 +1987,29 @@ weston_seat_init_keyboard(struct weston_seat *seat, struct xkb_keymap *keymap)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
weston_keyboard_reset_state(struct weston_keyboard *keyboard)
|
||||||
|
{
|
||||||
|
struct weston_seat *seat = keyboard->seat;
|
||||||
|
struct xkb_state *state;
|
||||||
|
|
||||||
|
#ifdef ENABLE_XKBCOMMON
|
||||||
|
if (seat->compositor->use_xkbcommon) {
|
||||||
|
state = xkb_state_new(keyboard->xkb_info->keymap);
|
||||||
|
if (!state) {
|
||||||
|
weston_log("failed to reset XKB state\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
xkb_state_unref(keyboard->xkb_state.state);
|
||||||
|
keyboard->xkb_state.state = state;
|
||||||
|
|
||||||
|
keyboard->xkb_state.leds = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
seat->modifier_state = 0;
|
||||||
|
}
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT void
|
||||||
weston_seat_release_keyboard(struct weston_seat *seat)
|
weston_seat_release_keyboard(struct weston_seat *seat)
|
||||||
{
|
{
|
||||||
@ -1994,6 +2017,7 @@ weston_seat_release_keyboard(struct weston_seat *seat)
|
|||||||
if (seat->keyboard_device_count == 0) {
|
if (seat->keyboard_device_count == 0) {
|
||||||
weston_keyboard_set_focus(seat->keyboard, NULL);
|
weston_keyboard_set_focus(seat->keyboard, NULL);
|
||||||
weston_keyboard_cancel_grab(seat->keyboard);
|
weston_keyboard_cancel_grab(seat->keyboard);
|
||||||
|
weston_keyboard_reset_state(seat->keyboard);
|
||||||
seat_send_updated_caps(seat);
|
seat_send_updated_caps(seat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user