[PATCH weston 10/31] evdev: Add device capabilities

Daniel Stone daniel at fooishbar.org
Wed May 30 08:31:48 PDT 2012


Does what it says on the box: lists whether or not the device supports
key, absolute, relative or touch classes.

Signed-off-by: Daniel Stone <daniel at fooishbar.org>
---
 src/evdev-private.h |    9 +++++++++
 src/evdev.c         |   26 ++++++++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/src/evdev-private.h b/src/evdev-private.h
index e4bcf13..7b56b54 100644
--- a/src/evdev-private.h
+++ b/src/evdev-private.h
@@ -44,6 +44,14 @@ enum evdev_event_type {
 	EVDEV_RELATIVE_MOTION = (1 << 4),
 };
 
+enum evdev_device_capability {
+	EVDEV_KEYBOARD = (1 << 0),
+	EVDEV_BUTTON = (1 << 1),
+	EVDEV_MOTION_ABS = (1 << 2),
+	EVDEV_MOTION_REL = (1 << 3),
+	EVDEV_TOUCH = (1 << 4),
+};
+
 struct evdev_input_device {
 	struct evdev_seat *master;
 	struct wl_list link;
@@ -69,6 +77,7 @@ struct evdev_input_device {
 	} rel;
 
 	enum evdev_event_type pending_events;
+	enum evdev_device_capability caps;
 
 	int is_mt;
 };
diff --git a/src/evdev.c b/src/evdev.c
index 6adf10a..a34aa43 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -336,11 +336,14 @@ evdev_configure_device(struct evdev_input_device *device)
 	struct input_absinfo absinfo;
 	unsigned long ev_bits[NBITS(EV_MAX)];
 	unsigned long abs_bits[NBITS(ABS_MAX)];
+	unsigned long rel_bits[NBITS(REL_MAX)];
 	unsigned long key_bits[NBITS(KEY_MAX)];
 	int has_key, has_abs;
+	unsigned int i;
 
 	has_key = 0;
 	has_abs = 0;
+	device->caps = 0;
 
 	ioctl(device->fd, EVIOCGBIT(0, sizeof(ev_bits)), ev_bits);
 	if (TEST_BIT(ev_bits, EV_ABS)) {
@@ -352,17 +355,26 @@ evdev_configure_device(struct evdev_input_device *device)
 			ioctl(device->fd, EVIOCGABS(ABS_X), &absinfo);
 			device->abs.min_x = absinfo.minimum;
 			device->abs.max_x = absinfo.maximum;
+			device->caps |= EVDEV_MOTION_ABS;
 		}
 		if (TEST_BIT(abs_bits, ABS_Y)) {
 			ioctl(device->fd, EVIOCGABS(ABS_Y), &absinfo);
 			device->abs.min_y = absinfo.minimum;
 			device->abs.max_y = absinfo.maximum;
+			device->caps |= EVDEV_MOTION_ABS;
 		}
 		if (TEST_BIT(abs_bits, ABS_MT_SLOT)) {
 			device->is_mt = 1;
 			device->mt.slot = 0;
+			device->caps |= EVDEV_TOUCH;
 		}
 	}
+	if (TEST_BIT(ev_bits, EV_REL)) {
+		ioctl(device->fd, EVIOCGBIT(EV_REL, sizeof(rel_bits)),
+		      rel_bits);
+		if (TEST_BIT(rel_bits, REL_X) || TEST_BIT(rel_bits, REL_Y))
+			device->caps |= EVDEV_MOTION_REL;
+	}
 	if (TEST_BIT(ev_bits, EV_KEY)) {
 		has_key = 1;
 		ioctl(device->fd, EVIOCGBIT(EV_KEY, sizeof(key_bits)),
@@ -371,6 +383,20 @@ evdev_configure_device(struct evdev_input_device *device)
 		    !TEST_BIT(key_bits, BTN_TOOL_PEN) &&
 		    has_abs)
 			device->dispatch = evdev_touchpad_create(device);
+		for (i = KEY_ESC; i < KEY_MAX; i++) {
+			if (i >= BTN_MISC && i < KEY_OK)
+				continue;
+			if (TEST_BIT(key_bits, i)) {
+				device->caps |= EVDEV_KEYBOARD;
+				break;
+			}
+		}
+		for (i = BTN_MISC; i < KEY_OK; i++) {
+			if (TEST_BIT(key_bits, i)) {
+				device->caps |= EVDEV_BUTTON;
+				break;
+			}
+		}
 	}
 
 	/* This rule tries to catch accelerometer devices and opt out. We may
-- 
1.7.10



More information about the wayland-devel mailing list