瀏覽代碼

wayland: update pointer position on initial enter event

Tudor Brindus 4 年之前
父節點
當前提交
a6ca61d732
共有 1 個文件被更改,包括 19 次插入15 次删除
  1. 19 15
      src/video/wayland/SDL_waylandevents.c

+ 19 - 15
src/video/wayland/SDL_waylandevents.c

@@ -219,6 +219,21 @@ Wayland_PumpEvents(_THIS)
     }
 }
 
+static void
+pointer_handle_motion(void *data, struct wl_pointer *pointer,
+                      uint32_t time, wl_fixed_t sx_w, wl_fixed_t sy_w)
+{
+    struct SDL_WaylandInput *input = data;
+    SDL_WindowData *window = input->pointer_focus;
+    input->sx_w = sx_w;
+    input->sy_w = sy_w;
+    if (input->pointer_focus) {
+        const int sx = wl_fixed_to_int(sx_w);
+        const int sy = wl_fixed_to_int(sy_w);
+        SDL_SendMouseMotion(window->sdlwindow, 0, 0, sx, sy);
+    }
+}
+
 static void
 pointer_handle_enter(void *data, struct wl_pointer *pointer,
                      uint32_t serial, struct wl_surface *surface,
@@ -243,6 +258,10 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer,
     if (window) {
         input->pointer_focus = window;
         SDL_SetMouseFocus(window->sdlwindow);
+        /* In the case of e.g. a pointer confine warp, we may receive an enter
+         * event with no following motion event, but with the new coordinates
+         * as part of the enter event. */
+        pointer_handle_motion(data, pointer, serial, sx_w, sy_w);
     }
 }
 
@@ -258,21 +277,6 @@ pointer_handle_leave(void *data, struct wl_pointer *pointer,
     }
 }
 
-static void
-pointer_handle_motion(void *data, struct wl_pointer *pointer,
-                      uint32_t time, wl_fixed_t sx_w, wl_fixed_t sy_w)
-{
-    struct SDL_WaylandInput *input = data;
-    SDL_WindowData *window = input->pointer_focus;
-    input->sx_w = sx_w;
-    input->sy_w = sy_w;
-    if (input->pointer_focus) {
-        const int sx = wl_fixed_to_int(sx_w);
-        const int sy = wl_fixed_to_int(sy_w);
-        SDL_SendMouseMotion(window->sdlwindow, 0, 0, sx, sy);
-    }
-}
-
 static SDL_bool
 ProcessHitTest(struct SDL_WaylandInput *input, uint32_t serial)
 {