summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2012-02-16 16:25:30 +0100
committerHenrik Rydberg <rydberg@euromail.se>2012-02-16 16:33:53 +0100
commit43ce27aab2d990e9a4f54d2050b851bd2da01875 (patch)
treede5329399fc171d2622f8a27b9aa3ca007b1ce4c
parent3ec66c3b21e45d6529567f5144ba24dcc4645591 (diff)
downloadmtdev-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.h5
-rw-r--r--src/caps.c25
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
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;
}