1
0
Fork 0
mirror of https://github.com/Ryujinx/SDL.git synced 2025-01-11 22:55:55 +00:00

cocoa: Ignore first mouse motion event after enabling relative mode.

Fixes .
This commit is contained in:
Ryan C. Gordon 2023-08-01 18:34:03 -04:00
parent 3030fd815c
commit dc5dda0f31
2 changed files with 11 additions and 1 deletions

View file

@ -40,6 +40,8 @@ typedef struct {
/* What location we last saw the cursor move to. */
CGFloat lastMoveX;
CGFloat lastMoveY;
/* If we just turned on relative mode, and should skip a single mouse motion event. */
SDL_bool justEnabledRelative;
} SDL_MouseData;
@interface NSCursor (InvisibleCursor)

View file

@ -293,8 +293,11 @@ static int Cocoa_SetRelativeMouseMode(SDL_bool enabled)
if (enabled) {
if (window) {
/* make sure the mouse isn't at the corner of the window, as this can confuse things if macOS thinks a window resize is happening on the first click. */
SDL_MouseData *mousedriverdata = (SDL_MouseData*)SDL_GetMouse()->driverdata;
const CGPoint point = CGPointMake((float)(window->x + (window->w / 2)), (float)(window->y + (window->h / 2)));
Cocoa_HandleMouseWarp(point.x, point.y);
if (mousedriverdata) {
mousedriverdata->justEnabledRelative = SDL_TRUE;
}
CGWarpMouseCursorPosition(point);
}
DLog("Turning on.");
@ -465,6 +468,11 @@ void Cocoa_HandleMouseEvent(_THIS, NSEvent *event)
seenWarp = driverdata->seenWarp;
driverdata->seenWarp = NO;
if (driverdata->justEnabledRelative) {
driverdata->justEnabledRelative = SDL_FALSE;
return; // dump the first event back.
}
location = [NSEvent mouseLocation];
lastMoveX = driverdata->lastMoveX;
lastMoveY = driverdata->lastMoveY;