From 5b3f6e0424b03cd6703c5cf9c7a7fe8e7d1f39f8 Mon Sep 17 00:00:00 2001 From: "J?rgen P. Tjern?" Date: Thu, 25 Apr 2013 18:40:29 -0700 Subject: [PATCH] Mac: Fix relative mode message after gaining focus. This fixes a bug where relative mode would give a large jump if the cursor was moved when the app doesn't have focus. --- src/events/SDL_mouse_c.h | 3 +++ src/video/cocoa/SDL_cocoamouse.h | 7 +++++++ src/video/cocoa/SDL_cocoamouse.m | 25 ++++++++++++++++++++++--- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/events/SDL_mouse_c.h b/src/events/SDL_mouse_c.h index 7cb13cb3d..9994bc640 100644 --- a/src/events/SDL_mouse_c.h +++ b/src/events/SDL_mouse_c.h @@ -73,6 +73,9 @@ typedef struct SDL_Cursor *def_cursor; SDL_Cursor *cur_cursor; SDL_bool cursor_shown; + + /* Driver-dependent data. */ + void *driverdata; } SDL_Mouse; diff --git a/src/video/cocoa/SDL_cocoamouse.h b/src/video/cocoa/SDL_cocoamouse.h index 992af549f..0e5822ab3 100644 --- a/src/video/cocoa/SDL_cocoamouse.h +++ b/src/video/cocoa/SDL_cocoamouse.h @@ -23,11 +23,18 @@ #ifndef _SDL_cocoamouse_h #define _SDL_cocoamouse_h +#include "SDL_cocoavideo.h" + extern void Cocoa_InitMouse(_THIS); extern void Cocoa_HandleMouseEvent(_THIS, NSEvent * event); extern void Cocoa_HandleMouseWheel(SDL_Window *window, NSEvent * event); extern void Cocoa_QuitMouse(_THIS); +typedef struct { + int deltaXOffset; + int deltaYOffset; +} SDL_MouseData; + #endif /* _SDL_cocoamouse_h */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/cocoa/SDL_cocoamouse.m b/src/video/cocoa/SDL_cocoamouse.m index 23e8796e0..2c0f2b7d6 100644 --- a/src/video/cocoa/SDL_cocoamouse.m +++ b/src/video/cocoa/SDL_cocoamouse.m @@ -24,7 +24,7 @@ #include "SDL_assert.h" #include "SDL_events.h" -#include "SDL_cocoavideo.h" +#include "SDL_cocoamouse.h" #include "../../events/SDL_mouse_c.h" @@ -193,6 +193,16 @@ point.x = (float)window->x + x; point.y = (float)window->y + y; + { + /* This makes Cocoa_HandleMouseEvent ignore this delta in the next + * movement event. + */ + SDL_MouseData *driverdata = (SDL_MouseData*)mouse->driverdata; + NSPoint location = [NSEvent mouseLocation]; + driverdata->deltaXOffset = location.x - point.x; + driverdata->deltaYOffset = point.y - location.y; + } + /* According to the docs, this was deprecated in 10.6, but it's still * around. The substitute requires a CGEventSource, but I'm not entirely * sure how we'd procure the right one for this event. @@ -228,6 +238,8 @@ { SDL_Mouse *mouse = SDL_GetMouse(); + mouse->driverdata = SDL_calloc(1, sizeof(SDL_MouseData)); + mouse->CreateCursor = Cocoa_CreateCursor; mouse->CreateSystemCursor = Cocoa_CreateSystemCursor; mouse->ShowCursor = Cocoa_ShowCursor; @@ -248,8 +260,11 @@ [event type] == NSLeftMouseDragged || [event type] == NSRightMouseDragged || [event type] == NSOtherMouseDragged)) { - float x = [event deltaX]; - float y = [event deltaY]; + SDL_MouseData *driverdata = (SDL_MouseData*)mouse->driverdata; + float x = [event deltaX] + driverdata->deltaXOffset; + float y = [event deltaY] + driverdata->deltaYOffset; + driverdata->deltaXOffset = driverdata->deltaYOffset = 0; + SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 1, (int)x, (int)y); } } @@ -278,6 +293,10 @@ void Cocoa_QuitMouse(_THIS) { + SDL_Mouse *mouse = SDL_GetMouse(); + if (mouse) { + SDL_free(mouse->driverdata); + } } #endif /* SDL_VIDEO_DRIVER_COCOA */