diff --git a/src/video/quartz/SDL_QuartzEvents.m b/src/video/quartz/SDL_QuartzEvents.m index 2dc7de9c6..c6e8ed79e 100644 --- a/src/video/quartz/SDL_QuartzEvents.m +++ b/src/video/quartz/SDL_QuartzEvents.m @@ -316,8 +316,6 @@ static void QZ_DoActivate (_THIS) QZ_PrivateWarpCursor (this, cursor_loc.x, cursor_loc.y); QZ_ChangeGrabState (this, QZ_ENABLE_GRAB); } - - SDL_PrivateAppActive (1, SDL_APPINPUTFOCUS); } static void QZ_DoDeactivate (_THIS) { @@ -334,8 +332,6 @@ static void QZ_DoDeactivate (_THIS) { /* Show the cursor if it was hidden by SDL_ShowCursor() */ if (!cursor_should_be_visible) QZ_ShowMouse (this); - - SDL_PrivateAppActive (0, SDL_APPINPUTFOCUS); } void QZ_SleepNotificationHandler (void * refcon, @@ -462,7 +458,7 @@ void QZ_PumpEvents (_THIS) type = [ event type ]; isForGameWin = (qz_window == [ event window ]); - isInGameWin = (mode_flags & SDL_FULLSCREEN) ? true : NSPointInRect([event locationInWindow], [ window_view frame ]); + isInGameWin = QZ_IsMouseInWindow (this); switch (type) { case NSLeftMouseDown: if ( getenv("SDL_HAS3BUTTONMOUSE") ) { @@ -538,7 +534,7 @@ void QZ_PumpEvents (_THIS) provides the first known mouse position, since everything after this uses deltas */ - NSPoint p = [ event locationInWindow ]; + NSPoint p = [ qz_window mouseLocationOutsideOfEventStream ]; QZ_PrivateCocoaToSDL (this, &p); SDL_PrivateMouseMotion (0, 0, p.x, p.y); firstMouseEvent = 0; @@ -561,7 +557,7 @@ void QZ_PumpEvents (_THIS) if ( grab_state == QZ_VISIBLE_GRAB && !isInGameWin ) { - NSPoint p = [ event locationInWindow ]; + NSPoint p = [ qz_window mouseLocationOutsideOfEventStream ]; QZ_PrivateCocoaToSDL (this, &p); if ( p.x < 0.0 ) @@ -582,11 +578,15 @@ void QZ_PumpEvents (_THIS) if ( !isInGameWin && (SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { SDL_PrivateAppActive (0, SDL_APPMOUSEFOCUS); + if (!cursor_should_be_visible) + QZ_ShowMouse (this); } else if ( isInGameWin && !(SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { SDL_PrivateAppActive (1, SDL_APPMOUSEFOCUS); + if (!cursor_should_be_visible) + QZ_HideMouse (this); } break; case NSScrollWheel: diff --git a/src/video/quartz/SDL_QuartzVideo.h b/src/video/quartz/SDL_QuartzVideo.h index 6554b52c8..f6daf2b91 100644 --- a/src/video/quartz/SDL_QuartzVideo.h +++ b/src/video/quartz/SDL_QuartzVideo.h @@ -216,4 +216,4 @@ void QZ_ShowMouse (_THIS); void QZ_HideMouse (_THIS); void QZ_PrivateGlobalToLocal (_THIS, NSPoint *p); void QZ_PrivateCocoaToSDL (_THIS, NSPoint *p); - +BOOL QZ_IsMouseInWindow (_THIS); diff --git a/src/video/quartz/SDL_QuartzVideo.m b/src/video/quartz/SDL_QuartzVideo.m index d63450125..57cd8fc84 100644 --- a/src/video/quartz/SDL_QuartzVideo.m +++ b/src/video/quartz/SDL_QuartzVideo.m @@ -202,6 +202,7 @@ static int QZ_VideoInit (_THIS, SDL_PixelFormat *video_format) { /* Set misc globals */ current_grab_mode = SDL_GRAB_OFF; cursor_should_be_visible = YES; + cursor_visible = YES; /* register for sleep notifications so wake from sleep generates SDL_VIDEOEXPOSE */ QZ_RegisterForSleepNotifications (this); diff --git a/src/video/quartz/SDL_QuartzWM.m b/src/video/quartz/SDL_QuartzWM.m index bcddb0e5e..066c5f981 100644 --- a/src/video/quartz/SDL_QuartzWM.m +++ b/src/video/quartz/SDL_QuartzWM.m @@ -77,12 +77,17 @@ void QZ_ShowMouse (_THIS) { } void QZ_HideMouse (_THIS) { - if (cursor_visible) { + BOOL isInGameWin = QZ_IsMouseInWindow (this); + if (isInGameWin && cursor_visible) { [ NSCursor hide ]; cursor_visible = NO; } } +BOOL QZ_IsMouseInWindow (_THIS) { + return (mode_flags & SDL_FULLSCREEN) ? true : NSPointInRect([ qz_window mouseLocationOutsideOfEventStream ], [ window_view frame ]); +} + int QZ_ShowWMCursor (_THIS, WMcursor *cursor) { if ( cursor == NULL) { diff --git a/src/video/quartz/SDL_QuartzWindow.m b/src/video/quartz/SDL_QuartzWindow.m index d6ffddf27..0228a21a0 100644 --- a/src/video/quartz/SDL_QuartzWindow.m +++ b/src/video/quartz/SDL_QuartzWindow.m @@ -204,4 +204,27 @@ static void QZ_SetPortAlphaOpaque () { SDL_PrivateQuit(); return NO; } + +- (void)windowDidBecomeKey:(NSNotification *)aNotification +{ + SDL_PrivateAppActive (1, SDL_APPINPUTFOCUS); +} + +- (void)windowDidResignKey:(NSNotification *)aNotification +{ + SDL_PrivateAppActive (0, SDL_APPINPUTFOCUS); +} + +- (void)windowDidBecomeMain:(NSNotification *)aNotification +{ + SDL_VideoDevice *this = (SDL_VideoDevice*)current_video; + if (this && QZ_IsMouseInWindow (this)) + SDL_PrivateAppActive (1, SDL_APPMOUSEFOCUS); +} + +- (void)windowDidResignMain:(NSNotification *)aNotification +{ + SDL_PrivateAppActive (0, SDL_APPMOUSEFOCUS); +} + @end