diff --git a/src/video/cocoa/SDL_cocoamouse.m b/src/video/cocoa/SDL_cocoamouse.m index 4ea420d22..f0480603d 100644 --- a/src/video/cocoa/SDL_cocoamouse.m +++ b/src/video/cocoa/SDL_cocoamouse.m @@ -207,42 +207,18 @@ Cocoa_ShowCursor(SDL_Cursor * cursor) return 0; } -static void -Cocoa_WarpMouse(SDL_Window * window, int x, int y) -{ - SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - if ([data->listener isMoving]) { - DLog("Postponing warp, window being moved."); - [data->listener setPendingMoveX:x - Y:y]; - return; - } - - SDL_Mouse *mouse = SDL_GetMouse(); - CGPoint point = CGPointMake(x + (float)window->x, y + (float)window->y); - - Cocoa_HandleMouseWarp(point.x, point.y); - - /* According to the docs, this was deprecated in 10.6, but it's still - * around. The substitute requires a CGEventSource, but I'm not entirely - * sure how we'd procure the right one for this event. - */ - CGSetLocalEventsSuppressionInterval(0.0); - CGWarpMouseCursorPosition(point); - CGSetLocalEventsSuppressionInterval(0.25); - - if (!mouse->relative_mode) { - /* CGWarpMouseCursorPosition doesn't generate a window event, unlike our - * other implementations' APIs. - */ - SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 0, x, y); - } -} - static void Cocoa_WarpMouseGlobal(int x, int y) { SDL_Mouse *mouse = SDL_GetMouse(); + if (mouse->focus) { + SDL_WindowData *data = (SDL_WindowData *) mouse->focus->driverdata; + if ([data->listener isMoving]) { + DLog("Postponing warp, window being moved."); + [data->listener setPendingMoveX:x Y:y]; + return; + } + } CGPoint point = CGPointMake((float)x, (float)y); Cocoa_HandleMouseWarp(point.x, point.y); @@ -263,6 +239,12 @@ Cocoa_WarpMouseGlobal(int x, int y) } } +static void +Cocoa_WarpMouse(SDL_Window * window, int x, int y) +{ + Cocoa_WarpMouseGlobal(x + window->x, y + window->y); +} + static int Cocoa_SetRelativeMouseMode(SDL_bool enabled) { diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 63d6f211d..29bba457c 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -103,8 +103,7 @@ static Uint32 s_moveHack; static void ConvertNSRect(NSScreen *screen, BOOL fullscreen, NSRect *r) { - NSRect visibleScreen = fullscreen ? [screen frame] : [screen visibleFrame]; - r->origin.y = (visibleScreen.origin.y + visibleScreen.size.height) - r->origin.y - r->size.height; + r->origin.y = CGDisplayPixelsHigh(kCGDirectMainDisplay) - r->origin.y - r->size.height; } static void @@ -389,11 +388,11 @@ SetWindowStyle(SDL_Window * window, unsigned int style) isMoving = NO; SDL_Mouse *mouse = SDL_GetMouse(); - if (pendingWindowWarpX >= 0 && pendingWindowWarpY >= 0) { - mouse->WarpMouse(_data->window, pendingWindowWarpX, pendingWindowWarpY); - pendingWindowWarpX = pendingWindowWarpY = -1; + if (pendingWindowWarpX != INT_MAX && pendingWindowWarpY != INT_MAX) { + mouse->WarpMouseGlobal(pendingWindowWarpX, pendingWindowWarpY); + pendingWindowWarpX = pendingWindowWarpY = INT_MAX; } - if (mouse->relative_mode && SDL_GetMouseFocus() == _data->window) { + if (mouse->relative_mode && !mouse->relative_mode_warp && mouse->focus == _data->window) { mouse->SetRelativeMouseMode(SDL_TRUE); } } @@ -413,7 +412,7 @@ SetWindowStyle(SDL_Window * window, unsigned int style) - (void)windowWillMove:(NSNotification *)aNotification { if ([_data->nswindow isKindOfClass:[SDLWindow class]]) { - pendingWindowWarpX = pendingWindowWarpY = -1; + pendingWindowWarpX = pendingWindowWarpY = INT_MAX; isMoving = YES; } } @@ -500,7 +499,7 @@ SetWindowStyle(SDL_Window * window, unsigned int style) { SDL_Window *window = _data->window; SDL_Mouse *mouse = SDL_GetMouse(); - if (mouse->relative_mode && ![self isMoving]) { + if (mouse->relative_mode && !mouse->relative_mode_warp && ![self isMoving]) { mouse->SetRelativeMouseMode(SDL_TRUE); } @@ -532,7 +531,7 @@ SetWindowStyle(SDL_Window * window, unsigned int style) - (void)windowDidResignKey:(NSNotification *)aNotification { SDL_Mouse *mouse = SDL_GetMouse(); - if (mouse->relative_mode) { + if (mouse->relative_mode && !mouse->relative_mode_warp) { mouse->SetRelativeMouseMode(SDL_FALSE); }