[PATCH v2] dix: don't XWarpPointer through the last slave anymore (#38313)

Jeremy Huddleston jeremyhu at apple.com
Thu Nov 3 02:04:11 PDT 2011


This introduces a regression:

http://xquartz.macosforge.org/trac/ticket/517#comment:10

I see similar behavior changes in wine on Linux as I do on XQuartz, so I don't think it's specific to XQuartz.

I'm planning on reverting this change from the 1.11 branch for tomorrow's release unless someone manages to convince me otherwise in the next ~12 hours.

--Jeremy

On Aug 10, 2011, at 10:19 PM, Peter Hutterer wrote:

> This line was introduced pre-1.6 to fix Bug 19297. The effect of warping
> through the VCP then was that if a device had custom valuator ranges, the
> warp position would be wrong. The better device for this effect is the the
> XTest device.
> 
> This fixes a server crash where the lastSlave is a pointer device without
> valuators (Bug 38313#0).
> 
> And while we're at it, make sure the Xinerama code-path does the same.
> 
> X.Org Bug 38313 <http://bugs.freedesktop.org/show_bug.cgi?id=38313>
> 
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> changes to v1:
> - use the XTest device, not the VCP directly
> - fix up xinerama to do the same
> 
> dix/events.c |   21 ++++++++++++++-------
> 1 files changed, 14 insertions(+), 7 deletions(-)
> 
> diff --git a/dix/events.c b/dix/events.c
> index d78989d..9596481 100644
> --- a/dix/events.c
> +++ b/dix/events.c
> @@ -3377,16 +3377,21 @@ XineramaWarpPointer(ClientPtr client)
> {
>     WindowPtr	dest = NULL;
>     int		x, y, rc;
> -    SpritePtr   pSprite = PickPointer(client)->spriteInfo->sprite;
> +    DeviceIntPtr dev;
> +    SpritePtr   pSprite;
> 
>     REQUEST(xWarpPointerReq);
> 
> -
>     if (stuff->dstWid != None) {
> 	rc = dixLookupWindow(&dest, stuff->dstWid, client, DixReadAccess);
> 	if (rc != Success)
> 	    return rc;
>     }
> +
> +    /* Post through the XTest device */
> +    dev = PickPointer(client);
> +    dev = GetXTestDevice(dev);
> +    pSprite = dev->spriteInfo->sprite;
>     x = pSprite->hotPhys.x;
>     y = pSprite->hotPhys.y;
> 
> @@ -3436,9 +3441,9 @@ XineramaWarpPointer(ClientPtr client)
>     else if (y >= pSprite->physLimits.y2)
> 	y = pSprite->physLimits.y2 - 1;
>     if (pSprite->hotShape)
> -	ConfineToShape(PickPointer(client), pSprite->hotShape, &x, &y);
> +	ConfineToShape(dev, pSprite->hotShape, &x, &y);
> 
> -    XineramaSetCursorPosition(PickPointer(client), x, y, TRUE);
> +    XineramaSetCursorPosition(dev, x, y, TRUE);
> 
>     return Success;
> }
> @@ -3456,7 +3461,7 @@ ProcWarpPointer(ClientPtr client)
>     WindowPtr	dest = NULL;
>     int		x, y, rc;
>     ScreenPtr	newScreen;
> -    DeviceIntPtr dev, tmp;
> +    DeviceIntPtr dev, tmp, xtest_dev = NULL;
>     SpritePtr   pSprite;
> 
>     REQUEST(xWarpPointerReq);
> @@ -3469,11 +3474,13 @@ ProcWarpPointer(ClientPtr client)
> 	    rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixWriteAccess);
> 	    if (rc != Success)
> 		return rc;
> +            if (IsXTestDevice(tmp, dev))
> +                xtest_dev = tmp;
> 	}
>     }
> 
> -    if (dev->lastSlave)
> -        dev = dev->lastSlave;
> +    /* Use the XTest device to actually move the pointer */
> +    dev = xtest_dev;
>     pSprite = dev->spriteInfo->sprite;
> 
> #ifdef PANORAMIX
> -- 
> 1.7.6
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel





More information about the xorg-devel mailing list