aboutsummaryrefslogtreecommitdiffstats
path: root/src
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 /src
parent80483b5c06839ab57cbad314ae1adb692bfb59da (diff)
downloadxorg-input-kobomultitouch-c2f2cebb45ddb17c1186f3ad3f31851fe61fd317.tar.gz
xorg-input-kobomultitouch-c2f2cebb45ddb17c1186f3ad3f31851fe61fd317.tar.bz2
xorg-input-kobomultitouch-c2f2cebb45ddb17c1186f3ad3f31851fe61fd317.zip
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')
-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 @@
#include <stdlib.h>
#include <limits.h>
+#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;