Tracking rectangles had some problems, it's easier to track things directly. (fixes bug 1149, 1147, 1146)
authorSam Lantinga <slouken@libsdl.org>
Thu, 24 Feb 2011 18:11:29 -0800
changeset 5396 109b7c071f70
parent 5395 f0e399961f3a
child 5397 88ff1f463134
Tracking rectangles had some problems, it's easier to track things directly. (fixes bug 1149, 1147, 1146)
src/video/cocoa/SDL_cocoawindow.m
--- a/src/video/cocoa/SDL_cocoawindow.m	Thu Feb 24 17:52:47 2011 -0800
+++ b/src/video/cocoa/SDL_cocoawindow.m	Thu Feb 24 18:11:29 2011 -0800
@@ -66,7 +66,6 @@
     [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 @@
     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)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 @@
     }
 #endif
 
-    if (SDL_GetMouseFocus() == window) {
-        NSPoint point;
+    point = [theEvent locationInWindow];
+    x = (int)point.x;
+    y = (int)(window->h - point.y);
 
-        point = [theEvent locationInWindow];
-        point.y = 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);
     }
 }