summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/sway/input/keyboard.h1
-rw-r--r--sway/input/keyboard.c16
-rw-r--r--sway/input/seat.c1
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
52void sway_keyboard_destroy(struct sway_keyboard *keyboard); 52void sway_keyboard_destroy(struct sway_keyboard *keyboard);
53 53
54void 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
216void 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
216static void handle_keyboard_key(struct wl_listener *listener, void *data) { 226static 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: