diff options
Diffstat (limited to 'src/touch-caps.c')
| -rw-r--r-- | src/touch-caps.c | 37 |
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 | |||
| 35 | static const int bits_per_long = 8 * sizeof(long); | ||
| 36 | |||
| 37 | static inline int nlongs(int nbit) | ||
| 38 | { | ||
| 39 | return (nbit + bits_per_long - 1) / bits_per_long; | ||
| 40 | } | ||
| 41 | |||
| 42 | static inline int getbit(const unsigned long *map, int key) | ||
| 43 | { | ||
| 44 | return (map[key / bits_per_long] >> (key % bits_per_long)) & 0x01; | ||
| 45 | } | ||
| 46 | |||
| 47 | int 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 | |||
| 32 | void touch_caps_init(struct touch_dev *dev) | 69 | void 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; |
