diff options
author | Daniel Stone <daniel@fooishbar.org> | 2012-05-30 16:31:48 +0100 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-05-31 15:42:15 -0400 |
commit | 33965c242d81c9980d7b20b8adaa8c88a05f6109 (patch) | |
tree | 2782d92dd70e2e80ade9773b6d8886366b54840a | |
parent | 1d637772c821b8becd5f1ddfa97199955b199993 (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.h | 9 | ||||
-rw-r--r-- | src/evdev.c | 26 |
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 |