[PATCH] Fix unset valuator handling for XI 1.x valuator events again
Peter Hutterer
peter.hutterer at who-t.net
Wed Apr 6 17:51:08 PDT 2011
On Wed, Apr 06, 2011 at 02:51:45PM -0400, Chase Douglas wrote:
> Set the valuator values for unset masked absolute valuators in the
> internal device event. This ensures the values will always be correct in
> getValuatorEvents even if the device has been removed.
>
> Signed-off-by: Chase Douglas <chase.douglas at canonical.com>
correct enough, given the hack that's required.
merged, thanks.
Cheers,
Peter
> ---
> dix/eventconvert.c | 14 +++++---------
> dix/getevents.c | 4 ++++
> 2 files changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/dix/eventconvert.c b/dix/eventconvert.c
> index a5fe0a9..14731f4 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 c3b7ced..644b388 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];
> }
> }
>
> --
> 1.7.4.1
>
More information about the xorg-devel
mailing list