summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stone <daniel@fooishbar.org>2012-05-30 16:31:48 +0100
committerKristian Høgsberg <krh@bitplanet.net>2012-05-31 15:42:15 -0400
commit33965c242d81c9980d7b20b8adaa8c88a05f6109 (patch)
tree2782d92dd70e2e80ade9773b6d8886366b54840a
parent1d637772c821b8becd5f1ddfa97199955b199993 (diff)
evdev: Add device capabilities
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@fooishbar.org>
-rw-r--r--src/evdev-private.h9
-rw-r--r--src/evdev.c26
2 files changed, 35 insertions, 0 deletions
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