summaryrefslogtreecommitdiff
path: root/dix/events.c
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2011-07-29 16:33:54 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2011-08-22 15:56:53 +1000
commit2bfb802839688ecf328119c4c6979390fc60348d (patch)
treef2354262969ed4ea24aa81d06bd145997eca6a59 /dix/events.c
parentb29ce0726d55ec41cfbce0814e21b0217ef64efe (diff)
dix: don't XWarpPointer through the last slave anymore (#38313)
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@who-t.net> Reviewed-by: Daniel Stone <daniel@fooishbar.org>
Diffstat (limited to 'dix/events.c')
-rw-r--r--dix/events.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/dix/events.c b/dix/events.c
index 27c317290..7fe0fba5d 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