summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@redhat.com>2008-10-01 13:58:24 +0930
committerPeter Hutterer <peter.hutterer@redhat.com>2008-10-03 14:42:02 +0930
commita196672a6bafd4e7d3a2cca991a2a3bf4bdcd952 (patch)
tree85459b08e19dbbda97b1b7ae624aa60102f424d5
parent3985d423204217a1f072fa6e0145cba547f79a97 (diff)
Add property support for axis inversion.
-rw-r--r--include/evdev-properties.h4
-rw-r--r--src/evdev.c59
2 files changed, 63 insertions, 0 deletions
diff --git a/include/evdev-properties.h b/include/evdev-properties.h
index 46f9f3b..6fdad53 100644
--- a/include/evdev-properties.h
+++ b/include/evdev-properties.h
@@ -50,4 +50,8 @@
/* CARD8, either 1 value or pairs, value range 0-32, 0 to disable a value*/
#define EVDEV_PROP_DRAGLOCK "Evdev Drag Lock Buttons"
+/* Axis inversion */
+/* BOOL, 2 values [x, y], 1 inverts axis */
+#define EVDEV_PROP_INVERT_AXES "Evdev Axis Inversion"
+
#endif
diff --git a/src/evdev.c b/src/evdev.c
index b24dc50..a7f4f23 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -52,6 +52,11 @@
#include <errno.h>
#include <fcntl.h>
+#ifdef HAVE_PROPERTIES
+#include <X11/Xatom.h>
+#include <evdev-properties.h>
+#endif
+
/* 2.4 compatibility */
#ifndef EVIOCGRAB
#define EVIOCGRAB _IOW('E', 0x90, int)
@@ -100,6 +105,15 @@ static const char *evdevDefaults[] = {
static int EvdevOn(DeviceIntPtr);
static int EvdevCacheCompare(InputInfoPtr pInfo, Bool compare);
+#ifdef HAVE_PROPERTIES
+static void EvdevInitProperty(DeviceIntPtr dev);
+static int EvdevSetProperty(DeviceIntPtr dev, Atom atom,
+ XIPropertyValuePtr val);
+static Atom prop_invert = 0;
+
+#endif
+
+
static void
SetXkbOption(InputInfoPtr pInfo, char *name, char **option)
{
@@ -944,6 +958,8 @@ EvdevInit(DeviceIntPtr device)
XIRegisterPropertyHandler(device, EvdevMBEmuSetProperty, NULL, NULL);
XIRegisterPropertyHandler(device, EvdevWheelEmuSetProperty, NULL, NULL);
XIRegisterPropertyHandler(device, EvdevDragLockSetProperty, NULL, NULL);
+ XIRegisterPropertyHandler(device, EvdevSetProperty, NULL, NULL);
+ EvdevInitProperty(device);
EvdevMBEmuInitProperty(device);
EvdevWheelEmuInitProperty(device);
EvdevDragLockInitProperty(device);
@@ -1451,3 +1467,46 @@ EvdevUtilButtonEventToButtonNumber(int code)
return button;
}
+
+#ifdef HAVE_PROPERTIES
+static void
+EvdevInitProperty(DeviceIntPtr dev)
+{
+ InputInfoPtr pInfo = dev->public.devicePrivate;
+ EvdevPtr pEvdev = pInfo->private;
+ int rc;
+ BOOL invert[2];
+
+ invert[0] = pEvdev->invert_x;
+ invert[1] = pEvdev->invert_y;
+
+ prop_invert = MakeAtom(EVDEV_PROP_INVERT_AXES, strlen(EVDEV_PROP_INVERT_AXES), TRUE);
+
+ rc = XIChangeDeviceProperty(dev, prop_invert, XA_INTEGER, 8,
+ PropModeReplace, 2,
+ invert, FALSE);
+ if (rc != Success)
+ return;
+
+ XISetDevicePropertyDeletable(dev, prop_invert, FALSE);
+}
+
+static int
+EvdevSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val)
+{
+ InputInfoPtr pInfo = dev->public.devicePrivate;
+ EvdevPtr pEvdev = pInfo->private;
+
+ if (atom == prop_invert)
+ {
+ BOOL* data;
+ if (val->format != 8 || val->size != 2 || val->type != XA_INTEGER)
+ return BadMatch;
+ data = (BOOL*)val->data;
+ pEvdev->invert_x = data[0];
+ pEvdev->invert_y = data[1];
+ }
+
+ return Success;
+}
+#endif