SDL: wayland: Dedup pointer entry handling code

From 56e121f6e3bdeafcf77f1ce10a51c5e9418c8a21 Mon Sep 17 00:00:00 2001
From: Frank Praznik <[EMAIL REDACTED]>
Date: Sat, 17 Jan 2026 10:40:14 -0500
Subject: [PATCH] wayland: Dedup pointer entry handling code

Small cleanup, and needed for future work.
---
 src/video/wayland/SDL_waylandevents.c | 50 ++++++++++-----------------
 1 file changed, 18 insertions(+), 32 deletions(-)

diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c
index cec8786127eb7..c2ce527c7d949 100644
--- a/src/video/wayland/SDL_waylandevents.c
+++ b/src/video/wayland/SDL_waylandevents.c
@@ -807,6 +807,22 @@ static void pointer_dispatch_enter(SDL_WaylandSeat *seat)
     seat->pointer.focus = window;
     ++window->pointer_focus_count;
     SDL_SetMouseFocus(window->sdlwindow);
+
+    // Send the initial position.
+    pointer_dispatch_absolute_motion(seat);
+
+    // Update the pointer grab state.
+    Wayland_SeatUpdatePointerGrab(seat);
+
+    /* If the cursor was changed while our window didn't have pointer
+     * focus, we might need to trigger another call to
+     * wl_pointer_set_cursor() for the new cursor to be displayed.
+     *
+     * This will also update the cursor if a second pointer entered a
+     * window that already has focus, as the focus change sequence
+     * won't be run.
+     */
+    Wayland_SeatUpdatePointerCursor(seat);
 }
 
 static void pointer_handle_enter(void *data, struct wl_pointer *pointer,
@@ -835,25 +851,10 @@ static void pointer_handle_enter(void *data, struct wl_pointer *pointer,
     seat->pointer.pending_frame.absolute.sx = sx_w;
     seat->pointer.pending_frame.absolute.sy = sy_w;
 
-    if (wl_pointer_get_version(seat->pointer.wl_pointer) >= WL_POINTER_FRAME_SINCE_VERSION) {
-        seat->pointer.pending_frame.have_absolute = true;
-    } else {
+    if (wl_pointer_get_version(seat->pointer.wl_pointer) < WL_POINTER_FRAME_SINCE_VERSION) {
+        // Dispatching an enter event generates an absolute motion event, for which there is no timestamp.
         seat->pointer.pending_frame.timestamp_ns = 0;
         pointer_dispatch_enter(seat);
-        pointer_dispatch_absolute_motion(seat);
-
-        // Update the pointer grab state.
-        Wayland_SeatUpdatePointerGrab(seat);
-
-        /* If the cursor was changed while our window didn't have pointer
-         * focus, we might need to trigger another call to
-         * wl_pointer_set_cursor() for the new cursor to be displayed.
-         *
-         * This will also update the cursor if a second pointer entered a
-         * window that already has focus, as the focus change sequence
-         * won't be run.
-         */
-        Wayland_SeatUpdatePointerCursor(seat);
     }
 }
 
@@ -1283,21 +1284,6 @@ static void pointer_handle_frame(void *data, struct wl_pointer *pointer)
 
     if (seat->pointer.pending_frame.have_absolute) {
         pointer_dispatch_absolute_motion(seat);
-
-        if (seat->pointer.pending_frame.enter_window) {
-            // Update the pointer grab state.
-            Wayland_SeatUpdatePointerGrab(seat);
-
-            /* If the cursor was changed while our window didn't have pointer
-             * focus, we might need to trigger another call to
-             * wl_pointer_set_cursor() for the new cursor to be displayed.
-             *
-             * This will also update the cursor if a second pointer entered a
-             * window that already has focus, as the focus change sequence
-             * won't be run.
-             */
-            Wayland_SeatUpdatePointerCursor(seat);
-        }
     }
 
     if (seat->pointer.pending_frame.have_relative) {