diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2008-04-28 16:56:22 +0930 |
---|---|---|
committer | Peter Hutterer <peter@cs.unisa.edu.au> | 2008-04-29 11:18:35 +0930 |
commit | f2a20294fe26f4c9d245d24d065331fefd8f830d (patch) | |
tree | 73b5d4cdb1d2ff47cb23e7c84fcf8787e3099162 | |
parent | 53dba5381fdd8f644e16aaa0ecb05df4dc615b23 (diff) |
dix: store all valuators as they come from the device in the valuator events.
The event's sequenceNumber is mis-used to determine whether the values are
relative or absolute.
-rw-r--r-- | dix/getevents.c | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/dix/getevents.c b/dix/getevents.c index d352ebe78..0a44a809f 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -386,13 +386,15 @@ clipValuators(DeviceIntPtr pDev, int first_valuator, int num_valuators, * Fills events with valuator events for pDev, as given by the other * parameters. * + * Note that we mis-use the sequence number to store the absolute bit. + * * FIXME: Need to fix ValuatorClassRec to store all the valuators as * last posted, not just x and y; otherwise relative non-x/y * valuators, though a very narrow use case, will be broken. */ static EventList * -getValuatorEvents(EventList *events, DeviceIntPtr pDev, int first_valuator, - int num_valuators, int *valuators) { +getValuatorEvents(EventList *events, DeviceIntPtr pDev, int absolute, + int first_valuator, int num_valuators, int *valuators) { deviceValuator *xv; int i = 0, final_valuator = first_valuator + num_valuators; @@ -419,6 +421,8 @@ getValuatorEvents(EventList *events, DeviceIntPtr pDev, int first_valuator, if (i + 6 < final_valuator) xv->deviceid |= MORE_EVENTS; + + xv->sequenceNumber = (absolute) ? Absolute : Relative; } return events; @@ -561,8 +565,8 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type, if (num_valuators) { kbp->deviceid |= MORE_EVENTS; clipValuators(pDev, first_valuator, num_valuators, valuators); - events = getValuatorEvents(events, pDev, first_valuator, - num_valuators, valuators); + events = getValuatorEvents(events, pDev, FALSE /* relative */, + first_valuator, num_valuators, valuators); } return numEvents; @@ -751,14 +755,6 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons, * to the current screen. Right now, we only have one history buffer, * so we don't set this for both the device and core.*/ miPointerSetPosition(pDev, &x, &y, ms); - - /* Drop x and y back into the valuators list, if they were originally - * present. */ - if (first_valuator == 0 && num_valuators >= 1) - valuators[0] = x; - if (first_valuator <= 1 && num_valuators >= (2 - first_valuator)) - valuators[1 - first_valuator] = y; - updateMotionHistory(pDev, ms, first_valuator, num_valuators, valuators); pDev->lastx = x; @@ -791,8 +787,8 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons, if (num_valuators) { kbp->deviceid |= MORE_EVENTS; clipValuators(pDev, first_valuator, num_valuators, valuators); - events = getValuatorEvents(events, pDev, first_valuator, - num_valuators, valuators); + events = getValuatorEvents(events, pDev, (flags & POINTER_ABSOLUTE), + first_valuator, num_valuators, valuators); } return num_events; @@ -859,8 +855,8 @@ GetProximityEvents(EventList *events, DeviceIntPtr pDev, int type, kbp->deviceid |= MORE_EVENTS; events++; clipValuators(pDev, first_valuator, num_valuators, valuators); - events = getValuatorEvents(events, pDev, first_valuator, - num_valuators, valuators); + events = getValuatorEvents(events, pDev, False /* relative */, + first_valuator, num_valuators, valuators); } return num_events; |