Skip to content

Commit

Permalink
More improvements for bug #373
Browse files Browse the repository at this point in the history
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...
  • Loading branch information
slouken committed Jul 14, 2007
1 parent 3a71f44 commit 7e66b48
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 16 deletions.
37 changes: 26 additions & 11 deletions src/video/quartz/SDL_QuartzEvents.m
Expand Up @@ -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 ) {
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion src/video/quartz/SDL_QuartzVideo.h
Expand Up @@ -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);
Expand Down
8 changes: 4 additions & 4 deletions src/video/quartz/SDL_QuartzWM.m
Expand Up @@ -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) {
Expand All @@ -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);
}
Expand Down

0 comments on commit 7e66b48

Please sign in to comment.