summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2009-03-25 05:51:43 (GMT)
committerPeter Hutterer <peter.hutterer@who-t.net>2009-03-27 01:26:15 (GMT)
commit603db34337a61754e0c5f71525011d10eab78411 (patch)
treee88ffe2e1ce425cca7c601a3a19853dfc2f5eb42
parent4ab93f05664890ff6738ef1089bcd956ce3f06e9 (diff)
Xext: set POINTER_SCREEN flag in XTestFakeInput if necessary. (RH #490984)
The POINTER_SCREEN flag must be set explicitly for XTest core events to avoid out-of-range events when the lastSlave was an SD with an explicit axis range. Device events sent through XTest don't need this flag, they are expected to be in the valuator range of the device anyway. Red Hat Bug 490984 <https://bugzilla.redhat.com/show_bug.cgi?id=490984> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--Xext/xtest.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/Xext/xtest.c b/Xext/xtest.c
index fe3816e..ab88231 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -159,6 +159,7 @@ ProcXTestFakeInput(ClientPtr client)
int nevents = 0;
int i;
int base = 0;
+ int flags = 0;
nev = (stuff->length << 2) - sizeof(xReq);
if ((nev % sizeof(xEvent)) || !nev)
@@ -209,8 +210,14 @@ ProcXTestFakeInput(ClientPtr client)
client->errorValue = ev->u.u.type;
return BadValue;
}
+
+ if (ev->u.u.detail == xFalse)
+ flags |= POINTER_ABSOLUTE;
} else
+ {
firstValuator = 0;
+ flags |= POINTER_ABSOLUTE;
+ }
if (nev > 1 && !dev->valuator)
{
@@ -279,6 +286,8 @@ ProcXTestFakeInput(ClientPtr client)
valuators[1] = ev->u.keyButtonPointer.rootY;
numValuators = 2;
firstValuator = 0;
+ if (ev->u.u.detail == xFalse)
+ flags = POINTER_ABSOLUTE | POINTER_SCREEN;
break;
default:
client->errorValue = ev->u.u.type;
@@ -376,14 +385,13 @@ ProcXTestFakeInput(ClientPtr client)
GetEventList(&events);
switch(type) {
case MotionNotify:
- nevents = GetPointerEvents(events, dev, type, 0,
- (ev->u.u.detail == xFalse) ? POINTER_ABSOLUTE : 0,
+ nevents = GetPointerEvents(events, dev, type, 0, flags,
firstValuator, numValuators, valuators);
break;
case ButtonPress:
case ButtonRelease:
nevents = GetPointerEvents(events, dev, type, ev->u.u.detail,
- POINTER_ABSOLUTE, firstValuator,
+ flags, firstValuator,
numValuators, valuators);
break;
case KeyPress: