diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c index c2ce527c7d..436266ea4f 100644 --- a/src/video/wayland/SDL_waylandevents.c +++ b/src/video/wayland/SDL_waylandevents.c @@ -858,7 +858,7 @@ static void pointer_handle_enter(void *data, struct wl_pointer *pointer, } } -static void pointer_dispatch_leave(SDL_WaylandSeat *seat) +static void pointer_dispatch_leave(SDL_WaylandSeat *seat, bool update_pointer) { SDL_WindowData *window = seat->pointer.pending_frame.leave_window; @@ -882,6 +882,11 @@ static void pointer_dispatch_leave(SDL_WaylandSeat *seat) if (!--window->pointer_focus_count && had_focus && !window->active_touch_count) { SDL_SetMouseFocus(NULL); } + + if (update_pointer) { + Wayland_SeatUpdatePointerGrab(seat); + Wayland_SeatUpdatePointerCursor(seat); + } } } @@ -902,9 +907,7 @@ static void pointer_handle_leave(void *data, struct wl_pointer *pointer, SDL_WaylandSeat *seat = (SDL_WaylandSeat *)data; seat->pointer.pending_frame.leave_window = window; if (wl_pointer_get_version(seat->pointer.wl_pointer) < WL_POINTER_FRAME_SINCE_VERSION && window == seat->pointer.focus) { - pointer_dispatch_leave(seat); - Wayland_SeatUpdatePointerGrab(seat); - Wayland_SeatUpdatePointerCursor(seat); + pointer_dispatch_leave(seat, true); } } @@ -1277,7 +1280,7 @@ static void pointer_handle_frame(void *data, struct wl_pointer *pointer) if (seat->pointer.pending_frame.enter_window) { if (seat->pointer.focus && seat->pointer.pending_frame.leave_window == seat->pointer.focus) { // Leaving the previous surface before entering a new surface. - pointer_dispatch_leave(seat); + pointer_dispatch_leave(seat, false); } pointer_dispatch_enter(seat); } @@ -1307,9 +1310,7 @@ static void pointer_handle_frame(void *data, struct wl_pointer *pointer) } if (seat->pointer.focus && seat->pointer.pending_frame.leave_window == seat->pointer.focus) { - pointer_dispatch_leave(seat); - Wayland_SeatUpdatePointerGrab(seat); - Wayland_SeatUpdatePointerCursor(seat); + pointer_dispatch_leave(seat, true); } SDL_zero(seat->pointer.pending_frame); @@ -2394,7 +2395,7 @@ static void Wayland_SeatDestroyPointer(SDL_WaylandSeat *seat) // Make sure focus is removed from a surface before the pointer is destroyed. if (seat->pointer.focus) { seat->pointer.pending_frame.leave_window = seat->pointer.focus; - pointer_dispatch_leave(seat); + pointer_dispatch_leave(seat, false); seat->pointer.pending_frame.leave_window = NULL; } @@ -3663,9 +3664,7 @@ void Wayland_DisplayRemoveWindowReferencesFromSeats(SDL_VideoData *display, SDL_ if (seat->pointer.focus == window) { seat->pointer.pending_frame.leave_window = seat->pointer.focus; - pointer_dispatch_leave(seat); - Wayland_SeatUpdatePointerGrab(seat); - Wayland_SeatUpdatePointerCursor(seat); + pointer_dispatch_leave(seat, true); seat->pointer.pending_frame.leave_window = NULL; }