From c2f2cebb45ddb17c1186f3ad3f31851fe61fd317 Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Sat, 17 Apr 2010 21:42:52 +0200 Subject: Do not reuse tracking ids after a no-touch event The fingers going away are important in the matching algorithm, to correctly detect new fingers when placed close to a finger in the process of leaving the surface. However, once a no-touch has been confirmed, the tracking id should not be reused, should a new finger appear close to the removal point. This patch clears the tracking id of all removed or no-touch state fingers, thereby reducing accidental jumps on touch to a minimum. Signed-off-by: Henrik Rydberg --- src/hwstate.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/hwstate.c b/src/hwstate.c index 1a68d28..d758d25 100644 --- a/src/hwstate.c +++ b/src/hwstate.c @@ -23,6 +23,8 @@ #include #include +#define NOTOUCH(hw, c) ((hw)->touch_major == 0 && (c)->has_touch_major) + const int XMAX = 32767; void init_hwstate(struct HWState *s) @@ -88,6 +90,8 @@ void modify_hwstate(struct HWState *s, /* setup distance matrix for finger id matching */ for (j = 0; j < s->nfinger; j++) { sid[j] = s->finger[j].id; + if (NOTOUCH(&s->finger[j].hw, caps)) + sid[j] = 0; row = A + hw->nfinger * j; for (i = 0; i < hw->nfinger; i++) row[i] = dist2(&hw->finger[i], &s->finger[j].hw); @@ -99,11 +103,16 @@ void modify_hwstate(struct HWState *s, for (i = 0; i < hw->nfinger; i++) { j = hw2s[i]; id = j >= 0 ? sid[j] : 0; - while (!id) - id = ++s->lastid; + if (!NOTOUCH(&hw->finger[i], caps)) + while (!id) + id = ++s->lastid; set_finger(&s->finger[i], &hw->finger[i], id, caps); } + /* clear remaining finger ids */ + for (i = hw->nfinger; i < s->nfinger; i++) + s->finger[i].id = 0; + s->button = hw->button; s->nfinger = hw->nfinger; s->evtime = hw->evtime; -- cgit v1.2.3