summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2010-06-21 22:43:58 +0200
committerHenrik Rydberg <rydberg@euromail.se>2010-06-22 00:44:40 +0200
commitba936eddbf88b6d8f650082f6e7d2694f8addac4 (patch)
tree100f573c6ca7e8c35ca2a02d8ad7974d2b86c4bb /src
parentdbbf15a7fad8b76122061344aeddb652bd4fe442 (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')
-rw-r--r--src/caps.c6
-rw-r--r--src/core.c17
2 files changed, 14 insertions, 9 deletions
diff --git a/src/caps.c b/src/caps.c
index 1821bd7..0788acf 100644
--- a/src/caps.c
+++ b/src/caps.c
@@ -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);
diff --git a/src/core.c b/src/core.c
index 8df2477..55b62b6 100644
--- a/src/core.c
+++ b/src/core.c
@@ -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
338int mtdev_init(struct mtdev *dev) 338int 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