diff options
author | Henrik Rydberg <rydberg@euromail.se> | 2012-02-16 16:25:30 +0100 |
---|---|---|
committer | Henrik Rydberg <rydberg@euromail.se> | 2012-02-16 16:33:53 +0100 |
commit | 43ce27aab2d990e9a4f54d2050b851bd2da01875 (patch) | |
tree | de5329399fc171d2622f8a27b9aa3ca007b1ce4c | |
parent | 3ec66c3b21e45d6529567f5144ba24dcc4645591 (diff) | |
download | mtdev-git-43ce27aab2d990e9a4f54d2050b851bd2da01875.tar.gz |
Add support for kernel MT slot state retrieval
From kernel 3.4, extraction of the MT slot state is supported
via the EVIOGMTSLOTS ioctl. This patch initializes the slots
using that information.
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
-rw-r--r-- | include/mtdev.h | 5 | ||||
-rw-r--r-- | src/caps.c | 25 |
2 files changed, 30 insertions, 0 deletions
diff --git a/include/mtdev.h b/include/mtdev.h index ba682c5..33ea29c 100644 --- a/include/mtdev.h +++ b/include/mtdev.h @@ -68,6 +68,11 @@ extern "C" { #define ABS_MT_DISTANCE 0x3b /* Contact hover distance */ #endif +/* includes available in 3.4 */ +#ifndef EVIOCGMTSLOTS +#define EVIOCGMTSLOTS(len) _IOC(_IOC_READ, 'E', 0x0a, len) +#endif + #define MT_ID_NULL (-1) #define MT_ID_MIN 0 #define MT_ID_MAX 65535 @@ -82,6 +82,28 @@ static void default_fuzz(struct mtdev *dev, int code, int sn) abs->fuzz = (abs->maximum - abs->minimum) / sn; } +int mtdev_set_slots(struct mtdev *dev, int fd) +{ + struct { unsigned code; int values[DIM_FINGER]; } req; + struct mtdev_state *state = dev->state; + int rc, i, s, nslot; + + nslot = mtdev_get_abs_maximum(dev, ABS_MT_SLOT) + 1; + + for (i = 0; i < MT_ABS_SIZE; i++) { + req.code = mtdev_mt2abs(i); + if (!mtdev_has_mt_event(dev, req.code)) + continue; + SYSCALL(rc = ioctl(fd, EVIOCGMTSLOTS(sizeof(req)), &req)); + if (rc < 0) + return rc; + for (s = 0; s < DIM_FINGER && s < nslot; s++) + set_sval(&state->data[s], i, req.values[s]); + } + + return 0; +} + int mtdev_configure(struct mtdev *dev, int fd) { unsigned long absbits[nlongs(ABS_MAX)]; @@ -118,6 +140,9 @@ int mtdev_configure(struct mtdev *dev, int fd) default_fuzz(dev, ABS_MT_WIDTH_MINOR, SN_WIDTH); default_fuzz(dev, ABS_MT_ORIENTATION, SN_ORIENT); + if (dev->has_slot) + mtdev_set_slots(dev, fd); + return 0; } |