Skip to content

Commit

Permalink
Fixed bug 4255 - SDL_GetGlobalMouseState() returns incorrect Y on sec…
Browse files Browse the repository at this point in the history
…ondary display

Julian Raschke

I use an open Mac laptop with an additional external monitor. The coordinate spaces from SDL_GetGlobalMouseState() and SDL_GetWindowPosition() match on the primary display, but not on the secondary display.

Cocoa window coordinates are vertically flipped in relation to the primary display:

https://github.com/spurious/SDL-mirror/blob/release-2.0.8/src/video/cocoa/SDL_cocoawindow.m#L219-L222

However, Cocoa_GetGlobalMouseState inverts the cursor Y coordinate per-display:

https://github.com/spurious/SDL-mirror/blob/release-2.0.8/src/video/cocoa/SDL_cocoamouse.m#L320-L323

Suggested fix: Replace the for-loop with this simpler calculation:

    *x = (int) cocoaLocation.x;
    *y = (int) (CGDisplayPixelsHigh(kCGDirectMainDisplay) - cocoaLocation.y);
  • Loading branch information
slouken committed Jan 5, 2019
1 parent 5e13087 commit d4c0f49
Showing 1 changed file with 2 additions and 8 deletions.
10 changes: 2 additions & 8 deletions src/video/cocoa/SDL_cocoamouse.m
Expand Up @@ -315,14 +315,8 @@ + (NSCursor *)invisibleCursor
const NSPoint cocoaLocation = [NSEvent mouseLocation];
Uint32 retval = 0;

for (NSScreen *screen in [NSScreen screens]) {
NSRect frame = [screen frame];
if (NSMouseInRect(cocoaLocation, frame, NO)) {
*x = (int) cocoaLocation.x;
*y = (int) ((frame.origin.y + frame.size.height) - cocoaLocation.y);
break;
}
}
*x = (int) cocoaLocation.x;
*y = (int) (CGDisplayPixelsHigh(kCGDirectMainDisplay) - cocoaLocation.y);

retval |= (cocoaButtons & (1 << 0)) ? SDL_BUTTON_LMASK : 0;
retval |= (cocoaButtons & (1 << 1)) ? SDL_BUTTON_RMASK : 0;
Expand Down

0 comments on commit d4c0f49

Please sign in to comment.