From 3fd59682742e72ebb824611b16426acac4e89da2 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 24 Feb 2011 18:11:29 -0800 Subject: [PATCH] Tracking rectangles had some problems, it's easier to track things directly. (fixes bug 1149, 1147, 1146) --- src/video/cocoa/SDL_cocoawindow.m | 39 +++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index fa6665f00..4604176de 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -66,7 +66,6 @@ - (void)listen:(SDL_WindowData *)data [window setAcceptsMouseMovedEvents:YES]; [view setNextResponder:self]; - [view addTrackingRect:[view visibleRect] owner:self userData:nil assumeInside:NO]; #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 [view setAcceptsTouchEvents:YES]; #endif @@ -152,12 +151,20 @@ - (void)windowDidBecomeKey:(NSNotification *)aNotification SDL_SetKeyboardFocus(window); /* If we just gained focus we need the updated mouse position */ - if (SDL_GetMouseFocus() == window) { + { NSPoint point; - point = [NSEvent mouseLocation]; - point = [_data->nswindow convertScreenToBase:point]; - point.y = window->h - point.y; - SDL_SendMouseMotion(window, 0, (int)point.x, (int)point.y); + int x, y; + + point = [_data->nswindow mouseLocationOutsideOfEventStream]; + x = (int)point.x; + y = (int)(window->h - point.y); + + if (x >= 0 && x < window->w && y >= 0 && y < window->h) { + if (SDL_GetMouseFocus() != window) { + [self mouseEntered:nil]; + } + SDL_SendMouseMotion(window, 0, x, y); + } } /* Check to see if someone updated the clipboard */ @@ -288,6 +295,8 @@ - (void)mouseExited:(NSEvent *)theEvent - (void)mouseMoved:(NSEvent *)theEvent { SDL_Window *window = _data->window; + NSPoint point; + int x, y; #ifdef RELATIVE_MOTION if (window->flags & SDL_WINDOW_INPUT_GRABBED) { @@ -295,13 +304,19 @@ - (void)mouseMoved:(NSEvent *)theEvent } #endif - if (SDL_GetMouseFocus() == window) { - NSPoint point; - - point = [theEvent locationInWindow]; - point.y = window->h - point.y; + point = [theEvent locationInWindow]; + x = (int)point.x; + y = (int)(window->h - point.y); - SDL_SendMouseMotion(window, 0, (int)point.x, (int)point.y); + if (x < 0 || x >= window->w || y < 0 || y >= window->h) { + if (SDL_GetMouseFocus() == window) { + [self mouseExited:theEvent]; + } + } else { + if (SDL_GetMouseFocus() != window) { + [self mouseEntered:theEvent]; + } + SDL_SendMouseMotion(window, 0, x, y); } }