Răsfoiți Sursa

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

Fixes #7918.
Ryan C. Gordon 1 an în urmă
părinte
comite
dc5dda0f31
2 a modificat fișierele cu 11 adăugiri și 1 ștergeri
  1. 2 0
      src/video/cocoa/SDL_cocoamouse.h
  2. 9 1
      src/video/cocoa/SDL_cocoamouse.m

+ 2 - 0
src/video/cocoa/SDL_cocoamouse.h

@@ -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)

+ 9 - 1
src/video/cocoa/SDL_cocoamouse.m

@@ -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;