diff --git a/dix/eventconvert.c b/dix/eventconvert.c index a5fe0a9cc..14731f4f6 100644 --- a/dix/eventconvert.c +++ b/dix/eventconvert.c @@ -383,12 +383,12 @@ 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; @@ -405,14 +405,10 @@ getValuatorEvents(DeviceEvent *ev, deviceValuator *xv) xv->deviceid = ev->deviceid; xv->device_state = state; - 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 if (dev->valuator->axes[xv->first_valuator + j].mode == Absolute) - valuators[j] = dev->valuator->axisVal[xv->first_valuator + j]; - else - valuators[j] = 0; - } + /* Unset valuators in masked valuator events have the proper data values + * in the case of an absolute axis in between two set valuators. */ + for (j = 0; j < xv->num_valuators; j++) + valuators[j] = ev->valuators.data[xv->first_valuator + j]; if (i + 6 < num_valuators) xv->deviceid |= MORE_EVENTS; diff --git a/dix/getevents.c b/dix/getevents.c index c3b7ced45..644b3887e 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -205,6 +205,8 @@ set_valuators(DeviceIntPtr dev, DeviceEvent* event, ValuatorMask *mask) { int i; + /* Set the data to the previous value for unset absolute axes. The values + * may be used when sent as part of an XI 1.x valuator event. */ for (i = 0; i < valuator_mask_size(mask); i++) { if (valuator_mask_isset(mask, i)) @@ -216,6 +218,8 @@ set_valuators(DeviceIntPtr dev, DeviceEvent* event, ValuatorMask *mask) event->valuators.data_frac[i] = dev->last.remainder[i] * (1 << 16) * (1 << 16); } + else if (valuator_get_mode(dev, i) == Absolute) + event->valuators.data[i] = dev->valuator->axisVal[i]; } }