From 9bdd12a8046f33a6d190bb33371eb30d3ee59062 Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Thu, 9 Sep 2010 10:17:09 +0200 Subject: Support legacy devices Simulate MT touch events for legacy devices that support the DOUBLETAP, TRIPLETAP and QUADTAP events. This allows multi-finger tap and drag gestures to be emitted, providing a basic level of MT functionality for legacy devices. Signed-off-by: Henrik Rydberg --- src/touch-caps.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'src/touch-caps.c') diff --git a/src/touch-caps.c b/src/touch-caps.c index 7f243c5..a51912c 100644 --- a/src/touch-caps.c +++ b/src/touch-caps.c @@ -21,6 +21,7 @@ ****************************************************************************/ #include +#include #include /* see mtdev-mapping.h */ @@ -29,6 +30,42 @@ #define MTDEV_ORIENTATION 4 #define MTDEV_PRESSURE 10 +#define SYSCALL(call) while (((call) == -1) && (errno == EINTR)) + +static const int bits_per_long = 8 * sizeof(long); + +static inline int nlongs(int nbit) +{ + return (nbit + bits_per_long - 1) / bits_per_long; +} + +static inline int getbit(const unsigned long *map, int key) +{ + return (map[key / bits_per_long] >> (key % bits_per_long)) & 0x01; +} + +int touch_caps_is_supported(struct touch_dev *dev, int fd) +{ + unsigned long keybits[nlongs(KEY_MAX)]; + unsigned long absbits[nlongs(ABS_MAX)]; + int rc; + + if (dev->mtdev.caps.has_mtdata) + return 1; + + SYSCALL(rc = ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybits)), keybits)); + if (rc < 0) + return 0; + SYSCALL(rc = ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbits)), absbits)); + if (rc < 0) + return 0; + + return getbit(absbits, ABS_X) && + getbit(absbits, ABS_Y) && + getbit(keybits, BTN_TOUCH) && + getbit(keybits, BTN_TOOL_DOUBLETAP); +} + void touch_caps_init(struct touch_dev *dev) { const struct mtdev_caps *mt = &dev->mtdev.caps; -- cgit v1.2.3