summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2009-03-25 15:51:43 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2009-03-27 11:26:15 +1000
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 fe3816e9c..ab882311a 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -159,6 +159,7 @@ ProcXTestFakeInput(ClientPtr client)
159 int nevents = 0; 159 int nevents = 0;
160 int i; 160 int i;
161 int base = 0; 161 int base = 0;
162 int flags = 0;
162 163
163 nev = (stuff->length << 2) - sizeof(xReq); 164 nev = (stuff->length << 2) - sizeof(xReq);
164 if ((nev % sizeof(xEvent)) || !nev) 165 if ((nev % sizeof(xEvent)) || !nev)
@@ -209,8 +210,14 @@ ProcXTestFakeInput(ClientPtr client)
209 client->errorValue = ev->u.u.type; 210 client->errorValue = ev->u.u.type;
210 return BadValue; 211 return BadValue;
211 } 212 }
213
214 if (ev->u.u.detail == xFalse)
215 flags |= POINTER_ABSOLUTE;
212 } else 216 } else
217 {
213 firstValuator = 0; 218 firstValuator = 0;
219 flags |= POINTER_ABSOLUTE;
220 }
214 221
215 if (nev > 1 && !dev->valuator) 222 if (nev > 1 && !dev->valuator)
216 { 223 {
@@ -279,6 +286,8 @@ ProcXTestFakeInput(ClientPtr client)
279 valuators[1] = ev->u.keyButtonPointer.rootY; 286 valuators[1] = ev->u.keyButtonPointer.rootY;
280 numValuators = 2; 287 numValuators = 2;
281 firstValuator = 0; 288 firstValuator = 0;
289 if (ev->u.u.detail == xFalse)
290 flags = POINTER_ABSOLUTE | POINTER_SCREEN;
282 break; 291 break;
283 default: 292 default:
284 client->errorValue = ev->u.u.type; 293 client->errorValue = ev->u.u.type;
@@ -376,14 +385,13 @@ ProcXTestFakeInput(ClientPtr client)
376 GetEventList(&events); 385 GetEventList(&events);
377 switch(type) { 386 switch(type) {
378 case MotionNotify: 387 case MotionNotify:
379 nevents = GetPointerEvents(events, dev, type, 0, 388 nevents = GetPointerEvents(events, dev, type, 0, flags,
380 (ev->u.u.detail == xFalse) ? POINTER_ABSOLUTE : 0,
381 firstValuator, numValuators, valuators); 389 firstValuator, numValuators, valuators);
382 break; 390 break;
383 case ButtonPress: 391 case ButtonPress:
384 case ButtonRelease: 392 case ButtonRelease:
385 nevents = GetPointerEvents(events, dev, type, ev->u.u.detail, 393 nevents = GetPointerEvents(events, dev, type, ev->u.u.detail,
386 POINTER_ABSOLUTE, firstValuator, 394 flags, firstValuator,
387 numValuators, valuators); 395 numValuators, valuators);
388 break; 396 break;
389 case KeyPress: 397 case KeyPress: