diff options
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 | ||
