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