From 2e41412ee4ab8c5955cd4efed11244bfcf995944 Mon Sep 17 00:00:00 2001 From: Riteo Date: Sun, 20 Apr 2025 17:11:08 +0200 Subject: [PATCH] Wayland: Emulate frame event for old wl_seat versions Multiwindow support simplified input handling by processing all data only during a `wl_seat::frame` event, which got introduced in wl_seat version 5. If the compositor reports an older version, we manually call the frame event handler. --- platform/linuxbsd/wayland/wayland_thread.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/platform/linuxbsd/wayland/wayland_thread.cpp b/platform/linuxbsd/wayland/wayland_thread.cpp index 5d391ce4fc9..ddf0a707eb5 100644 --- a/platform/linuxbsd/wayland/wayland_thread.cpp +++ b/platform/linuxbsd/wayland/wayland_thread.cpp @@ -1547,6 +1547,10 @@ void WaylandThread::_wl_pointer_on_enter(void *data, struct wl_pointer *wl_point seat_state_update_cursor(ss); DEBUG_LOG_WAYLAND_THREAD(vformat("Pointer entered window %d.", ws->id)); + + if (wl_pointer_get_version(wl_pointer) < WL_POINTER_FRAME_SINCE_VERSION) { + _wl_pointer_on_frame(data, wl_pointer); + } } void WaylandThread::_wl_pointer_on_leave(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface) { @@ -1570,6 +1574,10 @@ void WaylandThread::_wl_pointer_on_leave(void *data, struct wl_pointer *wl_point pd.pressed_button_mask.clear(); DEBUG_LOG_WAYLAND_THREAD(vformat("Pointer left window %d.", id)); + + if (wl_pointer_get_version(wl_pointer) < WL_POINTER_FRAME_SINCE_VERSION) { + _wl_pointer_on_frame(data, wl_pointer); + } } void WaylandThread::_wl_pointer_on_motion(void *data, struct wl_pointer *wl_pointer, uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y) { @@ -1582,6 +1590,10 @@ void WaylandThread::_wl_pointer_on_motion(void *data, struct wl_pointer *wl_poin pd.position.y = wl_fixed_to_double(surface_y); pd.motion_time = time; + + if (wl_pointer_get_version(wl_pointer) < WL_POINTER_FRAME_SINCE_VERSION) { + _wl_pointer_on_frame(data, wl_pointer); + } } void WaylandThread::_wl_pointer_on_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state) { @@ -1629,6 +1641,10 @@ void WaylandThread::_wl_pointer_on_button(void *data, struct wl_pointer *wl_poin pd.button_time = time; pd.button_serial = serial; + + if (wl_pointer_get_version(wl_pointer) < WL_POINTER_FRAME_SINCE_VERSION) { + _wl_pointer_on_frame(data, wl_pointer); + } } void WaylandThread::_wl_pointer_on_axis(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value) { @@ -1648,6 +1664,10 @@ void WaylandThread::_wl_pointer_on_axis(void *data, struct wl_pointer *wl_pointe } pd.button_time = time; + + if (wl_pointer_get_version(wl_pointer) < WL_POINTER_FRAME_SINCE_VERSION) { + _wl_pointer_on_frame(data, wl_pointer); + } } void WaylandThread::_wl_pointer_on_frame(void *data, struct wl_pointer *wl_pointer) {