Commit cde0d1bc authored by Sam Lantinga's avatar Sam Lantinga

Implemented mouse relative mode on Mac OS X.

parent 9959455a
......@@ -308,8 +308,18 @@ SDL_SetRelativeMouseMode(SDL_bool enabled)
{
SDL_Mouse *mouse = SDL_GetMouse();
/* Flush pending mouse motion */
SDL_FlushEvent(SDL_MOUSEMOTION);
if (enabled == mouse->relative_mode) {
return 0;
}
if (!mouse->SetRelativeMouseMode) {
SDL_Unsupported();
return -1;
}
if (mouse->SetRelativeMouseMode(enabled) < 0) {
return -1;
}
/* Set the relative mode */
mouse->relative_mode = enabled;
......@@ -319,6 +329,9 @@ SDL_SetRelativeMouseMode(SDL_bool enabled)
SDL_WarpMouseInWindow(mouse->focus, mouse->x, mouse->y);
}
/* Flush pending mouse motion */
SDL_FlushEvent(SDL_MOUSEMOTION);
/* Update cursor visibility */
SDL_SetCursor(NULL);
......
......@@ -49,6 +49,9 @@ typedef struct
/* Warp the mouse to (x,y) */
void (*WarpMouse) (SDL_Window * window, int x, int y);
/* Set relative mode */
int (*SetRelativeMouseMode) (SDL_bool enabled);
/* Data common to all mice */
SDL_Window *focus;
int x;
......
......@@ -116,6 +116,23 @@ Cocoa_WarpMouse(SDL_Window * window, int x, int y)
CGWarpMouseCursorPosition(point);
}
static int
Cocoa_SetRelativeMouseMode(SDL_bool enabled)
{
CGError result;
if (enabled) {
result = CGAssociateMouseAndMouseCursorPosition(NO);
} else {
result = CGAssociateMouseAndMouseCursorPosition(YES);
}
if (result != kCGErrorSuccess) {
SDL_SetError("CGAssociateMouseAndMouseCursorPosition() failed");
return -1;
}
return 0;
}
void
Cocoa_InitMouse(_THIS)
{
......@@ -123,8 +140,9 @@ Cocoa_InitMouse(_THIS)
mouse->CreateCursor = Cocoa_CreateCursor;
mouse->ShowCursor = Cocoa_ShowCursor;
mouse->WarpMouse = Cocoa_WarpMouse;
mouse->FreeCursor = Cocoa_FreeCursor;
mouse->WarpMouse = Cocoa_WarpMouse;
mouse->SetRelativeMouseMode = Cocoa_SetRelativeMouseMode;
SDL_SetDefaultCursor(Cocoa_CreateDefaultCursor());
}
......@@ -147,7 +165,13 @@ ConvertMouseButtonToSDL(int button)
void
Cocoa_HandleMouseEvent(_THIS, NSEvent *event)
{
/* We're correctly using views even in fullscreen mode now */
SDL_Mouse *mouse = SDL_GetMouse();
if (mouse->relative_mode && [event type] == NSMouseMoved) {
float x = [event deltaX];
float y = [event deltaY];
SDL_SendMouseMotion(mouse->focus, 1, (int)x, (int)y);
}
}
void
......
......@@ -302,15 +302,14 @@ static __inline__ void ConvertNSRect(NSRect *r)
- (void)mouseMoved:(NSEvent *)theEvent
{
SDL_Mouse *mouse = SDL_GetMouse();
SDL_Window *window = _data->window;
NSPoint point;
int x, y;
#ifdef RELATIVE_MOTION
if (window->flags & SDL_WINDOW_INPUT_GRABBED) {
if (mouse->relative_mode) {
return;
}
#endif
point = [theEvent locationInWindow];
x = (int)point.x;
......@@ -861,19 +860,6 @@ NSPoint origin;
void
Cocoa_SetWindowGrab(_THIS, SDL_Window * window)
{
#ifdef RELATIVE_MOTION
/* FIXME: work in progress
You set relative mode by using the following code in conjunction with
CGDisplayHideCursor(kCGDirectMainDisplay) and
CGDisplayShowCursor(kCGDirectMainDisplay)
*/
if ((window->flags & SDL_WINDOW_INPUT_GRABBED) &&
(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
CGAssociateMouseAndMouseCursorPosition(NO);
} else {
CGAssociateMouseAndMouseCursorPosition(YES);
}
#else
/* Move the cursor to the nearest point in the window */
if ((window->flags & SDL_WINDOW_INPUT_GRABBED) &&
(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
......@@ -885,7 +871,6 @@ Cocoa_SetWindowGrab(_THIS, SDL_Window * window)
cgpoint.y = window->y + y;
CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint);
}
#endif
}
void
......
......@@ -812,7 +812,7 @@ PrintEvent(SDL_Event * event)
{
if (event->type == SDL_MOUSEMOTION) {
/* Mouse motion is really spammy */
return;
//return;
}
fprintf(stderr, "SDL EVENT: ");
......@@ -1044,6 +1044,12 @@ CommonEvent(CommonState * state, SDL_Event * event, int *done)
}
}
break;
case SDLK_r:
if (event->key.keysym.mod & KMOD_CTRL) {
/* Ctrl-R toggle mouse relative mode */
SDL_SetRelativeMouseMode(!SDL_GetRelativeMouseMode());
}
break;
case SDLK_z:
if (event->key.keysym.mod & KMOD_CTRL) {
/* Ctrl-Z minimize */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment