diff options
| -rw-r--r-- | include/mtdev.h | 6 | ||||
| -rw-r--r-- | src/caps.c | 6 | ||||
| -rw-r--r-- | src/core.c | 17 |
3 files changed, 18 insertions, 11 deletions
diff --git a/include/mtdev.h b/include/mtdev.h index b759803..b621245 100644 --- a/include/mtdev.h +++ b/include/mtdev.h | |||
| @@ -74,11 +74,14 @@ | |||
| 74 | 74 | ||
| 75 | #define MT_ABS_SIZE 11 | 75 | #define MT_ABS_SIZE 11 |
| 76 | 76 | ||
| 77 | #define MT_ID_NULL (-1) | ||
| 78 | #define MT_ID_MIN 0 | ||
| 79 | #define MT_ID_MAX 65535 | ||
| 80 | |||
| 77 | /** | 81 | /** |
| 78 | * struct mt_caps - protocol capabilities of kernel device | 82 | * struct mt_caps - protocol capabilities of kernel device |
| 79 | * @has_mtdata: true if the device has MT capabilities | 83 | * @has_mtdata: true if the device has MT capabilities |
| 80 | * @has_slot: true if the device sends MT slots | 84 | * @has_slot: true if the device sends MT slots |
| 81 | * @nullid: tracking id used to represent null | ||
| 82 | * @slot: slot event properties | 85 | * @slot: slot event properties |
| 83 | * @abs: ABS_MT event properties | 86 | * @abs: ABS_MT event properties |
| 84 | */ | 87 | */ |
| @@ -86,7 +89,6 @@ struct mtdev_caps { | |||
| 86 | int has_mtdata; | 89 | int has_mtdata; |
| 87 | int has_slot; | 90 | int has_slot; |
| 88 | int has_abs[MT_ABS_SIZE]; | 91 | int has_abs[MT_ABS_SIZE]; |
| 89 | int nullid; | ||
| 90 | struct input_absinfo slot; | 92 | struct input_absinfo slot; |
| 91 | struct input_absinfo abs[MT_ABS_SIZE]; | 93 | struct input_absinfo abs[MT_ABS_SIZE]; |
| 92 | }; | 94 | }; |
| @@ -83,8 +83,10 @@ static int read_caps(struct mtdev_caps *cap, int fd) | |||
| 83 | 83 | ||
| 84 | cap->has_mtdata = has_mt_data(cap); | 84 | cap->has_mtdata = has_mt_data(cap); |
| 85 | 85 | ||
| 86 | if (cap->has_abs[MTDEV_TRACKING_ID]) | 86 | if (!cap->has_abs[MTDEV_TRACKING_ID]) { |
| 87 | cap->nullid = cap->abs[MTDEV_TRACKING_ID].minimum - 1; | 87 | cap->abs[MTDEV_TRACKING_ID].minimum = MT_ID_MIN; |
| 88 | cap->abs[MTDEV_TRACKING_ID].maximum = MT_ID_MAX; | ||
| 89 | } | ||
| 88 | 90 | ||
| 89 | default_fuzz(cap, MTDEV_POSITION_X, SN_COORD); | 91 | default_fuzz(cap, MTDEV_POSITION_X, SN_COORD); |
| 90 | default_fuzz(cap, MTDEV_POSITION_Y, SN_COORD); | 92 | default_fuzz(cap, MTDEV_POSITION_Y, SN_COORD); |
| @@ -89,9 +89,9 @@ static void solve(struct mtdev_state *state, const struct mtdev_caps *caps, | |||
| 89 | /* update matched contacts and create new ones */ | 89 | /* update matched contacts and create new ones */ |
| 90 | foreach_bit(i, touch) { | 90 | foreach_bit(i, touch) { |
| 91 | j = n2s[i]; | 91 | j = n2s[i]; |
| 92 | id = j >= 0 ? sid[j] : caps->nullid; | 92 | id = j >= 0 ? sid[j] : MT_ID_NULL; |
| 93 | while (id == caps->nullid) | 93 | if (id == MT_ID_NULL) |
| 94 | id = ++state->lastid; | 94 | id = state->lastid++ & MT_ID_MAX; |
| 95 | nid[i] = id; | 95 | nid[i] = id; |
| 96 | } | 96 | } |
| 97 | } | 97 | } |
| @@ -125,7 +125,7 @@ static void assign_tracking_id(struct mtdev_state *state, | |||
| 125 | solve(state, caps, sid, sx, sy, sn, nid, nx, ny, size, touch); | 125 | solve(state, caps, sid, sx, sy, sn, nid, nx, ny, size, touch); |
| 126 | for (i = 0; i < size; i++) { | 126 | for (i = 0; i < size; i++) { |
| 127 | data[i].abs[MTDEV_TRACKING_ID] = | 127 | data[i].abs[MTDEV_TRACKING_ID] = |
| 128 | GETBIT(touch, i) ? nid[i] : caps->nullid; | 128 | GETBIT(touch, i) ? nid[i] : MT_ID_NULL; |
| 129 | prop[i] |= BITMASK(MTDEV_TRACKING_ID); | 129 | prop[i] |= BITMASK(MTDEV_TRACKING_ID); |
| 130 | } | 130 | } |
| 131 | } | 131 | } |
| @@ -289,10 +289,10 @@ static void apply_typeA_changes(struct mtdev_state *state, | |||
| 289 | filter_data(state, caps, &data[i], prop[i], slot); | 289 | filter_data(state, caps, &data[i], prop[i], slot); |
| 290 | push_slot_changes(state, &data[i], prop[i], slot, syn); | 290 | push_slot_changes(state, &data[i], prop[i], slot, syn); |
| 291 | SETBIT(used, slot); | 291 | SETBIT(used, slot); |
| 292 | id = caps->nullid; | 292 | id = MT_ID_NULL; |
| 293 | break; | 293 | break; |
| 294 | } | 294 | } |
| 295 | if (id != caps->nullid) { | 295 | if (id != MT_ID_NULL) { |
| 296 | slot = firstbit(unused); | 296 | slot = firstbit(unused); |
| 297 | push_slot_changes(state, &data[i], prop[i], slot, syn); | 297 | push_slot_changes(state, &data[i], prop[i], slot, syn); |
| 298 | SETBIT(used, slot); | 298 | SETBIT(used, slot); |
| @@ -304,7 +304,7 @@ static void apply_typeA_changes(struct mtdev_state *state, | |||
| 304 | foreach_bit(slot, state->used & ~used) { | 304 | foreach_bit(slot, state->used & ~used) { |
| 305 | struct mtdev_slot tdata = state->data[slot]; | 305 | struct mtdev_slot tdata = state->data[slot]; |
| 306 | bitmask_t tprop = BITMASK(MTDEV_TRACKING_ID); | 306 | bitmask_t tprop = BITMASK(MTDEV_TRACKING_ID); |
| 307 | tdata.abs[MTDEV_TRACKING_ID] = caps->nullid; | 307 | tdata.abs[MTDEV_TRACKING_ID] = MT_ID_NULL; |
| 308 | push_slot_changes(state, &tdata, tprop, slot, syn); | 308 | push_slot_changes(state, &tdata, tprop, slot, syn); |
| 309 | } | 309 | } |
| 310 | state->used = used; | 310 | state->used = used; |
| @@ -337,10 +337,13 @@ static void convert_A_to_B(struct mtdev_state *state, | |||
| 337 | 337 | ||
| 338 | int mtdev_init(struct mtdev *dev) | 338 | int mtdev_init(struct mtdev *dev) |
| 339 | { | 339 | { |
| 340 | int i; | ||
| 340 | memset(dev, 0, sizeof(struct mtdev)); | 341 | memset(dev, 0, sizeof(struct mtdev)); |
| 341 | dev->state = calloc(1, sizeof(struct mtdev_state)); | 342 | dev->state = calloc(1, sizeof(struct mtdev_state)); |
| 342 | if (!dev->state) | 343 | if (!dev->state) |
| 343 | return -ENOMEM; | 344 | return -ENOMEM; |
| 345 | for (i = 0; i < DIM_FINGER; i++) | ||
| 346 | dev->state->data[i].abs[MTDEV_TRACKING_ID] = MT_ID_NULL; | ||
| 344 | return 0; | 347 | return 0; |
| 345 | } | 348 | } |
| 346 | 349 | ||
