[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