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: