From 7e66b482592becf64ff85a3dfe3e9037ff1023be Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 14 Jul 2007 08:27:06 +0000 Subject: [PATCH] More improvements for bug #373 Show the SDL cursor in the window and the arrow cursor outside the window. This is also supposed to show the SDL cursor when activated, but that code isn't working yet... --- src/video/quartz/SDL_QuartzEvents.m | 37 ++++++++++++++++++++--------- src/video/quartz/SDL_QuartzVideo.h | 2 +- src/video/quartz/SDL_QuartzWM.m | 8 +++---- 3 files changed, 31 insertions(+), 16 deletions(-) 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 @@ multiple identical calls to SDL_PrivateMouseMotion(), 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 @@ disassociated from the mouse (and therefore 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 @@ void QZ_FreeWMCursor (_THIS, WMcursor *cursor) { 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); }