Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Mac: Fix relative mode message after gaining focus.
Browse files Browse the repository at this point in the history
This fixes a bug where relative mode would give a large jump if the
cursor was moved when the app doesn't have focus.
  • Loading branch information
jorgenpt committed Apr 26, 2013
1 parent 131844f commit 5b3f6e0
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 3 deletions.
3 changes: 3 additions & 0 deletions src/events/SDL_mouse_c.h
Expand Up @@ -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;


Expand Down
7 changes: 7 additions & 0 deletions src/video/cocoa/SDL_cocoamouse.h
Expand Up @@ -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: */
25 changes: 22 additions & 3 deletions src/video/cocoa/SDL_cocoamouse.m
Expand Up @@ -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"

Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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;
Expand All @@ -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);
}
}
Expand Down Expand Up @@ -278,6 +293,10 @@
void
Cocoa_QuitMouse(_THIS)
{
SDL_Mouse *mouse = SDL_GetMouse();
if (mouse) {
SDL_free(mouse->driverdata);
}
}

#endif /* SDL_VIDEO_DRIVER_COCOA */
Expand Down

0 comments on commit 5b3f6e0

Please sign in to comment.