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=utf8 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; } -- 2.52.0