From 57b54ee3995f2f678ef359e7663cad517a8b2433 Mon Sep 17 00:00:00 2001 From: Oliver McFadden Date: Mon, 12 Oct 2009 16:32:51 +0300 Subject: 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 --- src/evdev.c | 55 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 20 deletions(-) (limited to 'src') 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) -- cgit v1.2.3