aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2011-01-31 14:11:44 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2011-05-27 15:32:23 +1000
commiteaf202531f2bb2b3da6d4769769f76da5489ae68 (patch)
treea75d7f00370ce47967d5086fdfde617e3797a2c4 /src
parentHandle touchscreens without BTN_TOUCH (diff)
downloadxf86-input-evdev-eaf202531f2bb2b3da6d4769769f76da5489ae68.tar.gz
xf86-input-evdev-eaf202531f2bb2b3da6d4769769f76da5489ae68.tar.bz2
xf86-input-evdev-eaf202531f2bb2b3da6d4769769f76da5489ae68.zip
Export device node as property.
There is currently no mapping between XI devices and physical devices other than what can be extracted by parsing the Xorg logfile. Add new property "Device Node" to the driver to export the open device file. Server 1.11 and later standardises on this property name. The client is responsible for detecting if the device is on the same host and converting the data into a more useful format (e.g. sysfs path). Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'src')
-rw-r--r--src/evdev.c20
-rw-r--r--src/evdev.h4
2 files changed, 23 insertions, 1 deletions
diff --git a/src/evdev.c b/src/evdev.c
index 0f81fb8..27cf911 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -118,6 +118,7 @@ static Atom prop_calibration;
static Atom prop_swap;
static Atom prop_axis_label;
static Atom prop_btn_label;
+static Atom prop_device;
/* All devices the evdev driver has allocated and knows about.
* MAXDEVICES is safe as null-terminated array, as two devices (VCP and VCK)
@@ -2263,6 +2264,8 @@ EvdevInitProperty(DeviceIntPtr dev)
InputInfoPtr pInfo = dev->public.devicePrivate;
EvdevPtr pEvdev = pInfo->private;
int rc;
+ char *device_node;
+
CARD32 product[2];
prop_product_id = MakeAtom(XI_PROP_PRODUCT_ID, strlen(XI_PROP_PRODUCT_ID), TRUE);
@@ -2275,6 +2278,21 @@ EvdevInitProperty(DeviceIntPtr dev)
XISetDevicePropertyDeletable(dev, prop_invert, FALSE);
+ /* Device node property */
+ device_node = strdup(pEvdev->device);
+ prop_device = MakeAtom(XI_PROP_DEVICE_NODE,
+ strlen(XI_PROP_DEVICE_NODE), TRUE);
+ rc = XIChangeDeviceProperty(dev, prop_device, XA_STRING, 8,
+ PropModeReplace,
+ strlen(device_node), device_node,
+ FALSE);
+ free(device_node);
+
+ if (rc != Success)
+ return;
+
+ XISetDevicePropertyDeletable(dev, prop_device, FALSE);
+
if (pEvdev->flags & (EVDEV_RELATIVE_EVENTS | EVDEV_ABSOLUTE_EVENTS))
{
BOOL invert[2];
@@ -2382,7 +2400,7 @@ EvdevSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
if (!checkonly)
pEvdev->swap_axes = *((BOOL*)val->data);
} else if (atom == prop_axis_label || atom == prop_btn_label ||
- atom == prop_product_id)
+ atom == prop_product_id || atom == prop_device)
return BadAccess; /* Read-only properties */
return Success;
diff --git a/src/evdev.h b/src/evdev.h
index ff50d0a..73df9ac 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -80,6 +80,10 @@
#define MAX_VALUATORS 36
#endif
+#ifndef XI_PROP_DEVICE_NODE
+#define XI_PROP_DEVICE_NODE "Device Node"
+#endif
+
#define LONG_BITS (sizeof(long) * 8)
/* Number of longs needed to hold the given number of bits */