diff options
author | Oliver McFadden <oliver.mcfadden@nokia.com> | 2009-10-12 16:32:51 +0300 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2009-10-13 18:30:43 +1000 |
commit | 57b54ee3995f2f678ef359e7663cad517a8b2433 (patch) | |
tree | 5efeccc6d3124bfd9db9b92b9e1499e34f462dec /src | |
parent | f2dc0681febd297d95dae7c9e3ae19b771af8420 (diff) |
evdev: Support the "Calibration" string option.
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.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'src')
-rw-r--r-- | src/evdev.c | 55 |
1 files changed, 35 insertions, 20 deletions
diff --git a/src/evdev.c b/src/evdev.c index 2ffa412..ff69197 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1950,12 +1950,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))) @@ -2028,6 +2048,19 @@ 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]); + if (num_calibration == 4) + EvdevSetCalibration(pInfo, num_calibration, calibration); + else + xf86Msg(X_ERROR, + "%s: Insufficient calibration factors (%d). Ignoring calibration\n", + pInfo->name, num_calibration); + } + /* 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. */ @@ -2503,25 +2536,7 @@ EvdevSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val, 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) |