aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/evdev.c56
1 files changed, 54 insertions, 2 deletions
diff --git a/src/evdev.c b/src/evdev.c
index 75e8de8..463b32a 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -50,6 +50,7 @@
#ifdef HAVE_PROPERTIES
#include <X11/Xatom.h>
#include <evdev-properties.h>
+#include <xserver-properties.h>
#endif
#ifndef MAXDEVICES
@@ -115,6 +116,7 @@ static Atom prop_invert = 0;
static Atom prop_reopen = 0;
static Atom prop_calibration = 0;
static Atom prop_swap = 0;
+static Atom prop_label = 0;
#endif
/* All devices the evdev driver has allocated and knows about.
@@ -1702,7 +1704,6 @@ EvdevInitProperty(DeviceIntPtr dev)
BOOL invert[2];
char reopen;
-
if (pEvdev->flags & (EVDEV_RELATIVE_EVENTS | EVDEV_ABSOLUTE_EVENTS))
{
invert[0] = pEvdev->invert_x;
@@ -1749,6 +1750,56 @@ EvdevInitProperty(DeviceIntPtr dev)
return;
XISetDevicePropertyDeletable(dev, prop_swap, FALSE);
+
+
+ /* Axis labelling
+ This is of course rather stupid. Because evdev doesn't really deal with
+ arbitrary axes yet, axis 0/1 must always be X/Y. If we have pressure,
+ then it's always axis 2. So the labelling is rather lame.
+ */
+ if ((prop_label = XIGetKnownProperty(AXIS_LABEL_PROP)))
+ {
+ Atom atom, atoms[3];
+
+ if (TestBit(REL_X, pEvdev->rel_bitmask))
+ {
+ atom = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
+ if (atom)
+ atoms[0] = atom;
+ } else if (TestBit(ABS_X, pEvdev->abs_bitmask))
+ {
+ atom = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_X);
+ if (atom)
+ atoms[0] = atom;
+ }
+
+ if (TestBit(REL_Y, pEvdev->rel_bitmask))
+ {
+ atom = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
+ if (atom)
+ atoms[1] = atom;
+ } else if (TestBit(ABS_Y, pEvdev->abs_bitmask))
+ {
+ atom = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_Y);
+ if (atom)
+ atoms[1] = atom;
+ }
+
+ if (TestBit(ABS_PRESSURE, pEvdev->abs_bitmask))
+ {
+ atom = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_PRESSURE);
+ if (atom)
+ atoms[2] = atom;
+ }
+
+ if (atoms[0] != -1 && atoms[1] != -1)
+ {
+ int natoms = (pEvdev->has_pressure && atoms[2] != -1) ? 3 : 2;
+ XIChangeDeviceProperty(dev, prop_label, XA_ATOM, 32,
+ PropModeReplace, natoms, &atoms, FALSE);
+ XISetDevicePropertyDeletable(dev, prop_label, FALSE);
+ }
+ }
}
static int
@@ -1811,7 +1862,8 @@ EvdevSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
if (!checkonly)
pEvdev->swap_axes = *((BOOL*)val->data);
- }
+ } else if (atom == prop_label)
+ return BadAccess; /* Axis labels can't be changed */
return Success;
}