src/keyboard.c: register keys before inhibit check

Call key_state_set_pressed() before checking
seat->active_client_while_inhibited to avoid missing release events for
clients using the inhibit protocol (for example swaylock).
This commit is contained in:
Johan Malm 2022-08-30 21:07:27 +01:00
parent 20c4ffa539
commit 4108313f96

View file

@ -124,6 +124,15 @@ handle_compositor_keybindings(struct wl_listener *listener,
key_state_set_pressed(keycode, key_state_set_pressed(keycode,
event->state == WL_KEYBOARD_KEY_STATE_PRESSED); event->state == WL_KEYBOARD_KEY_STATE_PRESSED);
/*
* Ignore labwc keybindings if input is inhibited
* It's important to do this after key_state_set_pressed() to ensure
* _all_ key press/releases are registered
*/
if (seat->active_client_while_inhibited) {
return false;
}
/* /*
* If a user lets go of the modifier (e.g. alt) before the 'normal' key * If a user lets go of the modifier (e.g. alt) before the 'normal' key
* (e.g. tab) when window-cycling, we do not end the cycling until both * (e.g. tab) when window-cycling, we do not end the cycling until both
@ -233,12 +242,7 @@ keyboard_key_notify(struct wl_listener *listener, void *data)
struct wlr_keyboard *keyboard = &seat->keyboard_group->keyboard; struct wlr_keyboard *keyboard = &seat->keyboard_group->keyboard;
wlr_idle_notify_activity(seat->wlr_idle, seat->seat); wlr_idle_notify_activity(seat->wlr_idle, seat->seat);
bool handled = false; bool handled = handle_compositor_keybindings(listener, event);
/* ignore labwc keybindings if input is inhibited */
if (!seat->active_client_while_inhibited) {
handled = handle_compositor_keybindings(listener, event);
}
if (!handled) { if (!handled) {
wlr_seat_set_keyboard(wlr_seat, keyboard); wlr_seat_set_keyboard(wlr_seat, keyboard);