Added an API function to warp the mouse cursor in global screen space: SDL_WarpMouseGlobal()

main
Sam Lantinga 2014-06-04 10:55:26 -07:00
parent 3e3b34adc9
commit 45ed5ee494
11 changed files with 99 additions and 6 deletions

View File

@ -98,6 +98,16 @@ extern DECLSPEC Uint32 SDLCALL SDL_GetRelativeMouseState(int *x, int *y);
extern DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window, extern DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window,
int x, int y); int x, int y);
/**
* \brief Moves the mouse to the given position in global screen space.
*
* \param x The x coordinate
* \param y The y coordinate
*
* \note This function generates a mouse motion event
*/
extern DECLSPEC void SDLCALL SDL_WarpMouseGlobal(int x, int y);
/** /**
* \brief Set relative mouse mode. * \brief Set relative mouse mode.
* *

View File

@ -576,6 +576,7 @@
#define SDL_GetAssertionHandler SDL_GetAssertionHandler_REAL #define SDL_GetAssertionHandler SDL_GetAssertionHandler_REAL
#define SDL_DXGIGetOutputInfo SDL_DXGIGetOutputInfo_REAL #define SDL_DXGIGetOutputInfo SDL_DXGIGetOutputInfo_REAL
#define SDL_RenderIsClipEnabled SDL_RenderIsClipEnabled_REAL #define SDL_RenderIsClipEnabled SDL_RenderIsClipEnabled_REAL
#define SDL_WinRTRunApp SDL_WinRTRunApp_REAL
#define SDL_WarpMouseGlobal SDL_WarpMouseGlobal_REAL
#define SDL_WinRTGetFSPathUNICODE SDL_WinRTGetFSPathUNICODE_REAL #define SDL_WinRTGetFSPathUNICODE SDL_WinRTGetFSPathUNICODE_REAL
#define SDL_WinRTGetFSPathUTF8 SDL_WinRTGetFSPathUTF8_REAL #define SDL_WinRTGetFSPathUTF8 SDL_WinRTGetFSPathUTF8_REAL
#define SDL_WinRTRunApp SDL_WinRTRunApp_REAL

View File

@ -608,7 +608,8 @@ SDL_DYNAPI_PROC(SDL_bool,SDL_DXGIGetOutputInfo,(int a,int *b, int *c),(a,b,c),re
#endif #endif
SDL_DYNAPI_PROC(SDL_bool,SDL_RenderIsClipEnabled,(SDL_Renderer *a),(a),return) SDL_DYNAPI_PROC(SDL_bool,SDL_RenderIsClipEnabled,(SDL_Renderer *a),(a),return)
#ifdef __WINRT__ #ifdef __WINRT__
SDL_DYNAPI_PROC(int,SDL_WinRTRunApp,(int a, char **b, void *c),(a,b,c),return)
SDL_DYNAPI_PROC(const wchar_t*,SDL_WinRTGetFSPathUNICODE,(SDL_WinRT_Path a),(a),return) SDL_DYNAPI_PROC(const wchar_t*,SDL_WinRTGetFSPathUNICODE,(SDL_WinRT_Path a),(a),return)
SDL_DYNAPI_PROC(const char*,SDL_WinRTGetFSPathUTF8,(SDL_WinRT_Path a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_WinRTGetFSPathUTF8,(SDL_WinRT_Path a),(a),return)
SDL_DYNAPI_PROC(int,SDL_WinRTRunApp,(int a, char **b, void *c),(a,b,c),return)
#endif #endif
SDL_DYNAPI_PROC(void,SDL_WarpMouseGlobal,(int a, int b),(a,b),)

View File

@ -482,10 +482,10 @@ SDL_WarpMouseInWindow(SDL_Window * window, int x, int y)
{ {
SDL_Mouse *mouse = SDL_GetMouse(); SDL_Mouse *mouse = SDL_GetMouse();
if ( window == NULL ) if (window == NULL)
window = mouse->focus; window = mouse->focus;
if ( window == NULL ) if (window == NULL)
return; return;
if (mouse->WarpMouse) { if (mouse->WarpMouse) {
@ -495,6 +495,16 @@ SDL_WarpMouseInWindow(SDL_Window * window, int x, int y)
} }
} }
void
SDL_WarpMouseGlobal(int x, int y)
{
SDL_Mouse *mouse = SDL_GetMouse();
if (mouse->WarpMouseGlobal) {
mouse->WarpMouseGlobal(x, y);
}
}
static SDL_bool static SDL_bool
ShouldUseRelativeModeWarp(SDL_Mouse *mouse) ShouldUseRelativeModeWarp(SDL_Mouse *mouse)
{ {

View File

@ -57,9 +57,12 @@ typedef struct
/* Free a window manager cursor */ /* Free a window manager cursor */
void (*FreeCursor) (SDL_Cursor * cursor); void (*FreeCursor) (SDL_Cursor * cursor);
/* Warp the mouse to (x,y) */ /* Warp the mouse to (x,y) within a window */
void (*WarpMouse) (SDL_Window * window, int x, int y); void (*WarpMouse) (SDL_Window * window, int x, int y);
/* Warp the mouse to (x,y) in screen space */
void (*WarpMouseGlobal) (int x, int y);
/* Set relative mode */ /* Set relative mode */
int (*SetRelativeMouseMode) (SDL_bool enabled); int (*SetRelativeMouseMode) (SDL_bool enabled);

