aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/devdraw/x11-screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/devdraw/x11-screen.c')
-rw-r--r--src/cmd/devdraw/x11-screen.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/cmd/devdraw/x11-screen.c b/src/cmd/devdraw/x11-screen.c
index df7cca46..79dc5c81 100644
--- a/src/cmd/devdraw/x11-screen.c
+++ b/src/cmd/devdraw/x11-screen.c
@@ -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();
}