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();
|
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)
|
||||||
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
|
||||||
/* 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)
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
- (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;
|
||||||
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)
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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 */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue