aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2010-04-15 21:29:30 +0200
committerHenrik Rydberg <rydberg@euromail.se>2010-04-15 21:41:15 +0200
commit748c2cb48e6bd1c47ad125556b97871a7252b492 (patch)
tree44da4ed87f983f153fd8abd038504f40a21fa3bf /src
parent93d4a10726df4ae85931db80bc3a22e1929c3ef4 (diff)
downloadxorg-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>
Diffstat (limited to 'src')
-rw-r--r--src/gestures.c30
-rw-r--r--src/gestures.h2
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);