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) ...@@ -308,8 +308,18 @@ SDL_SetRelativeMouseMode(SDL_bool enabled)
{ {
SDL_Mouse *mouse = SDL_GetMouse(); SDL_Mouse *mouse = SDL_GetMouse();
/* Flush pending mouse motion */ if (enabled == mouse->relative_mode) {
SDL_FlushEvent(SDL_MOUSEMOTION); return 0;
}
if (!mouse->SetRelativeMouseMode) {
SDL_Unsupported();
return -1;
}
if (mouse->SetRelativeMouseMode(enabled) < 0) {
return -1;
}
/* Set the relative mode */ /* Set the relative mode */
mouse->relative_mode = enabled; mouse->relative_mode = enabled;
...@@ -319,6 +329,9 @@ SDL_SetRelativeMouseMode(SDL_bool enabled) ...@@ -319,6 +329,9 @@ SDL_SetRelativeMouseMode(SDL_bool enabled)
SDL_WarpMouseInWindow(mouse->focus, mouse->x, mouse->y); SDL_WarpMouseInWindow(mouse->focus, mouse->x, mouse->y);
} }
/* Flush pending mouse motion */
SDL_FlushEvent(SDL_MOUSEMOTION);
/* Update cursor visibility */ /* Update cursor visibility */
SDL_SetCursor(NULL); SDL_SetCursor(NULL);
......
...@@ -49,6 +49,9 @@ typedef struct ...@@ -49,6 +49,9 @@ typedef struct
/* Warp the mouse to (x,y) */ /* Warp the mouse to (x,y) */
void (*WarpMouse) (SDL_Window * window, int x, int y); void (*WarpMouse) (SDL_Window * window, int x, int y);
/* Set relative mode */
int (*SetRelativeMouseMode) (SDL_bool enabled);
/* Data common to all mice */ /* Data common to all mice */
SDL_Window *focus; SDL_Window *focus;
int x; int x;
......
...@@ -116,6 +116,23 @@ Cocoa_WarpMouse(SDL_Window * window, int x, int y) ...@@ -116,6 +116,23 @@ Cocoa_WarpMouse(SDL_Window * window, int x, int y)
CGWarpMouseCursorPosition(point); 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 void
Cocoa_InitMouse(_THIS) Cocoa_InitMouse(_THIS)
{ {
...@@ -123,8 +140,9 @@ Cocoa_InitMouse(_THIS) ...@@ -123,8 +140,9 @@ Cocoa_InitMouse(_THIS)
mouse->CreateCursor = Cocoa_CreateCursor; mouse->CreateCursor = Cocoa_CreateCursor;
mouse->ShowCursor = Cocoa_ShowCursor; mouse->ShowCursor = Cocoa_ShowCursor;
mouse->WarpMouse = Cocoa_WarpMouse;
mouse->FreeCursor = Cocoa_FreeCursor; mouse->FreeCursor = Cocoa_FreeCursor;
mouse->WarpMouse = Cocoa_WarpMouse;
mouse->SetRelativeMouseMode = Cocoa_SetRelativeMouseMode;
SDL_SetDefaultCursor(Cocoa_CreateDefaultCursor()); SDL_SetDefaultCursor(Cocoa_CreateDefaultCursor());
} }
...@@ -147,7 +165,13 @@ ConvertMouseButtonToSDL(int button) ...@@ -147,7 +165,13 @@ ConvertMouseButtonToSDL(int button)
void void
Cocoa_HandleMouseEvent(_THIS, NSEvent *event) 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 void
......
...@@ -302,15 +302,14 @@ static __inline__ void ConvertNSRect(NSRect *r) ...@@ -302,15 +302,14 @@ static __inline__ void ConvertNSRect(NSRect *r)
- (void)mouseMoved:(NSEvent *)theEvent - (void)mouseMoved:(NSEvent *)theEvent
{ {
SDL_Mouse *mouse = SDL_GetMouse();
SDL_Window *window = _data->window; SDL_Window *window = _data->window;
NSPoint point; NSPoint point;
int x, y; int x, y;
#ifdef RELATIVE_MOTION if (mouse->relative_mode) {
if (window->flags & SDL_WINDOW_INPUT_GRABBED) {
return; return;
} }
#endif
point = [theEvent locationInWindow]; point = [theEvent locationInWindow];
x = (int)point.x; x = (int)point.x;
...@@ -861,19 +860,6 @@ NSPoint origin; ...@@ -861,19 +860,6 @@ NSPoint origin;
void void
Cocoa_SetWindowGrab(_THIS, SDL_Window * window) 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 */ /* Move the cursor to the nearest point in the window */
if ((window->flags & SDL_WINDOW_INPUT_GRABBED) && if ((window->flags & SDL_WINDOW_INPUT_GRABBED) &&
(window->flags & SDL_WINDOW_INPUT_FOCUS)) { (window->flags & SDL_WINDOW_INPUT_FOCUS)) {
...@@ -885,7 +871,6 @@ Cocoa_SetWindowGrab(_THIS, SDL_Window * window) ...@@ -885,7 +871,6 @@ Cocoa_SetWindowGrab(_THIS, SDL_Window * window)
cgpoint.y = window->y + y; cgpoint.y = window->y + y;
CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint); CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint);
} }
#endif
} }
void void
......
...@@ -812,7 +812,7 @@ PrintEvent(SDL_Event * event) ...@@ -812,7 +812,7 @@ PrintEvent(SDL_Event * event)
{ {
if (event->type == SDL_MOUSEMOTION) { if (event->type == SDL_MOUSEMOTION) {
/* Mouse motion is really spammy */ /* Mouse motion is really spammy */
return; //return;
} }
fprintf(stderr, "SDL EVENT: "); fprintf(stderr, "SDL EVENT: ");
...@@ -1044,6 +1044,12 @@ CommonEvent(CommonState * state, SDL_Event * event, int *done) ...@@ -1044,6 +1044,12 @@ CommonEvent(CommonState * state, SDL_Event * event, int *done)
} }
} }
break; 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: case SDLK_z:
if (event->key.keysym.mod & KMOD_CTRL) { if (event->key.keysym.mod & KMOD_CTRL) {
/* Ctrl-Z minimize */ /* 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