From 43ce27aab2d990e9a4f54d2050b851bd2da01875 Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Thu, 16 Feb 2012 16:25:30 +0100 Subject: 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 --- include/mtdev.h | 5 +++++ src/caps.c | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) 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 diff --git a/src/caps.c b/src/caps.c index 23f16fc..45c185c 100644 --- a/src/caps.c +++ b/src/caps.c @@ -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; } -- cgit v1.2.3