summaryrefslogtreecommitdiff
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
parentdbbf15a7fad8b76122061344aeddb652bd4fe442 (diff)
downloadmtdev-git-ba936eddbf88b6d8f650082f6e7d2694f8addac4.tar.gz
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>
-rw-r--r--include/mtdev.h6
-rw-r--r--src/caps.c6
-rw-r--r--src/core.c17
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 @@
#define MT_ABS_SIZE 11
+#define MT_ID_NULL (-1)
+#define MT_ID_MIN 0
+#define MT_ID_MAX 65535
+
/**
* struct mt_caps - protocol capabilities of kernel device
* @has_mtdata: true if the device has MT capabilities
* @has_slot: true if the device sends MT slots
- * @nullid: tracking id used to represent null
* @slot: slot event properties
* @abs: ABS_MT event properties
*/
@@ -86,7 +89,6 @@ struct mtdev_caps {
int has_mtdata;
int has_slot;
int has_abs[MT_ABS_SIZE];
- int nullid;
struct input_absinfo slot;
struct input_absinfo abs[MT_ABS_SIZE];
};
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)
cap->has_mtdata = has_mt_data(cap);
- if (cap->has_abs[MTDEV_TRACKING_ID])
- cap->nullid = cap->abs[MTDEV_TRACKING_ID].minimum - 1;
+ if (!cap->has_abs[MTDEV_TRACKING_ID]) {
+ cap->abs[MTDEV_TRACKING_ID].minimum = MT_ID_MIN;
+ cap->abs[MTDEV_TRACKING_ID].maximum = MT_ID_MAX;
+ }
default_fuzz(cap, MTDEV_POSITION_X, SN_COORD);
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,
/* update matched contacts and create new ones */
foreach_bit(i, touch) {
j = n2s[i];
- id = j >= 0 ? sid[j] : caps->nullid;
- while (id == caps->nullid)
- id = ++state->lastid;
+ id = j >= 0 ? sid[j] : MT_ID_NULL;
+ if (id == MT_ID_NULL)
+ id = state->lastid++ & MT_ID_MAX;
nid[i] = id;
}
}
@@ -125,7 +125,7 @@ static void assign_tracking_id(struct mtdev_state *state,
solve(state, caps, sid, sx, sy, sn, nid, nx, ny, size, touch);
for (i = 0; i < size; i++) {
data[i].abs[MTDEV_TRACKING_ID] =
- GETBIT(touch, i) ? nid[i] : caps->nullid;
+ GETBIT(touch, i) ? nid[i] : MT_ID_NULL;
prop[i] |= BITMASK(MTDEV_TRACKING_ID);
}
}
@@ -289,10 +289,10 @@ static void apply_typeA_changes(struct mtdev_state *state,
filter_data(state, caps, &data[i], prop[i], slot);
push_slot_changes(state, &data[i], prop[i], slot, syn);
SETBIT(used, slot);
- id = caps->nullid;
+ id = MT_ID_NULL;
break;
}
- if (id != caps->nullid) {
+ if (id != MT_ID_NULL) {
slot = firstbit(unused);
push_slot_changes(state, &data[i], prop[i], slot, syn);
SETBIT(used, slot);
@@ -304,7 +304,7 @@ static void apply_typeA_changes(struct mtdev_state *state,
foreach_bit(slot, state->used & ~used) {
struct mtdev_slot tdata = state->data[slot];
bitmask_t tprop = BITMASK(MTDEV_TRACKING_ID);
- tdata.abs[MTDEV_TRACKING_ID] = caps->nullid;
+ tdata.abs[MTDEV_TRACKING_ID] = MT_ID_NULL;
push_slot_changes(state, &tdata, tprop, slot, syn);
}
state->used = used;
@@ -337,10 +337,13 @@ static void convert_A_to_B(struct mtdev_state *state,
int mtdev_init(struct mtdev *dev)
{
+ int i;
memset(dev, 0, sizeof(struct mtdev));
dev->state = calloc(1, sizeof(struct mtdev_state));
if (!dev->state)
return -ENOMEM;
+ for (i = 0; i < DIM_FINGER; i++)
+ dev->state->data[i].abs[MTDEV_TRACKING_ID] = MT_ID_NULL;
return 0;
}