Fixed mouse enter/leave events for a single window.
authorSam Lantinga <slouken@libsdl.org>
Sat, 28 Oct 2006 16:41:54 +0000
changeset 2059 4685ccd33d0e
parent 2058 38148947fdcf
child 2060 866052b01ee5
Fixed mouse enter/leave events for a single window. You lose mouse focus in Cocoa when the window is no longer key.
src/video/cocoa/SDL_cocoawindow.m
--- a/src/video/cocoa/SDL_cocoawindow.m	Sat Oct 28 16:41:08 2006 +0000
+++ b/src/video/cocoa/SDL_cocoawindow.m	Sat Oct 28 16:41:54 2006 +0000
@@ -129,6 +129,7 @@
 {
     int index;
 
+    /* We're going to get keyboard events, since we're key. */
     index = _data->videodata->keyboard;
     SDL_SetKeyboardFocus(index, _data->windowID);
 }
@@ -136,7 +137,16 @@
 - (void)windowDidResignKey:(NSNotification *)aNotification
 {
     int index;
+    SDL_Mouse *mouse;
 
+    /* Some other window will get mouse events, since we're not key. */
+    index = _data->videodata->mouse;
+    mouse = SDL_GetMouse(index);
+    if (mouse->focus == _data->windowID) {
+        SDL_SetMouseFocus(index, 0);
+    }
+
+    /* Some other window will get keyboard events, since we're not key. */
     index = _data->videodata->keyboard;
     SDL_SetKeyboardFocus(index, 0);
 }
@@ -227,14 +237,21 @@
 
     index = _data->videodata->mouse;
     mouse = SDL_GetMouse(index);
-    if (mouse->focus != _data->windowID) {
-        SDL_SetMouseFocus(index, _data->windowID);
-    }
 
     point = [NSEvent mouseLocation];
     point.x = point.x - rect.origin.x;
     point.y = rect.size.height - (point.y - rect.origin.y);
-    SDL_SendMouseMotion(index, 0, (int)point.x, (int)point.y);
+    if ( point.x < 0 || point.x >= rect.size.width ||
+         point.y < 0 || point.y >= rect.size.height ) {
+        if (mouse->focus != 0) {
+            SDL_SetMouseFocus(index, 0);
+        }
+    } else {
+        if (mouse->focus != _data->windowID) {
+            SDL_SetMouseFocus(index, _data->windowID);
+        }
+        SDL_SendMouseMotion(index, 0, (int)point.x, (int)point.y);
+    }
 }
 
 - (void)mouseDragged:(NSEvent *)theEvent