Handle non continuous valuator data in getValuatorEvents

This allows for masked valuators to be handled properly in XI 1.x
events. Any unset valuators in the device event are set to the last
known value when transmitted on the wire through XI 1.x valuator events.

Fixes https://bugs.launchpad.net/ubuntu/+source/xorg-server/+bug/736500

Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Chase Douglas 2011-03-28 16:04:48 -04:00 committed by Peter Hutterer
parent ac00ab77d5
commit 8199eac443

View File

@ -383,19 +383,18 @@ getValuatorEvents(DeviceEvent *ev, deviceValuator *xv)
int i;
int state = 0;
int first_valuator, num_valuators;
DeviceIntPtr dev = NULL;
num_valuators = countValuators(ev, &first_valuator);
if (num_valuators > 0)
{
DeviceIntPtr dev = NULL;
dixLookupDevice(&dev, ev->deviceid, serverClient, DixUseAccess);
/* State needs to be assembled BEFORE the device is updated. */
state = (dev && dev->key) ? XkbStateFieldFromRec(&dev->key->xkbInfo->state) : 0;
state |= (dev && dev->button) ? (dev->button->state) : 0;
}
/* FIXME: non-continuous valuator data in internal events*/
for (i = 0; i < num_valuators; i += 6, xv++) {
INT32 *valuators = &xv->valuator0; // Treat all 6 vals as an array
int j;
@ -406,8 +405,12 @@ getValuatorEvents(DeviceEvent *ev, deviceValuator *xv)
xv->deviceid = ev->deviceid;
xv->device_state = state;
for (j = 0; j < xv->num_valuators; j++)
valuators[j] = ev->valuators.data[xv->first_valuator + j];
for (j = 0; j < xv->num_valuators; j++) {
if (BitIsOn(ev->valuators.mask, xv->first_valuator + j))
valuators[j] = ev->valuators.data[xv->first_valuator + j];
else
valuators[j] = dev->valuator->axisVal[xv->first_valuator + j];
}
if (i + 6 < num_valuators)
xv->deviceid |= MORE_EVENTS;