diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c index cbc1bf2da..d1866811a 100644 --- a/hw/xwayland/xwayland-input.c +++ b/hw/xwayland/xwayland-input.c @@ -219,7 +219,6 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer, struct xwl_seat *xwl_seat = data; DeviceIntPtr dev = xwl_seat->pointer; DeviceIntPtr master; - miPointerPtr mipointer; int i; int sx = wl_fixed_to_int(sx_w); int sy = wl_fixed_to_int(sy_w); @@ -243,13 +242,7 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer, master = GetMaster(dev, POINTER_OR_FLOAT); (*pScreen->SetCursorPosition) (dev, pScreen, sx, sy, TRUE); - /* X is very likely to have the wrong idea of what the actual cursor - * sprite is, so in order to force updating the cursor lets set the - * current sprite to some invalid cursor behind its back so that it - * always will think it changed to the not invalid cursor. - */ - mipointer = MIPOINTER(master); - mipointer->pSpriteCursor = (CursorPtr) 1; + miPointerInvalidateSprite(master); CheckMotion(NULL, master); diff --git a/mi/mipointer.c b/mi/mipointer.c index ada1ab570..7f95cdbad 100644 --- a/mi/mipointer.c +++ b/mi/mipointer.c @@ -467,6 +467,21 @@ miPointerUpdateSprite(DeviceIntPtr pDev) } } +/** + * Invalidate the current sprite and force it to be reloaded on next cursor setting + * operation + * + * @param pDev The device to invalidate the sprite fore + */ +void +miPointerInvalidateSprite(DeviceIntPtr pDev) +{ + miPointerPtr pPointer; + + pPointer = MIPOINTER(pDev); + pPointer->pSpriteCursor = (CursorPtr) 1; +} + /** * Set the device to the coordinates on the given screen. * diff --git a/mi/mipointer.h b/mi/mipointer.h index bdeed1242..7ce6409b3 100644 --- a/mi/mipointer.h +++ b/mi/mipointer.h @@ -109,6 +109,12 @@ miPointerSetPosition(DeviceIntPtr pDev, int mode, double *x, double *y, extern _X_EXPORT void miPointerUpdateSprite(DeviceIntPtr pDev); +/* Invalidate current sprite, forcing reload on next + * sprite setting (window crossing, grab action, etc) + */ +extern _X_EXPORT void +miPointerInvalidateSprite(DeviceIntPtr pDev); + /* Sets whether the sprite should be updated immediately on pointer moves */ extern _X_EXPORT Bool miPointerSetWaitForUpdate(ScreenPtr pScreen, Bool wait);