devdraw: work around XWayland pointer warping

This commit is contained in:
Russ Cox
2025-10-09 19:37:22 -04:00
parent 00754b35a2
commit 19263a1071

View File

@@ -1342,10 +1342,33 @@ _xtoplan9mouse(Xwin *w, XEvent *e, Mouse *m)
void
rpc_setmouse(Client *client, Point p)
{
static XCursor empty_cursor;
Xwin *w = (Xwin*)client->view;
xlock();
// XWayland hack - hide cursor before warping
// see https://github.com/libsdl-org/SDL/issues/9539
if(!empty_cursor){
Pixmap bm;
XColor black;
char bmd[] = { 0 };
bm = XCreateBitmapFromData(_x.display, w->drawable, bmd, 1, 1);
if(bm){
empty_cursor = XCreatePixmapCursor(_x.display, bm, bm, &black, &black, 0, 0);
XFreePixmap(_x.display, bm);
}
}
if(empty_cursor){
XDefineCursor(_x.display, w->drawable, empty_cursor);
XFlush(_x.display);
}
XWarpPointer(_x.display, None, w->drawable, 0, 0, 0, 0, p.x, p.y);
if(empty_cursor)
XDefineCursor(_x.display, w->drawable, _x.cursor);
XFlush(_x.display);
xunlock();
}