Added support for using XTest to warp the mouse
This commit is contained in:
@@ -56,6 +56,9 @@ typedef struct
|
||||
#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS
|
||||
#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS NULL
|
||||
#endif
|
||||
#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST
|
||||
#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST NULL
|
||||
#endif
|
||||
|
||||
static x11dynlib x11libs[] = {
|
||||
{ NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC },
|
||||
@@ -64,7 +67,8 @@ static x11dynlib x11libs[] = {
|
||||
{ NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 },
|
||||
{ NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES },
|
||||
{ NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR },
|
||||
{ NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS }
|
||||
{ NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS },
|
||||
{ NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST }
|
||||
};
|
||||
|
||||
static void *X11_GetSym(const char *fnname, int *pHasModule)
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "SDL_x11video.h"
|
||||
#include "SDL_x11mouse.h"
|
||||
#include "SDL_x11xinput2.h"
|
||||
#include "SDL_x11xtest.h"
|
||||
#include "../SDL_video_c.h"
|
||||
#include "../../events/SDL_mouse_c.h"
|
||||
|
||||
@@ -367,6 +368,10 @@ static bool X11_WarpMouse(SDL_Window *window, float x, float y)
|
||||
{
|
||||
SDL_WindowData *data = window->internal;
|
||||
|
||||
if (X11_WarpMouseXTest(SDL_GetVideoDevice(), window, x, y)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef SDL_VIDEO_DRIVER_X11_XFIXES
|
||||
// If we have no barrier, we need to warp
|
||||
if (data->pointer_barrier_active == false) {
|
||||
@@ -380,6 +385,10 @@ static bool X11_WarpMouse(SDL_Window *window, float x, float y)
|
||||
|
||||
static bool X11_WarpMouseGlobal(float x, float y)
|
||||
{
|
||||
if (X11_WarpMouseXTest(SDL_GetVideoDevice(), NULL, x, y)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
X11_WarpMouseInternal(DefaultRootWindow(GetDisplay()), x, y);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -182,6 +182,12 @@ SDL_X11_SYM(Status, XSyncDestroyCounter, (Display* a, XSyncCounter b), (a, b), r
|
||||
SDL_X11_SYM(Status, XSyncSetCounter, (Display* a, XSyncCounter b, XSyncValue c), (a, b, c), return)
|
||||
#endif
|
||||
|
||||
#ifdef SDL_VIDEO_DRIVER_X11_XTEST
|
||||
SDL_X11_MODULE(XTEST)
|
||||
SDL_X11_SYM(Status, XTestQueryExtension, (Display* a, int* b, int* c), (a, b, c), return)
|
||||
SDL_X11_SYM(int, XTestFakeMotionEvent, (Display* a, int b, int c, int d, unsigned long e), (a, b, c, d, e), return)
|
||||
#endif
|
||||
|
||||
#ifdef SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS
|
||||
SDL_X11_SYM(Bool,XGetEventData,(Display* a,XGenericEventCookie* b),(a,b),return)
|
||||
SDL_X11_SYM(void,XFreeEventData,(Display* a,XGenericEventCookie* b),(a,b),)
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include "SDL_x11messagebox.h"
|
||||
#include "SDL_x11shape.h"
|
||||
#include "SDL_x11xsync.h"
|
||||
#include "SDL_x11xtest.h"
|
||||
|
||||
#ifdef SDL_VIDEO_OPENGL_EGL
|
||||
#include "SDL_x11opengles.h"
|
||||
@@ -443,13 +444,17 @@ static bool X11_VideoInit(SDL_VideoDevice *_this)
|
||||
|
||||
#ifdef SDL_VIDEO_DRIVER_X11_XFIXES
|
||||
X11_InitXfixes(_this);
|
||||
#endif // SDL_VIDEO_DRIVER_X11_XFIXES
|
||||
#endif
|
||||
|
||||
X11_InitXsettings(_this);
|
||||
|
||||
#ifdef SDL_VIDEO_DRIVER_X11_XSYNC
|
||||
X11_InitXsync(_this);
|
||||
#endif /* SDL_VIDEO_DRIVER_X11_XSYNC */
|
||||
#endif
|
||||
|
||||
#ifdef SDL_VIDEO_DRIVER_X11_XTEST
|
||||
X11_InitXTest(_this);
|
||||
#endif
|
||||
|
||||
#ifndef X_HAVE_UTF8_STRING
|
||||
#warning X server does not support UTF8_STRING, a feature introduced in 2000! This is likely to become a hard error in a future libSDL3.
|
||||
|
||||
83
src/video/x11/SDL_x11xtest.c
Normal file
83
src/video/x11/SDL_x11xtest.c
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include "SDL_internal.h"
|
||||
|
||||
#if defined(SDL_VIDEO_DRIVER_X11)
|
||||
|
||||
#include "SDL_x11video.h"
|
||||
#include "SDL_x11xtest.h"
|
||||
|
||||
static bool xtest_initialized = false;
|
||||
|
||||
void X11_InitXTest(SDL_VideoDevice *_this)
|
||||
{
|
||||
#ifdef SDL_VIDEO_DRIVER_X11_XTEST
|
||||
Display *display = _this->internal->display;
|
||||
int event, error;
|
||||
int opcode;
|
||||
|
||||
if (!SDL_X11_HAVE_XTEST ||
|
||||
!X11_XQueryExtension(display, "XTEST", &opcode, &event, &error)) {
|
||||
return;
|
||||
}
|
||||
|
||||
xtest_initialized = true;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool X11_XTestIsInitialized(void)
|
||||
{
|
||||
return xtest_initialized;
|
||||
}
|
||||
|
||||
bool X11_WarpMouseXTest(SDL_VideoDevice *_this, SDL_Window *window, float x, float y)
|
||||
{
|
||||
#ifdef SDL_VIDEO_DRIVER_X11_XTEST
|
||||
if (!X11_XTestIsInitialized()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Display *display = _this->internal->display;
|
||||
SDL_DisplayData *displaydata = window ? SDL_GetDisplayDriverDataForWindow(window) : SDL_GetDisplayDriverData(SDL_GetPrimaryDisplay());
|
||||
if (!displaydata) {
|
||||
return false;
|
||||
}
|
||||
|
||||
int motion_x = (int)SDL_roundf(x);
|
||||
int motion_y = (int)SDL_roundf(y);
|
||||
if (window) {
|
||||
motion_x += window->x;
|
||||
motion_y += window->y;
|
||||
}
|
||||
|
||||
if (!X11_XTestFakeMotionEvent(display, displaydata->screen, motion_x, motion_y, CurrentTime)) {
|
||||
return false;
|
||||
}
|
||||
X11_XSync(display, False);
|
||||
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // SDL_VIDEO_DRIVER_X11
|
||||
31
src/video/x11/SDL_x11xtest.h
Normal file
31
src/video/x11/SDL_x11xtest.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include "SDL_internal.h"
|
||||
|
||||
#ifndef SDL_x11xtest_h_
|
||||
#define SDL_x11xtest_h_
|
||||
|
||||
extern void X11_InitXTest(SDL_VideoDevice *_this);
|
||||
extern bool X11_XTestIsInitialized(void);
|
||||
extern bool X11_WarpMouseXTest(SDL_VideoDevice *_this, SDL_Window *window, float x, float y);
|
||||
|
||||
#endif // SDL_x11xtest_h_
|
||||
Reference in New Issue
Block a user