keyboard: cancel repeat when handling key-bind

<keybind key="W-d">
  <action name="Execute">
    <command>dmenu_run</command>
  </action>
</keybind>

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
This commit is contained in:
Johan Malm 2022-01-02 15:28:35 +00:00
parent 70845643af
commit e62bb51bfb
3 changed files with 12 additions and 3 deletions

View file

@ -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;
}