diff options
-rw-r--r-- | include/sway/input/keyboard.h | 1 | ||||
-rw-r--r-- | sway/input/keyboard.c | 16 | ||||
-rw-r--r-- | sway/input/seat.c | 1 |
3 files changed, 14 insertions, 4 deletions
diff --git a/include/sway/input/keyboard.h b/include/sway/input/keyboard.h index 86805be3..65137a08 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); | |||
51 | 51 | ||
52 | void sway_keyboard_destroy(struct sway_keyboard *keyboard); | 52 | void sway_keyboard_destroy(struct sway_keyboard *keyboard); |
53 | 53 | ||
54 | void sway_keyboard_disarm_key_repeat(struct sway_keyboard *keyboard); | ||
54 | #endif | 55 | #endif |
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 46286410..2ea796a9 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, | |||
213 | keycode, layout_index, 0, keysyms); | 213 | keycode, layout_index, 0, keysyms); |
214 | } | 214 | } |
215 | 215 | ||
216 | void sway_keyboard_disarm_key_repeat(struct sway_keyboard *keyboard) { | ||
217 | if (!keyboard) { | ||
218 | return; | ||
219 | } | ||
220 | keyboard->repeat_binding = NULL; | ||
221 | if (wl_event_source_timer_update(keyboard->key_repeat_source, 0) < 0) { | ||
222 | wlr_log(WLR_DEBUG, "failed to disarm key repeat timer"); | ||
223 | } | ||
224 | } | ||
225 | |||
216 | static void handle_keyboard_key(struct wl_listener *listener, void *data) { | 226 | static void handle_keyboard_key(struct wl_listener *listener, void *data) { |
217 | struct sway_keyboard *keyboard = | 227 | struct sway_keyboard *keyboard = |
218 | wl_container_of(listener, keyboard, keyboard_key); | 228 | wl_container_of(listener, keyboard, keyboard_key); |
@@ -306,10 +316,7 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { | |||
306 | wlr_log(WLR_DEBUG, "failed to set key repeat timer"); | 316 | wlr_log(WLR_DEBUG, "failed to set key repeat timer"); |
307 | } | 317 | } |
308 | } else if (keyboard->repeat_binding) { | 318 | } else if (keyboard->repeat_binding) { |
309 | keyboard->repeat_binding = NULL; | 319 | sway_keyboard_disarm_key_repeat(keyboard); |
310 | if (wl_event_source_timer_update(keyboard->key_repeat_source, 0) < 0) { | ||
311 | wlr_log(WLR_DEBUG, "failed to disarm key repeat timer"); | ||
312 | } | ||
313 | } | 320 | } |
314 | 321 | ||
315 | if (binding) { | 322 | if (binding) { |
@@ -517,6 +524,7 @@ void sway_keyboard_destroy(struct sway_keyboard *keyboard) { | |||
517 | } | 524 | } |
518 | wl_list_remove(&keyboard->keyboard_key.link); | 525 | wl_list_remove(&keyboard->keyboard_key.link); |
519 | wl_list_remove(&keyboard->keyboard_modifiers.link); | 526 | wl_list_remove(&keyboard->keyboard_modifiers.link); |
527 | sway_keyboard_disarm_key_repeat(keyboard); | ||
520 | wl_event_source_remove(keyboard->key_repeat_source); | 528 | wl_event_source_remove(keyboard->key_repeat_source); |
521 | free(keyboard); | 529 | free(keyboard); |
522 | } | 530 | } |
diff --git a/sway/input/seat.c b/sway/input/seat.c index a63999b6..a66a8198 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c | |||
@@ -542,6 +542,7 @@ void seat_reset_device(struct sway_seat *seat, | |||
542 | seat_reset_input_config(seat, seat_device); | 542 | seat_reset_input_config(seat, seat_device); |
543 | break; | 543 | break; |
544 | case WLR_INPUT_DEVICE_KEYBOARD: | 544 | case WLR_INPUT_DEVICE_KEYBOARD: |
545 | sway_keyboard_disarm_key_repeat(seat_device->keyboard); | ||
545 | sway_keyboard_configure(seat_device->keyboard); | 546 | sway_keyboard_configure(seat_device->keyboard); |
546 | break; | 547 | break; |
547 | case WLR_INPUT_DEVICE_TOUCH: | 548 | case WLR_INPUT_DEVICE_TOUCH: |