diff --git a/src/video/quartz/SDL_QuartzEvents.m b/src/video/quartz/SDL_QuartzEvents.m index 2edc4b8a0..2c91d06c2 100644 --- a/src/video/quartz/SDL_QuartzEvents.m +++ b/src/video/quartz/SDL_QuartzEvents.m @@ -623,11 +623,22 @@ static void QZ_GetMouseLocation (_THIS, NSPoint *p) { void QZ_DoActivate (_THIS) { - SDL_PrivateAppActive (1, SDL_APPINPUTFOCUS | (QZ_IsMouseInWindow (this) ? SDL_APPMOUSEFOCUS : 0)); - - /* Hide the cursor if it was hidden by SDL_ShowCursor() */ - if (!cursor_should_be_visible) - QZ_HideMouse (this); + BOOL isInGameWin = QZ_IsMouseInWindow (this); + + SDL_PrivateAppActive (1, SDL_APPINPUTFOCUS | (isInGameWin ? SDL_APPMOUSEFOCUS : 0)); + + /* Reset the cursor state */ + /* FIXME: This doesn't currently work... + Apparently you can't set the cursor inside windowDidBecomeKey + */ + if ( isInGameWin ) { + if (cursor_should_be_visible) + SDL_SetCursor (NULL); + else + QZ_HideMouse (this); + } else { + QZ_ShowMouse (this, [NSCursor arrowCursor]); + } /* Regrab input, only if it was previously grabbed */ if ( current_grab_mode == SDL_GRAB_ON ) { @@ -656,7 +667,7 @@ void QZ_DoDeactivate (_THIS) { /* Show the cursor if it was hidden by SDL_ShowCursor() */ if (!cursor_should_be_visible) - QZ_ShowMouse (this); + QZ_ShowMouse (this, [NSCursor arrowCursor]); } void QZ_SleepNotificationHandler (void * refcon, @@ -870,8 +881,7 @@ void QZ_PumpEvents (_THIS) into the game window. This still generates a mouse moved event, but not as a result of the warp (so it's in the right direction). */ - if ( grab_state == QZ_VISIBLE_GRAB && - !isInGameWin ) { + if ( grab_state == QZ_VISIBLE_GRAB && !isInGameWin ) { NSPoint p; QZ_GetMouseLocation (this, &p); @@ -909,15 +919,20 @@ void QZ_PumpEvents (_THIS) cursor enters the window again, making it obvious to the user that the grab is broken.*/ CGAssociateMouseAndMouseCursorPosition (1); - if (!cursor_should_be_visible) - QZ_ShowMouse (this); + + QZ_ShowMouse (this, [NSCursor arrowCursor]); } else if ( isInGameWin && (SDL_GetAppState() & (SDL_APPMOUSEFOCUS | SDL_APPINPUTFOCUS)) == SDL_APPINPUTFOCUS ) { SDL_PrivateAppActive (1, SDL_APPMOUSEFOCUS); - if (!cursor_should_be_visible) + + if (cursor_should_be_visible) { + SDL_SetCursor (NULL); + } else { QZ_HideMouse (this); + } + if (grab_state == QZ_INVISIBLE_GRAB) { /*see comment above*/ QZ_PrivateWarpCursor (this, SDL_VideoSurface->w / 2, SDL_VideoSurface->h / 2); CGAssociateMouseAndMouseCursorPosition (0); diff --git a/src/video/quartz/SDL_QuartzVideo.h b/src/video/quartz/SDL_QuartzVideo.h index 7ffedbf71..e480bfa50 100644 --- a/src/video/quartz/SDL_QuartzVideo.h +++ b/src/video/quartz/SDL_QuartzVideo.h @@ -224,7 +224,7 @@ SDL_Overlay* QZ_CreateYUVOverlay (_THIS, int width, int height, void QZ_PrivateWarpCursor (_THIS, int x, int y); void QZ_ChangeGrabState (_THIS, int action); void QZ_RegisterForSleepNotifications (_THIS); -void QZ_ShowMouse (_THIS); +void QZ_ShowMouse (_THIS, NSCursor *cursor); void QZ_HideMouse (_THIS); void QZ_PrivateGlobalToLocal (_THIS, NSPoint *p); void QZ_PrivateCocoaToSDL (_THIS, NSPoint *p); diff --git a/src/video/quartz/SDL_QuartzWM.m b/src/video/quartz/SDL_QuartzWM.m index 37e7ececb..eee652c53 100644 --- a/src/video/quartz/SDL_QuartzWM.m +++ b/src/video/quartz/SDL_QuartzWM.m @@ -90,11 +90,12 @@ outOfMemory: return(NULL); } -void QZ_ShowMouse (_THIS) { +void QZ_ShowMouse (_THIS, NSCursor *cursor) { if (!cursor_visible) { [ NSCursor unhide ]; cursor_visible = YES; } + [ cursor set ]; } void QZ_HideMouse (_THIS) { @@ -116,16 +117,15 @@ BOOL QZ_IsMouseInWindow (_THIS) { int QZ_ShowWMCursor (_THIS, WMcursor *cursor) { if ( cursor == NULL) { + QZ_HideMouse (this); if ( cursor_should_be_visible ) { - QZ_HideMouse (this); cursor_should_be_visible = NO; QZ_ChangeGrabState (this, QZ_HIDECURSOR); } } else { - [ cursor->nscursor set ]; + QZ_ShowMouse (this, cursor->nscursor); if ( ! cursor_should_be_visible ) { - QZ_ShowMouse (this); cursor_should_be_visible = YES; QZ_ChangeGrabState (this, QZ_SHOWCURSOR); }