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

Oliver McFadden oliver.mcfadden at nokia.com
Mon Oct 12 06:32:51 PDT 2009


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.
---
 man/evdev.man |    5 +++++
 src/evdev.c   |   56 ++++++++++++++++++++++++++++++++++++--------------------
 2 files changed, 41 insertions(+), 20 deletions(-)

diff --git a/man/evdev.man b/man/evdev.man
index 4f15062..05626b5 100644
--- a/man/evdev.man
+++ b/man/evdev.man
@@ -150,6 +150,11 @@ be set in the configuration.
 Number of reopen attempts after a read error occurs on the device (e.g. after
 waking up from suspend). In between each attempt is a 100ms wait. Default: 10.
 .TP 7
+.BI "Option \*qCalibration\*q \*q" "min-x max-x min-y max-y" \*q
+Calibrates the X and Y axes for devices that need to scale to a different
+coordinate system than reported to the X server.
+Property: "Evdev Axis Calibration".
+.TP 7
 .BI "Option \*qSwapAxes\*q \*q" Bool \*q
 Swap x/y axes. Default: off. Property: "Evdev Axes Swap".
 .TP 7
diff --git a/src/evdev.c b/src/evdev.c
index 59cdd0d..d8d0f72 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -1949,12 +1949,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)))
@@ -2027,6 +2047,20 @@ 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: Unsupported number of calibration factors: %d\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. */
@@ -2502,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)
-- 
1.6.1



More information about the xorg-devel mailing list