# HG changeset patch # User Wim Looman # Date 1328263728 -46800 # Node ID 43d4e29a5dfc8f3343127578047d38183b1c1a4c # Parent 07e08cb5869602f5771ff5a61f4ef5b76e8a4cba Fix null reference exception. Occurred when using relative mouse mode without a focused window. diff -r 07e08cb58696 -r 43d4e29a5dfc src/events/SDL_mouse.c --- a/src/events/SDL_mouse.c Sat Jan 28 14:53:23 2012 -0500 +++ b/src/events/SDL_mouse.c Fri Feb 03 23:08:48 2012 +1300 @@ -323,7 +323,7 @@ /* Set the relative mode */ mouse->relative_mode = enabled; - if (!enabled) { + if (!enabled && mouse->focus) { /* Restore the expected mouse position */ SDL_WarpMouseInWindow(mouse->focus, mouse->x, mouse->y); } # HG changeset patch # User Wim Looman # Date 1328266431 -46800 # Node ID 2688fd67db682b8f907c71b8e0516a46fa9a7f14 # Parent 43d4e29a5dfc8f3343127578047d38183b1c1a4c Change SDL_SetCursor to set the cursor back to the default cursor when the window is unfocused. diff -r 43d4e29a5dfc -r 2688fd67db68 src/events/SDL_mouse.c --- a/src/events/SDL_mouse.c Fri Feb 03 23:08:48 2012 +1300 +++ b/src/events/SDL_mouse.c Fri Feb 03 23:53:51 2012 +1300 @@ -465,7 +465,11 @@ } mouse->cur_cursor = cursor; } else { - cursor = mouse->cur_cursor; + if (mouse->focus) { + cursor = mouse->cur_cursor; + } else { + cursor = mouse->def_cursor; + } } if (cursor && mouse->cursor_shown && !mouse->relative_mode) { diff -r 43d4e29a5dfc -r 2688fd67db68 src/video/cocoa/SDL_cocoamouse.m --- a/src/video/cocoa/SDL_cocoamouse.m Fri Feb 03 23:08:48 2012 +1300 +++ b/src/video/cocoa/SDL_cocoamouse.m Fri Feb 03 23:53:51 2012 +1300 @@ -92,15 +92,13 @@ { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - if (SDL_GetMouseFocus()) { - if (cursor) { - NSCursor *nscursor = (NSCursor *)cursor->driverdata; + if (cursor) { + NSCursor *nscursor = (NSCursor *)cursor->driverdata; - [nscursor set]; - [NSCursor unhide]; - } else { - [NSCursor hide]; - } + [nscursor set]; + [NSCursor unhide]; + } else { + [NSCursor hide]; } [pool release]; diff -r 43d4e29a5dfc -r 2688fd67db68 src/video/cocoa/SDL_cocoawindow.m --- a/src/video/cocoa/SDL_cocoawindow.m Fri Feb 03 23:08:48 2012 +1300 +++ b/src/video/cocoa/SDL_cocoawindow.m Fri Feb 03 23:53:51 2012 +1300 @@ -313,9 +313,7 @@ CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint); } else { SDL_SetMouseFocus(NULL); - - [[NSCursor arrowCursor] set]; - [NSCursor unhide]; + SDL_SetCursor(NULL); } } } # HG changeset patch # User Wim Looman # Date 1328267601 -46800 # Node ID 0d5148d1e578c2a9eb35f3afe2b541d1e48c90e5 # Parent 2688fd67db682b8f907c71b8e0516a46fa9a7f14 Make mouse relative mode save the original co-ordinates to restore them properly. diff -r 2688fd67db68 -r 0d5148d1e578 src/events/SDL_mouse.c --- a/src/events/SDL_mouse.c Fri Feb 03 23:53:51 2012 +1300 +++ b/src/events/SDL_mouse.c Sat Feb 04 00:13:21 2012 +1300 @@ -323,9 +323,13 @@ /* Set the relative mode */ mouse->relative_mode = enabled; - if (!enabled && mouse->focus) { + if (enabled) { + /* Save the expected mouse position */ + mouse->original_x = mouse->x; + mouse->original_y = mouse->y; + } else if (mouse->focus) { /* Restore the expected mouse position */ - SDL_WarpMouseInWindow(mouse->focus, mouse->x, mouse->y); + SDL_WarpMouseInWindow(mouse->focus, mouse->original_x, mouse->original_y); } /* Flush pending mouse motion */ diff -r 2688fd67db68 -r 0d5148d1e578 src/events/SDL_mouse_c.h --- a/src/events/SDL_mouse_c.h Fri Feb 03 23:53:51 2012 +1300 +++ b/src/events/SDL_mouse_c.h Sat Feb 04 00:13:21 2012 +1300 @@ -60,6 +60,8 @@ int last_x, last_y; /* the last reported x and y coordinates */ Uint8 buttonstate; SDL_bool relative_mode; + /* the x and y coordinates when relative mode was activated */ + int original_x, original_y; SDL_Cursor *cursors; SDL_Cursor *def_cursor;