diff options
| author | Henrik Rydberg <rydberg@euromail.se> | 2010-04-17 21:42:52 +0200 |
|---|---|---|
| committer | Henrik Rydberg <rydberg@euromail.se> | 2010-04-18 01:01:53 +0200 |
| commit | c2f2cebb45ddb17c1186f3ad3f31851fe61fd317 (patch) | |
| tree | 923a8c26f7d021f31a2197bbc511b67ec2f19e0e /src/hwstate.c | |
| parent | 80483b5c06839ab57cbad314ae1adb692bfb59da (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>
Diffstat (limited to 'src/hwstate.c')
| -rw-r--r-- | src/hwstate.c | 13 |
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 | |||
| 26 | const int XMAX = 32767; | 28 | const int XMAX = 32767; |
| 27 | 29 | ||
| 28 | void init_hwstate(struct HWState *s) | 30 | void 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; |
