summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2010-04-17 21:42:52 +0200
committerHenrik Rydberg <rydberg@euromail.se>2010-04-18 01:01:53 +0200
commitc2f2cebb45ddb17c1186f3ad3f31851fe61fd317 (patch)
tree923a8c26f7d021f31a2197bbc511b67ec2f19e0e
parent80483b5c06839ab57cbad314ae1adb692bfb59da (diff)
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 <rydberg@euromail.se>
-rw-r--r--src/hwstate.c13
1 files changed, 11 insertions, 2 deletions
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 @@
23#include <stdlib.h> 23#include <stdlib.h>
24#include <limits.h> 24#include <limits.h>
25 25
26#define NOTOUCH(hw, c) ((hw)->touch_major == 0 && (c)->has_touch_major)
27
26const int XMAX = 32767; 28const int XMAX = 32767;
27 29
28void init_hwstate(struct HWState *s) 30void init_hwstate(struct HWState *s)
@@ -88,6 +90,8 @@ void modify_hwstate(struct HWState *s,
88 /* setup distance matrix for finger id matching */ 90 /* setup distance matrix for finger id matching */
89 for (j = 0; j < s->nfinger; j++) { 91 for (j = 0; j < s->nfinger; j++) {
90 sid[j] = s->finger[j].id; 92 sid[j] = s->finger[j].id;
93 if (NOTOUCH(&s->finger[j].hw, caps))
94 sid[j] = 0;
91 row = A + hw->nfinger * j; 95 row = A + hw->nfinger * j;
92 for (i = 0; i < hw->nfinger; i++) 96 for (i = 0; i < hw->nfinger; i++)
93 row[i] = dist2(&hw->finger[i], &s->finger[j].hw); 97 row[i] = dist2(&hw->finger[i], &s->finger[j].hw);
@@ -99,11 +103,16 @@ void modify_hwstate(struct HWState *s,
99 for (i = 0; i < hw->nfinger; i++) { 103 for (i = 0; i < hw->nfinger; i++) {
100 j = hw2s[i]; 104 j = hw2s[i];
101 id = j >= 0 ? sid[j] : 0; 105 id = j >= 0 ? sid[j] : 0;
102 while (!id) 106 if (!NOTOUCH(&hw->finger[i], caps))
103 id = ++s->lastid; 107 while (!id)
108 id = ++s->lastid;
104 set_finger(&s->finger[i], &hw->finger[i], id, caps); 109 set_finger(&s->finger[i], &hw->finger[i], id, caps);
105 } 110 }
106 111
112 /* clear remaining finger ids */
113 for (i = hw->nfinger; i < s->nfinger; i++)
114 s->finger[i].id = 0;
115
107 s->button = hw->button; 116 s->button = hw->button;
108 s->nfinger = hw->nfinger; 117 s->nfinger = hw->nfinger;
109 s->evtime = hw->evtime; 118 s->evtime = hw->evtime;