SDL: wayland: More pointer related code deduplication

From 4b83933298071edb44463af8ee97a90c5bfc82bf Mon Sep 17 00:00:00 2001
From: Frank Praznik <[EMAIL REDACTED]>
Date: Tue, 20 Jan 2026 13:50:40 -0500
Subject: [PATCH] wayland: More pointer related code deduplication

---
 src/video/wayland/SDL_waylandevents.c | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c
index c2ce527c7d949..436266ea4fd35 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;
         }