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:
parent
ac00ab77d5
commit
8199eac443
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user