From f1a8f8afc7424346dbe3360eaa5fd95d458de2e0 Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Mon, 28 Mar 2011 16:04:48 -0400 Subject: 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 Reviewed-by: Peter Hutterer Signed-off-by: Peter Hutterer (cherry picked from commit 8199eac443d2c22d313cb23e39d5e607a8cc7f99) --- dix/eventconvert.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'dix') diff --git a/dix/eventconvert.c b/dix/eventconvert.c index 3b2697f0a..78938800e 100644 --- a/dix/eventconvert.c +++ b/dix/eventconvert.c @@ -359,19 +359,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; @@ -382,8 +381,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; -- cgit v1.2.3