summaryrefslogtreecommitdiff
path: root/src/touch-caps.c
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2010-09-09 10:17:09 +0200
committerHenrik Rydberg <rydberg@euromail.se>2010-09-09 10:17:09 +0200
commit9bdd12a8046f33a6d190bb33371eb30d3ee59062 (patch)
treee23f8c501a3fd056836c0474666ab665deb25ccd /src/touch-caps.c
parent293c6123865c2ec6106949226b790ac54f0eaef6 (diff)
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 <rydberg@euromail.se>
Diffstat (limited to 'src/touch-caps.c')
-rw-r--r--src/touch-caps.c37
1 files changed, 37 insertions, 0 deletions
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 @@
21 ****************************************************************************/ 21 ****************************************************************************/
22 22
23#include <grail-touch.h> 23#include <grail-touch.h>
24#include <errno.h>
24#include <math.h> 25#include <math.h>
25 26
26/* see mtdev-mapping.h */ 27/* see mtdev-mapping.h */
@@ -29,6 +30,42 @@
29#define MTDEV_ORIENTATION 4 30#define MTDEV_ORIENTATION 4
30#define MTDEV_PRESSURE 10 31#define MTDEV_PRESSURE 10
31 32
33#define SYSCALL(call) while (((call) == -1) && (errno == EINTR))
34
35static const int bits_per_long = 8 * sizeof(long);
36
37static inline int nlongs(int nbit)
38{
39 return (nbit + bits_per_long - 1) / bits_per_long;
40}
41
42static inline int getbit(const unsigned long *map, int key)
43{
44 return (map[key / bits_per_long] >> (key % bits_per_long)) & 0x01;
45}
46
47int touch_caps_is_supported(struct touch_dev *dev, int fd)
48{
49 unsigned long keybits[nlongs(KEY_MAX)];
50 unsigned long absbits[nlongs(ABS_MAX)];
51 int rc;
52
53 if (dev->mtdev.caps.has_mtdata)
54 return 1;
55
56 SYSCALL(rc = ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybits)), keybits));
57 if (rc < 0)
58 return 0;
59 SYSCALL(rc = ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbits)), absbits));
60 if (rc < 0)
61 return 0;
62
63 return getbit(absbits, ABS_X) &&
64 getbit(absbits, ABS_Y) &&
65 getbit(keybits, BTN_TOUCH) &&
66 getbit(keybits, BTN_TOOL_DOUBLETAP);
67}
68
32void touch_caps_init(struct touch_dev *dev) 69void touch_caps_init(struct touch_dev *dev)
33{ 70{
34 const struct mtdev_caps *mt = &dev->mtdev.caps; 71 const struct mtdev_caps *mt = &dev->mtdev.caps;