mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-09-02 03:43:38 +00:00
wayland: Don't perform hit testing during implicit pointer grabs
Skip hit testing when an implicit grab is active, or button raise events may be lost, and the cursor icon may be improperly set if the client reports hit test results while the pointer is outside the window bounds.
This commit is contained in:
@@ -670,7 +670,8 @@ static void pointer_dispatch_absolute_motion(SDL_WaylandSeat *seat, bool warp)
|
||||
Wayland_SeatUpdatePointerGrab(seat);
|
||||
}
|
||||
|
||||
if (window->hit_test) {
|
||||
// Don't perform hit testing if an implicit grab is active.
|
||||
if (!(window->flags & SDL_WINDOW_MOUSE_CAPTURE) && window->hit_test) {
|
||||
SDL_HitTestResult rc = window->hit_test(window, &seat->pointer.last_motion, window->hit_test_data);
|
||||
|
||||
// Apply the toplevel constraints if the window isn't resizable from those directions.
|
||||
@@ -984,14 +985,14 @@ static void pointer_dispatch_button(SDL_WaylandSeat *seat, Uint8 sdl_button, boo
|
||||
|
||||
if (down) {
|
||||
seat->pointer.buttons_pressed |= SDL_BUTTON_MASK(sdl_button);
|
||||
|
||||
if (sdl_button == SDL_BUTTON_LEFT && Wayland_ProcessHitTest(seat, seat->last_implicit_grab_serial)) {
|
||||
return; // don't pass this event on to app.
|
||||
}
|
||||
} else {
|
||||
seat->pointer.buttons_pressed &= ~SDL_BUTTON_MASK(sdl_button);
|
||||
}
|
||||
|
||||
if (sdl_button == SDL_BUTTON_LEFT && Wayland_ProcessHitTest(seat, seat->last_implicit_grab_serial)) {
|
||||
return; // don't pass this event on to app.
|
||||
}
|
||||
|
||||
// Possibly ignore this click if it was to gain focus.
|
||||
if (window->last_focus_event_time_ns) {
|
||||
if (down && (SDL_GetTicksNS() - window->last_focus_event_time_ns) < WAYLAND_FOCUS_CLICK_TIMEOUT_NS) {
|
||||
|
||||
Reference in New Issue
Block a user