diff --git a/src/posix/cocoa/i_input.mm b/src/posix/cocoa/i_input.mm index 08745e687..3485b0a95 100644 --- a/src/posix/cocoa/i_input.mm +++ b/src/posix/cocoa/i_input.mm @@ -109,7 +109,7 @@ void CheckGUICapture() } } -void CenterCursor() +void SetCursorPosition(const NSPoint position) { NSWindow* window = [NSApp keyWindow]; if (nil == window) @@ -118,15 +118,14 @@ void CenterCursor() } const NSRect displayRect = [[window screen] frame]; - const NSRect windowRect = [window frame]; - const CGPoint centerPoint = CGPointMake(NSMidX(windowRect), displayRect.size.height - NSMidY(windowRect)); + const CGPoint eventPoint = CGPointMake(position.x, displayRect.size.height - position.y); CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState); if (NULL != eventSource) { CGEventRef mouseMoveEvent = CGEventCreateMouseEvent(eventSource, - kCGEventMouseMoved, centerPoint, kCGMouseButtonLeft); + kCGEventMouseMoved, eventPoint, kCGMouseButtonLeft); if (NULL != mouseMoveEvent) { @@ -141,6 +140,20 @@ void CenterCursor() s_skipMouseMoves = 2; } +void CenterCursor() +{ + NSWindow* window = [NSApp keyWindow]; + if (nil == window) + { + return; + } + + const NSRect displayRect = [[window screen] frame]; + const NSRect windowRect = [window frame]; + const NSPoint centerPoint = { NSMidX(windowRect), NSMidY(windowRect) }; + + SetCursorPosition(centerPoint); +} bool IsInGame() { @@ -227,6 +240,7 @@ void I_ReleaseMouseCapture() void I_SetNativeMouse(bool wantNative) { static bool nativeMouse = true; + static NSPoint mouseLocation; if (wantNative != nativeMouse) { @@ -234,6 +248,7 @@ void I_SetNativeMouse(bool wantNative) if (!wantNative) { + mouseLocation = [NSEvent mouseLocation]; CenterCursor(); } @@ -241,6 +256,8 @@ void I_SetNativeMouse(bool wantNative) if (wantNative) { + SetCursorPosition(mouseLocation); + [NSCursor unhide]; } else