Tracking rectangles had some problems, it's easier to track things directly. (fixes bug 1149, 1147, 1146)
--- 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);
}
}