Просмотр исходного кода

wayland: Check focus when dispatching relative motion

In rare cases, a leave event can be grouped with relative motion in a frame. Ensure a valid focus window when dispatching relative motion.

(cherry picked from commit fab42a1432d62fa6d61e95950c6e93732944aa5c)
Frank Praznik 1 месяц назад
Родитель
Сommit
8a418521e1
1 измененных файлов с 13 добавлено и 11 удалено
  1. 13 11
      src/video/wayland/SDL_waylandevents.c

+ 13 - 11
src/video/wayland/SDL_waylandevents.c

@@ -1187,19 +1187,21 @@ static void pointer_handle_axis_relative_direction(void *data, struct wl_pointer
 static void pointer_dispatch_relative_motion(SDL_WaylandSeat *seat)
 {
     SDL_WindowData *window = seat->pointer.focus;
-    SDL_Mouse *mouse = SDL_GetMouse();
 
-    double dx;
-    double dy;
-    if (mouse->InputTransform || !mouse->enable_relative_system_scale) {
-        dx = wl_fixed_to_double(seat->pointer.pending_frame.relative.dx_unaccel);
-        dy = wl_fixed_to_double(seat->pointer.pending_frame.relative.dy_unaccel);
-    } else {
-        dx = wl_fixed_to_double(seat->pointer.pending_frame.relative.dx) * window->pointer_scale.x;
-        dy = wl_fixed_to_double(seat->pointer.pending_frame.relative.dy) * window->pointer_scale.y;
-    }
+    if (window) {
+        SDL_Mouse *mouse = SDL_GetMouse();
+        double dx;
+        double dy;
+        if (mouse->InputTransform || !mouse->enable_relative_system_scale) {
+            dx = wl_fixed_to_double(seat->pointer.pending_frame.relative.dx_unaccel);
+            dy = wl_fixed_to_double(seat->pointer.pending_frame.relative.dy_unaccel);
+        } else {
+            dx = wl_fixed_to_double(seat->pointer.pending_frame.relative.dx) * window->pointer_scale.x;
+            dy = wl_fixed_to_double(seat->pointer.pending_frame.relative.dy) * window->pointer_scale.y;
+        }
 
-    SDL_SendMouseMotion(seat->pointer.pending_frame.timestamp_ns, window->sdlwindow, seat->pointer.sdl_id, true, (float)dx, (float)dy);
+        SDL_SendMouseMotion(seat->pointer.pending_frame.timestamp_ns, window->sdlwindow, seat->pointer.sdl_id, true, (float)dx, (float)dy);
+    }
 }
 
 static void pointer_dispatch_axis(SDL_WaylandSeat *seat)