diff --git a/include/sway/input/keyboard.h b/include/sway/input/keyboard.h index 86805be37..65137a081 100644 --- a/include/sway/input/keyboard.h +++ b/include/sway/input/keyboard.h @@ -51,4 +51,5 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard); void sway_keyboard_destroy(struct sway_keyboard *keyboard); +void sway_keyboard_disarm_key_repeat(struct sway_keyboard *keyboard); #endif diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 462864107..2ea796a9a 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -213,6 +213,16 @@ static size_t keyboard_keysyms_raw(struct sway_keyboard *keyboard, keycode, layout_index, 0, keysyms); } +void sway_keyboard_disarm_key_repeat(struct sway_keyboard *keyboard) { + if (!keyboard) { + return; + } + keyboard->repeat_binding = NULL; + if (wl_event_source_timer_update(keyboard->key_repeat_source, 0) < 0) { + wlr_log(WLR_DEBUG, "failed to disarm key repeat timer"); + } +} + static void handle_keyboard_key(struct wl_listener *listener, void *data) { struct sway_keyboard *keyboard = wl_container_of(listener, keyboard, keyboard_key); @@ -306,10 +316,7 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { wlr_log(WLR_DEBUG, "failed to set key repeat timer"); } } else if (keyboard->repeat_binding) { - keyboard->repeat_binding = NULL; - if (wl_event_source_timer_update(keyboard->key_repeat_source, 0) < 0) { - wlr_log(WLR_DEBUG, "failed to disarm key repeat timer"); - } + sway_keyboard_disarm_key_repeat(keyboard); } if (binding) { @@ -517,6 +524,7 @@ void sway_keyboard_destroy(struct sway_keyboard *keyboard) { } wl_list_remove(&keyboard->keyboard_key.link); wl_list_remove(&keyboard->keyboard_modifiers.link); + sway_keyboard_disarm_key_repeat(keyboard); wl_event_source_remove(keyboard->key_repeat_source); free(keyboard); } diff --git a/sway/input/seat.c b/sway/input/seat.c index a63999b6c..a66a8198c 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -542,6 +542,7 @@ void seat_reset_device(struct sway_seat *seat, seat_reset_input_config(seat, seat_device); break; case WLR_INPUT_DEVICE_KEYBOARD: + sway_keyboard_disarm_key_repeat(seat_device->keyboard); sway_keyboard_configure(seat_device->keyboard); break; case WLR_INPUT_DEVICE_TOUCH: