summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChase Douglas <chase.douglas@canonical.com>2011-03-28 16:04:48 -0400
committerPeter Hutterer <peter.hutterer@who-t.net>2011-04-04 09:54:57 +1000
commit8199eac443d2c22d313cb23e39d5e607a8cc7f99 (patch)
tree66c986603054c9d7d16d9dcddc684a9bc15d401e
parentac00ab77d5a00cfd198958aa1afaa4c3ccc6d7bc (diff)
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>
-rw-r--r--dix/eventconvert.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 07d53e0f0..5fdd35714 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -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;