[systemd-devel] [PATCH 1/5] udev-builtin-input_id: identify trackpoints and accelerometers
Hans de Goede
hdegoede at redhat.com
Thu Apr 2 02:48:47 PDT 2015
The kernel has been setting the INPUT_PROP_POINTING_STICK property bit
on trackpoints for a while now, and this is useful information to have
in various places, so make input_id aware of this and make it set
ID_INPUT_POINTING_STICK on trackpoints.
While adding support for querying properties, also add support for the
recently added INPUT_PROP_ACCELEROMETER property bit.
Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
src/udev/udev-builtin-input_id.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/src/udev/udev-builtin-input_id.c b/src/udev/udev-builtin-input_id.c
index 46f1c53..5b1790c 100644
--- a/src/udev/udev-builtin-input_id.c
+++ b/src/udev/udev-builtin-input_id.c
@@ -33,6 +33,14 @@
#include "udev.h"
#include "util.h"
+#ifndef INPUT_PROP_POINTING_STICK
+#define INPUT_PROP_POINTING_STICK 0x05
+#endif
+
+#ifndef INPUT_PROP_ACCELEROMETER
+#define INPUT_PROP_ACCELEROMETER 0x06
+#endif
+
/* we must use this kernel-compatible implementation */
#define BITS_PER_LONG (sizeof(unsigned long) * 8)
#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
@@ -131,6 +139,7 @@ static void test_pointers (struct udev_device *dev,
const unsigned long* bitmask_abs,
const unsigned long* bitmask_key,
const unsigned long* bitmask_rel,
+ unsigned long prop,
bool test) {
int is_mouse = 0;
int is_touchpad = 0;
@@ -182,6 +191,10 @@ static void test_pointers (struct udev_device *dev,
udev_builtin_add_property(dev, test, "ID_INPUT_MOUSE", "1");
if (is_touchpad)
udev_builtin_add_property(dev, test, "ID_INPUT_TOUCHPAD", "1");
+ if (prop & (1 << INPUT_PROP_POINTING_STICK))
+ udev_builtin_add_property(dev, test, "ID_INPUT_TRACKPOINT", "1");
+ if (prop & (1 << INPUT_PROP_ACCELEROMETER))
+ udev_builtin_add_property(dev, test, "ID_INPUT_ACCELEROMETER", "1");
}
/* key like devices */
@@ -232,7 +245,8 @@ static int builtin_input_id(struct udev_device *dev, int argc, char *argv[], boo
unsigned long bitmask_abs[NBITS(ABS_MAX)];
unsigned long bitmask_key[NBITS(KEY_MAX)];
unsigned long bitmask_rel[NBITS(REL_MAX)];
- const char *sysname, *devnode;
+ unsigned long prop = 0;
+ const char *sysname, *devnode, *prop_str;
/* walk up the parental chain until we find the real input device; the
* argument is very likely a subdevice of this, like eventN */
@@ -248,7 +262,10 @@ static int builtin_input_id(struct udev_device *dev, int argc, char *argv[], boo
get_cap_mask(dev, pdev, "capabilities/abs", bitmask_abs, sizeof(bitmask_abs), test);
get_cap_mask(dev, pdev, "capabilities/rel", bitmask_rel, sizeof(bitmask_rel), test);
get_cap_mask(dev, pdev, "capabilities/key", bitmask_key, sizeof(bitmask_key), test);
- test_pointers(dev, bitmask_ev, bitmask_abs, bitmask_key, bitmask_rel, test);
+ prop_str = udev_device_get_property_value(pdev, "PROP");
+ if (prop_str)
+ prop = strtoul(prop_str, NULL, 16);
+ test_pointers(dev, bitmask_ev, bitmask_abs, bitmask_key, bitmask_rel, prop, test);
test_key(dev, bitmask_ev, bitmask_key, test);
}
--
2.3.4
More information about the systemd-devel
mailing list