[PATCH] evdev: Support the "Calibration" string option.

Tias tias at ulyssis.org
Wed Nov 11 12:29:04 PST 2009


Hello,

Almost all touchscreen drivers before evdev (elographics, mutouch,
penmount, evtouch and all deprecated serial drivers) use the same Xorg
config names for calibration, namely:
SwapXY
MinX
MaxX
MinY
MaxY

Unfortunately, evdev chose the name 'SwapAxes' instead of 'SwapXY'. But
with the patch from the email below, the gap with the established
drivers is increased by putting all calibration values in one joined 
'Calibration <minx> <maxx> <miny> <maxy>'

I would like to argue for using the same standard config names for the
evdev driver. This would allow people to easily switch to and from the
evdev driver: just change the name of the driver. It would also ease the
work of calibration software and FDI policy files: the same min/maxX/Y 
can be used for all touchscreen drivers.


Attached is a patch that changes the evdev driver to also use SwapXY and 
to use MinX,MaxX,MinY,MaxY for calibration. The manpage is updated too.
Signed-off-by: Tias Guns <tias at ulyssis.org>


Greetings,
Tias


On Thu, 2009-10-08 at 05:05 +0200, ext Peter Hutterer wrote:
> On Mon, Aug 03, 2009 at 02:31:02AM +0300, oliver.mcfadden at 
nokia.com wrote:
> > From: Oliver McFadden <oliver.mcfadden at nokia.com>
> >
> > Originally based on a patch from Daniel Stone, this commit allows for
> > the calibration factors to be set either from Xorg.conf or via HAL.
> >
> > Previously the only way was via the properties interface.
> > ---
> >  src/evdev.c |   51 ++++++++++++++++++++++++++++++---------------------
> >  1 files changed, 30 insertions(+), 21 deletions(-)
> >
> > diff --git a/src/evdev.c b/src/evdev.c
> > index 7ea2ef7..5cc290a 100644
> > --- a/src/evdev.c
> > +++ b/src/evdev.c
> > @@ -1868,12 +1868,32 @@ EvdevProbe(InputInfoPtr pInfo)
> >      return 0;
> >  }
> >
> > +static void
> > +EvdevSetCalibration(InputInfoPtr pInfo, int num_calibration, int 
calibration[4])
> > +{
> > +    EvdevPtr pEvdev = pInfo->private;
> > +
> > +    if (num_calibration == 0) {
> > +        pEvdev->flags &= ~EVDEV_CALIBRATED;
> > +        pEvdev->calibration.min_x = 0;
> > +        pEvdev->calibration.max_x = 0;
> > +        pEvdev->calibration.min_y = 0;
> > +        pEvdev->calibration.max_y = 0;
> > +    } else if (num_calibration == 4) {
> > +        pEvdev->flags |= EVDEV_CALIBRATED;
> > +        pEvdev->calibration.min_x = calibration[0];
> > +        pEvdev->calibration.max_x = calibration[1];
> > +        pEvdev->calibration.min_y = calibration[2];
> > +        pEvdev->calibration.max_y = calibration[3];
> > +    }
> > +}
> >
> >  static InputInfoPtr
> >  EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
> >  {
> >      InputInfoPtr pInfo;
> > -    const char *device;
> > +    const char *device, *str;
> > +    int num_calibration = 0, calibration[4] = { 0, 0, 0, 0 };
> >      EvdevPtr pEvdev;
> >
> >      if (!(pInfo = xf86AllocateInput(drv, 0)))
> > @@ -1946,6 +1966,14 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr 
dev, int flags)
> >      pEvdev->invert_y = xf86SetBoolOption(pInfo->options, 
"InvertY", FALSE);
> >      pEvdev->swap_axes = xf86SetBoolOption(pInfo->options, 
"SwapAxes", FALSE);
> >
> > +    str = xf86CheckStrOption(pInfo->options, "Calibration", NULL);
> > +    if (str) {
> > +        num_calibration = sscanf(str, "%d %d %d %d",
> > +                                 &calibration[0], &calibration[1],
> > +                                 &calibration[2], &calibration[3]);
> > +        EvdevSetCalibration(pInfo, num_calibration, calibration);
>
> There should be an error message if num_calibration != 4, and better only
> call EvdevSetCalibration if num_calibration is 4, it's more readable 
- even
> though the same check exists inside the function again.
>
> > +    }
> > +
> >      /* Grabbing the event device stops in-kernel event forwarding. 
In other
> >         words, it disables rfkill and the "Macintosh mouse button 
emulation".
> >         Note that this needs a server that sets the console to RAW 
mode. */
> > @@ -2419,27 +2447,8 @@ EvdevSetProperty(DeviceIntPtr dev, Atom 
atom, XIPropertyValuePtr val,
> >              return BadMatch;
> >          if (val->size != 4 && val->size != 0)
> >              return BadMatch;
> > -
> >          if (!checkonly)
> > -        {
> > -            if (val->size == 0)
> > -            {
> > -                pEvdev->flags &= ~EVDEV_CALIBRATED;
> > -                pEvdev->calibration.min_x = 0;
> > -                pEvdev->calibration.max_x = 0;
> > -                pEvdev->calibration.min_y = 0;
> > -                pEvdev->calibration.max_y = 0;
> > -            } else if (val->size == 4)
> > -            {
> > -                CARD32 *vals = (CARD32*)val->data;
> > -
> > -                pEvdev->flags |= EVDEV_CALIBRATED;
> > -                pEvdev->calibration.min_x = vals[0];
> > -                pEvdev->calibration.max_x = vals[1];
> > -                pEvdev->calibration.min_y = vals[2];
> > -                pEvdev->calibration.max_y = vals[3];
> > -            }
> > -        }
> > +            EvdevSetCalibration(pInfo, val->size, val->data);
> >      } else if (atom == prop_swap)
> >      {
> >          if (val->format != 8 || val->type != XA_INTEGER || 
val->size != 1)
> > --
> > 1.6.1
>
> man page addition is missing. Other than that, I'm fine with it.
>
> Cheers,
>   Peter

-------------- next part --------------
A non-text attachment was scrubbed...
Name: evdev_calib.patch
Type: text/x-patch
Size: 4611 bytes
Desc: not available
URL: <http://lists.x.org/archives/xorg/attachments/20091111/c8a6beaa/attachment.bin>


More information about the xorg mailing list