From 32d5f821c5bbefc6eae2319209288ec74079529a Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Sat, 10 Apr 2010 23:16:29 +0200 Subject: 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 --- src/gestures.c | 37 +++++++++++++++++++++---------------- 1 file 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 @@ static void extract_movement(struct Gestures *gs, struct MTouch* mt) { - const struct FingerState *b = mt->state.finger; - const struct FingerState *e = b + mt->state.nfinger; - const struct FingerState *p, *fs; - int dn = 0, i; - if (mt->state.nfinger == mt->prev_state.nfinger) { - for (p = b; p != e; p++) { - fs = find_finger(&mt->prev_state, p->id); - if (fs) { - gs->dx += p->hw.position_x - fs->hw.position_x; - gs->dy += p->hw.position_y - fs->hw.position_y; - dn++; - } - } + const struct FingerState *prev[DIM_FINGER]; + const struct FingerState *f = mt->state.finger; + int same_fingers, i; + + if (mt->state.nfinger == 0) + return; + + same_fingers = mt->state.nfinger == mt->prev_state.nfinger; + for (i = 0; i < mt->state.nfinger; i++) { + prev[i] = find_finger(&mt->prev_state, mt->state.finger[i].id); + same_fingers = same_fingers && prev[i]; } - if (dn) { - gs->dx /= dn; - gs->dy /= dn; + + if (!same_fingers) + return; + + for (i = 0; i < mt->state.nfinger; i++) { + gs->dx += f[i].hw.position_x - prev[i]->hw.position_x; + gs->dy += f[i].hw.position_y - prev[i]->hw.position_y; } + + gs->dx /= mt->state.nfinger; + gs->dy /= mt->state.nfinger; } static void extract_buttons(struct Gestures *gs, struct MTouch* mt) -- cgit v1.2.3