summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2010-04-10 23:16:29 +0200
committerHenrik Rydberg <rydberg@euromail.se>2010-04-15 06:10:07 +0200
commit32d5f821c5bbefc6eae2319209288ec74079529a (patch)
tree1d9fc4c95215fa0e4308994183a54604ee2bbf1b
parent3b76b024a602934495de42ddab6d32c37b2fbfa9 (diff)
Only extract movement from identical finger configurations
The current code would extract movement from a rapid change from one finger to the next, resulting in unwanted jumps. This patch first checks that the finger configuration is the same before attempting to extract movement. Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
-rw-r--r--src/gestures.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/src/gestures.c b/src/gestures.c
index f26aba8..c837d6c 100644
--- a/src/gestures.c
+++ b/src/gestures.c
@@ -23,24 +23,29 @@
23 23
24static void extract_movement(struct Gestures *gs, struct MTouch* mt) 24static void extract_movement(struct Gestures *gs, struct MTouch* mt)
25{ 25{
26 const struct FingerState *b = mt->state.finger; 26 const struct FingerState *prev[DIM_FINGER];
27 const struct FingerState *e = b + mt->state.nfinger; 27 const struct FingerState *f = mt->state.finger;
28 const struct FingerState *p, *fs; 28 int same_fingers, i;
29 int dn = 0, i; 29
30 if (mt->state.nfinger == mt->prev_state.nfinger) { 30 if (mt->state.nfinger == 0)
31 for (p = b; p != e; p++) { 31 return;
32 fs = find_finger(&mt->prev_state, p->id); 32
33 if (fs) { 33 same_fingers = mt->state.nfinger == mt->prev_state.nfinger;
34 gs->dx += p->hw.position_x - fs->hw.position_x; 34 for (i = 0; i < mt->state.nfinger; i++) {
35 gs->dy += p->hw.position_y - fs->hw.position_y; 35 prev[i] = find_finger(&mt->prev_state, mt->state.finger[i].id);
36 dn++; 36 same_fingers = same_fingers && prev[i];
37 }
38 }
39 } 37 }
40 if (dn) { 38
41 gs->dx /= dn; 39 if (!same_fingers)
42 gs->dy /= dn; 40 return;
41
42 for (i = 0; i < mt->state.nfinger; i++) {
43 gs->dx += f[i].hw.position_x - prev[i]->hw.position_x;
44 gs->dy += f[i].hw.position_y - prev[i]->hw.position_y;
43 } 45 }
46
47 gs->dx /= mt->state.nfinger;
48 gs->dy /= mt->state.nfinger;
44} 49}
45 50
46static void extract_buttons(struct Gestures *gs, struct MTouch* mt) 51static void extract_buttons(struct Gestures *gs, struct MTouch* mt)