mirror of
https://github.com/swaywm/sway.git
synced 2024-11-11 13:04:11 +01:00
Disarm key repeat on reload
When resetting the keyboard during reload, disarm the key repeat on all keyboards since the bindings (and possibly keyboard) will be freed before the key repeat can go off.
This commit is contained in:
parent
2257368f1a
commit
2573606b60
@ -51,4 +51,5 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard);
|
|||||||
|
|
||||||
void sway_keyboard_destroy(struct sway_keyboard *keyboard);
|
void sway_keyboard_destroy(struct sway_keyboard *keyboard);
|
||||||
|
|
||||||
|
void sway_keyboard_disarm_key_repeat(struct sway_keyboard *keyboard);
|
||||||
#endif
|
#endif
|
||||||
|
@ -213,6 +213,16 @@ static size_t keyboard_keysyms_raw(struct sway_keyboard *keyboard,
|
|||||||
keycode, layout_index, 0, keysyms);
|
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) {
|
static void handle_keyboard_key(struct wl_listener *listener, void *data) {
|
||||||
struct sway_keyboard *keyboard =
|
struct sway_keyboard *keyboard =
|
||||||
wl_container_of(listener, keyboard, keyboard_key);
|
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");
|
wlr_log(WLR_DEBUG, "failed to set key repeat timer");
|
||||||
}
|
}
|
||||||
} else if (keyboard->repeat_binding) {
|
} else if (keyboard->repeat_binding) {
|
||||||
keyboard->repeat_binding = NULL;
|
sway_keyboard_disarm_key_repeat(keyboard);
|
||||||
if (wl_event_source_timer_update(keyboard->key_repeat_source, 0) < 0) {
|
|
||||||
wlr_log(WLR_DEBUG, "failed to disarm key repeat timer");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (binding) {
|
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_key.link);
|
||||||
wl_list_remove(&keyboard->keyboard_modifiers.link);
|
wl_list_remove(&keyboard->keyboard_modifiers.link);
|
||||||
|
sway_keyboard_disarm_key_repeat(keyboard);
|
||||||
wl_event_source_remove(keyboard->key_repeat_source);
|
wl_event_source_remove(keyboard->key_repeat_source);
|
||||||
free(keyboard);
|
free(keyboard);
|
||||||
}
|
}
|
||||||
|
@ -542,6 +542,7 @@ void seat_reset_device(struct sway_seat *seat,
|
|||||||
seat_reset_input_config(seat, seat_device);
|
seat_reset_input_config(seat, seat_device);
|
||||||
break;
|
break;
|
||||||
case WLR_INPUT_DEVICE_KEYBOARD:
|
case WLR_INPUT_DEVICE_KEYBOARD:
|
||||||
|
sway_keyboard_disarm_key_repeat(seat_device->keyboard);
|
||||||
sway_keyboard_configure(seat_device->keyboard);
|
sway_keyboard_configure(seat_device->keyboard);
|
||||||
break;
|
break;
|
||||||
case WLR_INPUT_DEVICE_TOUCH:
|
case WLR_INPUT_DEVICE_TOUCH:
|
||||||
|
Loading…
Reference in New Issue
Block a user