diff --git a/platform/linuxbsd/wayland/wayland_thread.cpp b/platform/linuxbsd/wayland/wayland_thread.cpp index 87c327f7a94..f058f5bd323 100644 --- a/platform/linuxbsd/wayland/wayland_thread.cpp +++ b/platform/linuxbsd/wayland/wayland_thread.cpp @@ -1680,6 +1680,16 @@ void WaylandThread::_wl_seat_on_capabilities(void *data, struct wl_seat *wl_seat ss->xkb_compose_state = nullptr; } + if (ss->xkb_keymap) { + xkb_keymap_unref(ss->xkb_keymap); + ss->xkb_keymap = nullptr; + } + + if (ss->xkb_state) { + xkb_state_unref(ss->xkb_state); + ss->xkb_state = nullptr; + } + if (ss->wl_keyboard) { wl_keyboard_destroy(ss->wl_keyboard); ss->wl_keyboard = nullptr; @@ -2309,7 +2319,7 @@ void WaylandThread::_wl_keyboard_on_repeat_info(void *data, struct wl_keyboard * SeatState *ss = (SeatState *)data; ERR_FAIL_NULL(ss); - ss->repeat_key_delay_msec = 1000 / rate; + ss->repeat_key_delay_msec = rate ? 1000 / rate : 0; ss->repeat_start_delay_msec = delay; } diff --git a/platform/linuxbsd/wayland/wayland_thread.h b/platform/linuxbsd/wayland/wayland_thread.h index f35f27f69ad..158910a33b2 100644 --- a/platform/linuxbsd/wayland/wayland_thread.h +++ b/platform/linuxbsd/wayland/wayland_thread.h @@ -480,8 +480,11 @@ public: xkb_layout_index_t current_layout_index = 0; - int32_t repeat_key_delay_msec = 0; - int32_t repeat_start_delay_msec = 0; + // Clients with `wl_seat`s older than version 4 do not support + // `wl_keyboard::repeat_info`, so we'll provide a reasonable default of 25 + // keys per second, with a start delay of 600 milliseconds. + int32_t repeat_key_delay_msec = 1000 / 25; + int32_t repeat_start_delay_msec = 600; xkb_keycode_t repeating_keycode = XKB_KEYCODE_INVALID; uint64_t last_repeat_start_msec = 0;