View File

@ -241,6 +241,30 @@ Cocoa_WarpMouse(SDL_Window * window, int x, int y)
} }
} }
static void
Cocoa_WarpMouseGlobal(int x, int y)
{
SDL_Mouse *mouse = SDL_GetMouse();
CGPoint point = CGPointMake((float)x, (float)y);
Cocoa_HandleMouseWarp(point.x, point.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.
*/
CGSetLocalEventsSuppressionInterval(0.0);
CGWarpMouseCursorPosition(point);
CGSetLocalEventsSuppressionInterval(0.25);
if (!mouse->relative_mode && mouse->focus) {
/* CGWarpMouseCursorPosition doesn't generate a window event, unlike our
* other implementations' APIs.
*/
SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 0, x - mouse->focus.x, y - mouse->focus.y);
}
}
static int static int
Cocoa_SetRelativeMouseMode(SDL_bool enabled) Cocoa_SetRelativeMouseMode(SDL_bool enabled)
{ {
@ -295,6 +319,7 @@ Cocoa_InitMouse(_THIS)
mouse->ShowCursor = Cocoa_ShowCursor; mouse->ShowCursor = Cocoa_ShowCursor;
mouse->FreeCursor = Cocoa_FreeCursor; mouse->FreeCursor = Cocoa_FreeCursor;
mouse->WarpMouse = Cocoa_WarpMouse; mouse->WarpMouse = Cocoa_WarpMouse;
mouse->WarpMouseGlobal = Cocoa_WarpMouseGlobal;
mouse->SetRelativeMouseMode = Cocoa_SetRelativeMouseMode; mouse->SetRelativeMouseMode = Cocoa_SetRelativeMouseMode;
SDL_SetDefaultCursor(Cocoa_CreateDefaultCursor()); SDL_SetDefaultCursor(Cocoa_CreateDefaultCursor());

View File

@ -110,6 +110,12 @@ MIR_WarpMouse(SDL_Window* window, int x, int y)
SDL_Unsupported(); SDL_Unsupported();
} }
static void
MIR_WarpMouseGlobal(int x, int y)
{
SDL_Unsupported();
}
static int static int
MIR_SetRelativeMouseMode(SDL_bool enabled) MIR_SetRelativeMouseMode(SDL_bool enabled)
{ {
@ -126,6 +132,7 @@ MIR_InitMouse()
mouse->ShowCursor = MIR_ShowCursor; mouse->ShowCursor = MIR_ShowCursor;
mouse->FreeCursor = MIR_FreeCursor; mouse->FreeCursor = MIR_FreeCursor;
mouse->WarpMouse = MIR_WarpMouse; mouse->WarpMouse = MIR_WarpMouse;
mouse->WarpMouseGlobal = MIR_WarpMouseGlobal;
mouse->CreateSystemCursor = MIR_CreateSystemCursor; mouse->CreateSystemCursor = MIR_CreateSystemCursor;
mouse->SetRelativeMouseMode = MIR_SetRelativeMouseMode; mouse->SetRelativeMouseMode = MIR_SetRelativeMouseMode;

View File

@ -48,6 +48,7 @@ static int RPI_ShowCursor(SDL_Cursor * cursor);
static void RPI_MoveCursor(SDL_Cursor * cursor); static void RPI_MoveCursor(SDL_Cursor * cursor);
static void RPI_FreeCursor(SDL_Cursor * cursor); static void RPI_FreeCursor(SDL_Cursor * cursor);
static void RPI_WarpMouse(SDL_Window * window, int x, int y); static void RPI_WarpMouse(SDL_Window * window, int x, int y);
static void RPI_WarpMouseGlobal(int x, int y);
static SDL_Cursor * static SDL_Cursor *
RPI_CreateDefaultCursor(void) RPI_CreateDefaultCursor(void)
@ -210,6 +211,13 @@ RPI_FreeCursor(SDL_Cursor * cursor)
/* Warp the mouse to (x,y) */ /* Warp the mouse to (x,y) */
static void static void
RPI_WarpMouse(SDL_Window * window, int x, int y) RPI_WarpMouse(SDL_Window * window, int x, int y)
{
RPI_WarpMouseGlobal(x, y);
}
/* Warp the mouse to (x,y) */
static void
RPI_WarpMouseGlobal(int x, int y)
{ {
RPI_CursorData *curdata; RPI_CursorData *curdata;
DISPMANX_UPDATE_HANDLE_T update; DISPMANX_UPDATE_HANDLE_T update;
@ -254,6 +262,7 @@ RPI_InitMouse(_THIS)
mouse->MoveCursor = RPI_MoveCursor; mouse->MoveCursor = RPI_MoveCursor;
mouse->FreeCursor = RPI_FreeCursor; mouse->FreeCursor = RPI_FreeCursor;
mouse->WarpMouse = RPI_WarpMouse; mouse->WarpMouse = RPI_WarpMouse;
mouse->WarpMouseGlobal = RPI_WarpMouseGlobal;
SDL_SetDefaultCursor(RPI_CreateDefaultCursor()); SDL_SetDefaultCursor(RPI_CreateDefaultCursor());
} }

View File

@ -345,7 +345,12 @@ static void
Wayland_WarpMouse(SDL_Window *window, int x, int y) Wayland_WarpMouse(SDL_Window *window, int x, int y)
{ {
SDL_Unsupported(); SDL_Unsupported();
return; }
static void
Wayland_WarpMouseGlobal(int x, int y)
{
SDL_Unsupported();
} }
static int static int
@ -365,6 +370,7 @@ Wayland_InitMouse(void)
mouse->ShowCursor = Wayland_ShowCursor; mouse->ShowCursor = Wayland_ShowCursor;
mouse->FreeCursor = Wayland_FreeCursor; mouse->FreeCursor = Wayland_FreeCursor;
mouse->WarpMouse = Wayland_WarpMouse; mouse->WarpMouse = Wayland_WarpMouse;
mouse->WarpMouseGlobal = Wayland_WarpMouseGlobal;
mouse->SetRelativeMouseMode = Wayland_SetRelativeMouseMode; mouse->SetRelativeMouseMode = Wayland_SetRelativeMouseMode;
SDL_SetDefaultCursor(Wayland_CreateDefaultCursor()); SDL_SetDefaultCursor(Wayland_CreateDefaultCursor());

View File

@ -198,6 +198,16 @@ WIN_WarpMouse(SDL_Window * window, int x, int y)
SetCursorPos(pt.x, pt.y); SetCursorPos(pt.x, pt.y);
} }
static void
WIN_WarpMouseGlobal(int x, int y)
{
POINT pt;
pt.x = x;
pt.y = y;
SetCursorPos(pt.x, pt.y);
}
static int static int
WIN_SetRelativeMouseMode(SDL_bool enabled) WIN_SetRelativeMouseMode(SDL_bool enabled)
{ {
@ -229,6 +239,7 @@ WIN_InitMouse(_THIS)
mouse->ShowCursor = WIN_ShowCursor; mouse->ShowCursor = WIN_ShowCursor;
mouse->FreeCursor = WIN_FreeCursor; mouse->FreeCursor = WIN_FreeCursor;
mouse->WarpMouse = WIN_WarpMouse; mouse->WarpMouse = WIN_WarpMouse;
mouse->WarpMouseGlobal = WIN_WarpMouseGlobal;
mouse->SetRelativeMouseMode = WIN_SetRelativeMouseMode; mouse->SetRelativeMouseMode = WIN_SetRelativeMouseMode;
SDL_SetDefaultCursor(WIN_CreateDefaultCursor()); SDL_SetDefaultCursor(WIN_CreateDefaultCursor());

View File

@ -318,6 +318,15 @@ X11_WarpMouse(SDL_Window * window, int x, int y)
X11_XSync(display, False); X11_XSync(display, False);
} }
static void
X11_WarpMouseGlobal(int x, int y)
{
Display *display = GetDisplay();
X11_XWarpPointer(display, None, DefaultRootWindow(display), 0, 0, 0, 0, x, y);
X11_XSync(display, False);
}
static int static int
X11_SetRelativeMouseMode(SDL_bool enabled) X11_SetRelativeMouseMode(SDL_bool enabled)
{ {
@ -340,6 +349,7 @@ X11_InitMouse(_THIS)
mouse->ShowCursor = X11_ShowCursor; mouse->ShowCursor = X11_ShowCursor;
mouse->FreeCursor = X11_FreeCursor; mouse->FreeCursor = X11_FreeCursor;
mouse->WarpMouse = X11_WarpMouse; mouse->WarpMouse = X11_WarpMouse;
mouse->WarpMouseGlobal = X11_WarpMouseGlobal;
mouse->SetRelativeMouseMode = X11_SetRelativeMouseMode; mouse->SetRelativeMouseMode = X11_SetRelativeMouseMode;
SDL_SetDefaultCursor(X11_CreateDefaultCursor()); SDL_SetDefaultCursor(X11_CreateDefaultCursor());