diff --git a/client/displayservers/Wayland/cursor.c b/client/displayservers/Wayland/cursor.c index 5c9c35c6..e07cd8e8 100644 --- a/client/displayservers/Wayland/cursor.c +++ b/client/displayservers/Wayland/cursor.c @@ -157,7 +157,8 @@ bool waylandCursorInit(void) wlWm.cursorSquareBuffer = createSquareCursorBuffer(); if (wlWm.cursorSquareBuffer) { - wlWm.cursors[LG_POINTER_SQUARE] = wl_compositor_create_surface(wlWm.compositor); + wlWm.cursors[LG_POINTER_SQUARE] = wl_compositor_create_surface(wlWm.compositor); + wlWm.cursorHot[LG_POINTER_SQUARE] = (struct Point) { 2, 2 }; wl_surface_attach(wlWm.cursors[LG_POINTER_SQUARE], wlWm.cursorSquareBuffer, 0, 0); wl_surface_commit(wlWm.cursors[LG_POINTER_SQUARE]); } @@ -213,6 +214,10 @@ void waylandCursorScaleChange(void) memcpy(old, wlWm.cursors, sizeof(old)); memset(wlWm.cursors, 0, sizeof(wlWm.cursors)); + /* the diagnostic cursor is not part of the cursor theme */ + wlWm.cursors[LG_POINTER_SQUARE] = old[LG_POINTER_SQUARE]; + old[LG_POINTER_SQUARE] = NULL; + if (wlWm.cursorTheme) wl_cursor_theme_destroy(wlWm.cursorTheme); diff --git a/client/displayservers/Wayland/input.c b/client/displayservers/Wayland/input.c index 0e46ac4f..55e50f02 100644 --- a/client/displayservers/Wayland/input.c +++ b/client/displayservers/Wayland/input.c @@ -21,6 +21,7 @@ #include "wayland.h" #include +#include #include #include #include @@ -1027,5 +1028,5 @@ void waylandGuestPointerUpdated(double x, double y, double localX, double localY MTRACE("guest warp guest=%.3f,%.3f local=%.3f,%.3f", x, y, localX, localY); - waylandWarpPointer((int) localX, (int) localY, false); + waylandWarpPointer((int) round(localX), (int) round(localY), false); } diff --git a/client/src/main.c b/client/src/main.c index 7d84689c..b79eb2f1 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -1076,6 +1076,7 @@ int main_cursorThread(void * unused) const bool wasRendered = g_cursor.guest.visible && (g_cursor.draw || !g_params.useSpiceInput); + bool hotspotChanged = false; if (pointer.flags & LG_TRANSPORT_POINTER_VISIBLE_VALID) g_cursor.guest.visible = @@ -1094,8 +1095,8 @@ int main_cursorThread(void * unused) continue; } - g_cursor.guest.hx = pointer.hx; - g_cursor.guest.hy = pointer.hy; + hotspotChanged = + g_cursor.guest.hx != pointer.hx || g_cursor.guest.hy != pointer.hy; if (!RENDERER(onMouseShape, cursorType, pointer.width, pointer.height, pointer.pitch, pointer.shape)) { @@ -1103,6 +1104,8 @@ int main_cursorThread(void * unused) g_state.transportOps->releasePointer(g_state.transport, &pointer); continue; } + g_cursor.guest.hx = pointer.hx; + g_cursor.guest.hy = pointer.hy; } if ((pointer.flags & LG_TRANSPORT_POINTER_COLOR_TRANSFORM) && @@ -1132,9 +1135,14 @@ int main_cursorThread(void * unused) core_alignToGuest(); app_resyncMouseBasic(); } - core_handleGuestMouseUpdate(); } + if (hotspotChanged) + app_resyncMouseBasic(); + + if ((pointer.flags & LG_TRANSPORT_POINTER_POSITION) || hotspotChanged) + core_handleGuestMouseUpdate(); + app_updateMouseState(); g_cursor.redraw = false; RENDERER(onMouseEvent,