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 /src | |
| parent | 3ec66c3b21e45d6529567f5144ba24dcc4645591 (diff) | |
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>
Diffstat (limited to 'src')
| -rw-r--r-- | src/caps.c | 25 |
1 files changed, 25 insertions, 0 deletions
| @@ -82,6 +82,28 @@ static void default_fuzz(struct mtdev *dev, int code, int sn) | |||
| 82 | abs->fuzz = (abs->maximum - abs->minimum) / sn; | 82 | abs->fuzz = (abs->maximum - abs->minimum) / sn; |
| 83 | } | 83 | } |
| 84 | 84 | ||
| 85 | int mtdev_set_slots(struct mtdev *dev, int fd) | ||
| 86 | { | ||
| 87 | struct { unsigned code; int values[DIM_FINGER]; } req; | ||
| 88 | struct mtdev_state *state = dev->state; | ||
| 89 | int rc, i, s, nslot; | ||
| 90 | |||
| 91 | nslot = mtdev_get_abs_maximum(dev, ABS_MT_SLOT) + 1; | ||
| 92 | |||
| 93 | for (i = 0; i < MT_ABS_SIZE; i++) { | ||
| 94 | req.code = mtdev_mt2abs(i); | ||
| 95 | if (!mtdev_has_mt_event(dev, req.code)) | ||
| 96 | continue; | ||
| 97 | SYSCALL(rc = ioctl(fd, EVIOCGMTSLOTS(sizeof(req)), &req)); | ||
| 98 | if (rc < 0) | ||
| 99 | return rc; | ||
| 100 | for (s = 0; s < DIM_FINGER && s < nslot; s++) | ||
| 101 | set_sval(&state->data[s], i, req.values[s]); | ||
| 102 | } | ||
| 103 | |||
| 104 | return 0; | ||
| 105 | } | ||
| 106 | |||
| 85 | int mtdev_configure(struct mtdev *dev, int fd) | 107 | int mtdev_configure(struct mtdev *dev, int fd) |
| 86 | { | 108 | { |
| 87 | unsigned long absbits[nlongs(ABS_MAX)]; | 109 | unsigned long absbits[nlongs(ABS_MAX)]; |
| @@ -118,6 +140,9 @@ int mtdev_configure(struct mtdev *dev, int fd) | |||
| 118 | default_fuzz(dev, ABS_MT_WIDTH_MINOR, SN_WIDTH); | 140 | default_fuzz(dev, ABS_MT_WIDTH_MINOR, SN_WIDTH); |
| 119 | default_fuzz(dev, ABS_MT_ORIENTATION, SN_ORIENT); | 141 | default_fuzz(dev, ABS_MT_ORIENTATION, SN_ORIENT); |
| 120 | 142 | ||
| 143 | if (dev->has_slot) | ||
| 144 | mtdev_set_slots(dev, fd); | ||
| 145 | |||
| 121 | return 0; | 146 | return 0; |
| 122 | } | 147 | } |
| 123 | 148 | ||
