[PATCH evdev] Fix absolute events with swapped axes

Peter Hutterer peter.hutterer at who-t.net
Thu Dec 15 22:30:36 PST 2011


On Thu, Dec 15, 2011 at 12:33:51PM -0200, Paulo Zanoni wrote:
> Hi
> 
> 2011/12/14 Chase Douglas <chase.douglas at canonical.com>:
> > Would it be better to remove the evdev axis swap property?
> >
> > If we still want it around, it would probably be easier to have it set
> > the transformation matrix under the covers. It would make the
> > transformation matrix and evdev axis swapping properties dependent, but
> > I doubt anyone is really wanting to mix the two.
> 
> So I went and tried to use the transformation matrix code, but it also had a
> bug: a similar one, but slightly different. I wrote a patch to fix it, but I
> believe it changes the input ABI. I'll paste it in the end of the email (and
> gmail will probably mess with the white spaces). We should probably still signal
> the ABI change if needed. Or, if you know a better way to implement this, please
> tell me.


> While I was looking at this, I also tested the relative devices. It seems the
> evdev property had the same bug, so I fixed it and sent the patch. Then I tried
> to set a transformation matrix and it Just Didn't Work (tm): the
> matrix is ignored.
> For absolute devices we have the transformAbsolute function. Don't we
> also need a
> transformRelative one? Can't we use the same? We just can't remove the evdev
> property while we can't have transformation matrices for relative devices.

see http://lists.x.org/archives/xorg-devel/2011-May/022688.html, I should
still have those patches around somehere.
 
> And here is the patch. Depending on your comments I can send a next
> version using git-send-email.

not pretty, but makes sense. I wonder if there's a trick that we can use in
transformAbsolute to avoid having to store this but if we can't find one,
ACK to the principle. Please use a valuator mask though.

I also suspect that figuring out a way to use last.valuators in
untransformed coordinates will generate even more headache...

Cheers,
  Peter
> 
> diff --git a/dix/getevents.c b/dix/getevents.c
> index 8798f64..73cf72d 100644
> --- a/dix/getevents.c
> +++ b/dix/getevents.c
> @@ -1078,12 +1078,12 @@ transformAbsolute(DeviceIntPtr dev, ValuatorMask *mask)
>      if (valuator_mask_isset(mask, 0))
>          ox = x = valuator_mask_get_double(mask, 0);
>      else
> -        ox = x = dev->last.valuators[0];
> +        ox = x = dev->last.untransformedValuators[0];
> 
>      if (valuator_mask_isset(mask, 1))
>          oy = y = valuator_mask_get_double(mask, 1);
>      else
> -        oy = y = dev->last.valuators[1];
> +        oy = y = dev->last.untransformedValuators[1];
> 
>      transform(&dev->transform, &x, &y);
> 
> @@ -1167,6 +1167,8 @@ fill_pointer_events(InternalEvent *events,
> DeviceIntPtr pDev, int type,
>      RawDeviceEvent *raw;
>      double screenx = 0.0, screeny = 0.0; /* desktop coordinate system */
>      double devx = 0.0, devy = 0.0; /* desktop-wide in device coords */
> +    double untransformedAxesValues[2] = {0.0, 0.0};
> +    int untransformedAxesIsset[2] = {0, 0};
>      ValuatorMask mask;
>      ScreenPtr scr;
> 
> @@ -1207,6 +1209,11 @@ fill_pointer_events(InternalEvent *events,
> DeviceIntPtr pDev, int type,
>          set_raw_valuators(raw, &mask, raw->valuators.data_raw);
>      }
> 
> +    untransformedAxesIsset[0] = valuator_mask_isset(&mask, 0);
> +    untransformedAxesIsset[1] = valuator_mask_isset(&mask, 1);
> +    untransformedAxesValues[0] = valuator_mask_get(&mask, 0);
> +    untransformedAxesValues[1] = valuator_mask_get(&mask, 1);
> +
>      /* valuators are in driver-native format (rel or abs) */
> 
>      if (flags & POINTER_ABSOLUTE)
> @@ -1242,6 +1249,10 @@ fill_pointer_events(InternalEvent *events,
> DeviceIntPtr pDev, int type,
>          pDev->last.valuators[0] = devx;
>      if (valuator_mask_isset(&mask, 1))
>          pDev->last.valuators[1] = devy;
> +    if (untransformedAxesIsset[0])
> +        pDev->last.untransformedValuators[0] = untransformedAxesValues[0];
> +    if (untransformedAxesIsset[1])
> +        pDev->last.untransformedValuators[1] = untransformedAxesValues[1];
> 
>      for (i = 2; i < valuator_mask_size(&mask); i++)
>      {
> diff --git a/include/inputstr.h b/include/inputstr.h
> index 5634f3c..a18fd23 100644
> --- a/include/inputstr.h
> +++ b/include/inputstr.h
> @@ -538,6 +538,7 @@ typedef struct _DeviceIntRec {
>       * desktop
>       * for master devices, valuators is in desktop coordinates.
>       * see dix/getevents.c
> +     * untransformedValuators is used by the transformation matrix property
>       * remainder supports acceleration
>       */
>      struct {
> @@ -545,6 +546,7 @@ typedef struct _DeviceIntRec {
>          int             numValuators;
>          DeviceIntPtr    slave;
>          ValuatorMask    *scroll;
> +        double          untransformedValuators[2];
>      } last;
> 
>      /* Input device property handling. */
> 
> 
> Cheers,
> Paulo
> 
> 
> -- 
> Paulo Zanoni


More information about the xorg-devel mailing list