diff options
| author | Henrik Rydberg <rydberg@euromail.se> | 2010-06-21 22:43:58 +0200 |
|---|---|---|
| committer | Henrik Rydberg <rydberg@euromail.se> | 2010-06-22 00:44:40 +0200 |
| commit | ba936eddbf88b6d8f650082f6e7d2694f8addac4 (patch) | |
| tree | 100f573c6ca7e8c35ca2a02d8ad7974d2b86c4bb /src/core.c | |
| parent | dbbf15a7fad8b76122061344aeddb652bd4fe442 (diff) | |
Unused slot is denoted by MT_TRACKING_ID == -1
The current MT slot protocol allows any tracking id outside the range
specified by the device to denote an unused slot. This is difficult to
handle in userspace, since the valid range is unknown. This patch
tightens the definition of a valid tracking id to always lie in the
range [0, MT_ID_MAX], and uses the value -1 to denote an unused slot.
Acked-by: Chase Douglas <chase.douglas@canonical.com>
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Diffstat (limited to 'src/core.c')
| -rw-r--r-- | src/core.c | 17 |
1 files changed, 10 insertions, 7 deletions
| @@ -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 | ||
