From e62bb51bfb33ee520e800cf98553d766824fe9cf Mon Sep 17 00:00:00 2001 From: Johan Malm Date: Sun, 2 Jan 2022 15:28:35 +0000 Subject: [PATCH] keyboard: cancel repeat when handling key-bind MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dmenu_run When using the keybind above (in rc.xml), on the first execution of W-d all is okay, but the second time, a "d" pressed event is sent to dmenu resulting in a continuous "ddddddd...") which has to be stopped pressing a key. This behaviour started in commit 7e57b7f because release events associated with keybinds are no longer sent to clients (before that commit, the release event for the ā€œdā€ would have been passed to dmenu, thus cancelling the repeat). Solves issue #176 Helped-by: @spectrum70 --- include/key-state.h | 4 +++- src/key-state.c | 3 ++- src/keyboard.c | 8 +++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/key-state.h b/include/key-state.h index 1e7e5410..e5f72919 100644 --- a/include/key-state.h +++ b/include/key-state.h @@ -5,6 +5,8 @@ void key_state_set_pressed(uint32_t keycode, bool ispressed); void key_state_store_pressed_keys_as_bound(void); bool key_state_corresponding_press_event_was_bound(uint32_t keycode); -void key_state_bound_key_remove(uint32_t keycode); + +/* returns numbers of keys still pressed in a consumed key combination */ +int key_state_bound_key_remove(uint32_t keycode); #endif /* __LABWC_KEY_STATE_H */ diff --git a/src/key-state.c b/src/key-state.c index bc4844f6..d2be5467 100644 --- a/src/key-state.c +++ b/src/key-state.c @@ -63,8 +63,9 @@ key_state_corresponding_press_event_was_bound(uint32_t keycode) return false; } -void +int key_state_bound_key_remove(uint32_t keycode) { remove_key(&bound, keycode); + return bound.nr_keys; } diff --git a/src/keyboard.c b/src/keyboard.c index 1be0c002..c10e3c9c 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -59,12 +59,14 @@ static bool handle_keybinding(struct server *server, uint32_t modifiers, xkb_keysym_t sym) { struct keybind *keybind; + struct wlr_keyboard *kb = &server->seat.keyboard_group->keyboard; wl_list_for_each_reverse (keybind, &rc.keybinds, link) { if (modifiers ^ keybind->modifiers) { continue; } for (size_t i = 0; i < keybind->keysyms_len; i++) { if (xkb_keysym_to_lower(sym) == keybind->keysyms[i]) { + wlr_keyboard_set_repeat_info(kb, 0, 0); action(NULL, server, keybind->action, keybind->command, 0); return true; @@ -111,7 +113,11 @@ handle_compositor_keybindings(struct wl_listener *listener, */ if (key_state_corresponding_press_event_was_bound(keycode) && event->state == WL_KEYBOARD_KEY_STATE_RELEASED) { - key_state_bound_key_remove(keycode); + int nr_bound_keys = key_state_bound_key_remove(keycode); + if (!nr_bound_keys) { + wlr_keyboard_set_repeat_info(device->keyboard, + rc.repeat_rate, rc.repeat_delay); + } return true; }