mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-05-27 10:57:22 +08:00
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.
This commit is contained in:
@@ -1191,19 +1191,21 @@ static void pointer_handle_axis_relative_direction(void *data, struct wl_pointer
|
|||||||
static void pointer_dispatch_relative_motion(SDL_WaylandSeat *seat)
|
static void pointer_dispatch_relative_motion(SDL_WaylandSeat *seat)
|
||||||
{
|
{
|
||||||
SDL_WindowData *window = seat->pointer.focus;
|
SDL_WindowData *window = seat->pointer.focus;
|
||||||
SDL_Mouse *mouse = SDL_GetMouse();
|
|
||||||
|
|
||||||
double dx;
|
if (window) {
|
||||||
double dy;
|
SDL_Mouse *mouse = SDL_GetMouse();
|
||||||
if (mouse->InputTransform || !mouse->enable_relative_system_scale) {
|
double dx;
|
||||||
dx = wl_fixed_to_double(seat->pointer.pending_frame.relative.dx_unaccel);
|
double dy;
|
||||||
dy = wl_fixed_to_double(seat->pointer.pending_frame.relative.dy_unaccel);
|
if (mouse->InputTransform || !mouse->enable_relative_system_scale) {
|
||||||
} else {
|
dx = wl_fixed_to_double(seat->pointer.pending_frame.relative.dx_unaccel);
|
||||||
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_unaccel);
|
||||||
dy = wl_fixed_to_double(seat->pointer.pending_frame.relative.dy) * window->pointer_scale.y;
|
} 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)
|
static void pointer_dispatch_axis(SDL_WaylandSeat *seat)
|
||||||
|
|||||||
Reference in New Issue
Block a user