Implemented mouse relative mode on Mac OS X.
This commit is contained in:
parent
9959455aee
commit
cde0d1bc03
5 changed files with 53 additions and 22 deletions
|
@ -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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue