diff options
author | Henrik Rydberg <rydberg@euromail.se> | 2010-04-15 21:29:30 +0200 |
---|---|---|
committer | Henrik Rydberg <rydberg@euromail.se> | 2010-04-15 21:41:15 +0200 |
commit | 748c2cb48e6bd1c47ad125556b97871a7252b492 (patch) | |
tree | 44da4ed87f983f153fd8abd038504f40a21fa3bf | |
parent | 93d4a10726df4ae85931db80bc3a22e1929c3ef4 (diff) | |
download | xorg-input-kobomultitouch-748c2cb48e6bd1c47ad125556b97871a7252b492.tar.gz xorg-input-kobomultitouch-748c2cb48e6bd1c47ad125556b97871a7252b492.tar.bz2 xorg-input-kobomultitouch-748c2cb48e6bd1c47ad125556b97871a7252b492.zip |
Unify detection of finger configuration changes
This patch simplifies and unifies the means by which finger
configuration changes are detected. The logic is almost the same,
except for the unlikely case of very quickly switching the clicking
finger, after first having moved it above the clicking area. This case
should now properly be detected as a pointing finger.
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
-rw-r--r-- | src/gestures.c | 30 | ||||
-rw-r--r-- | src/gestures.h | 2 |
2 files changed, 18 insertions, 14 deletions
diff --git a/src/gestures.c b/src/gestures.c index 432f3af..28d0417 100644 --- a/src/gestures.c +++ b/src/gestures.c @@ -42,6 +42,15 @@ inline int dyval(const struct FingerState *a, const struct FingerState *b) return a->hw.position_y - b->hw.position_y; } +static void extract_finger_configuration(struct Gestures *gs, struct MTouch* mt) +{ + const struct FingerState *f = mt->state.finger; + int i, same = mt->state.nfinger == mt->prev_state.nfinger; + for (i = 0; i < mt->state.nfinger; i++) + same = same && find_finger(&mt->prev_state, f[i].id); + gs->same_fingers = same; +} + static void extract_pointers(struct Gestures *gs, struct MTouch* mt) { const struct FingerState *f = mt->state.finger; @@ -54,7 +63,7 @@ static void extract_pointers(struct Gestures *gs, struct MTouch* mt) return; } - if (mt->state.nfinger == mt->prev_state.nfinger) { + if (gs->same_fingers) { for (i = 0; i < mt->state.nfinger; i++) { if (GETBIT(mt->mem.pointing, i)) continue; @@ -83,9 +92,8 @@ static void extract_pointers(struct Gestures *gs, struct MTouch* mt) static void extract_movement(struct Gestures *gs, struct MTouch* mt) { - const struct FingerState *prev[DIM_FINGER]; - const struct FingerState *f = mt->state.finger; - int same_fingers, i, x = 0, y = 0; + const struct FingerState *prev, *f = mt->state.finger; + int i, x = 0, y = 0; int dx, dy, xcut, ycut, xmax = 0, ymax = 0; mt->mem.moving = 0; @@ -94,13 +102,7 @@ static void extract_movement(struct Gestures *gs, struct MTouch* mt) 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 (!same_fingers) { + if (!gs->same_fingers) { mt->mem.move_time = mt->state.evtime; if (mt->state.nfinger > mt->prev_state.nfinger) mt->mem.move_time += FINGER_ATTACK_MS; @@ -112,8 +114,9 @@ static void extract_movement(struct Gestures *gs, struct MTouch* mt) for (i = 0; i < mt->state.nfinger; i++) { if (!GETBIT(mt->mem.pointing, i)) continue; - dx = dxval(&f[i], prev[i]); - dy = dyval(&f[i], prev[i]); + prev = find_finger(&mt->prev_state, f[i].id); + dx = dxval(&f[i], prev); + dy = dyval(&f[i], prev); mt->mem.dx[i] += dx; mt->mem.dy[i] += dy; xmax = maxval(xmax, abs(mt->mem.dx[i])); @@ -186,6 +189,7 @@ static void extract_type(struct Gestures *gs, struct MTouch* mt) void extract_gestures(struct Gestures *gs, struct MTouch* mt) { memset(gs, 0, sizeof(struct Gestures)); + extract_finger_configuration(gs, mt); extract_pointers(gs, mt); extract_movement(gs, mt); extract_buttons(gs, mt); diff --git a/src/gestures.h b/src/gestures.h index e99bc3d..5630d4c 100644 --- a/src/gestures.h +++ b/src/gestures.h @@ -33,7 +33,7 @@ struct Gestures { unsigned type, btmask, btdata; - int dx, dy; + int same_fingers, dx, dy; }; void extract_gestures(struct Gestures *gs, struct MTouch* mt); |