summaryrefslogtreecommitdiff
path: root/src/caps.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/caps.c')
-rw-r--r--src/caps.c25
1 files changed, 25 insertions, 0 deletions
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;
}