summaryrefslogtreecommitdiff
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
parent93d4a10726df4ae85931db80bc3a22e1929c3ef4 (diff)
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.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)
42 return a->hw.position_y - b->hw.position_y; 42 return a->hw.position_y - b->hw.position_y;
43} 43}
44 44
45static void extract_finger_configuration(struct Gestures *gs, struct MTouch* mt)
46{
47 const struct FingerState *f = mt->state.finger;
48 int i, same = mt->state.nfinger == mt->prev_state.nfinger;
49 for (i = 0; i < mt->state.nfinger; i++)
50 same = same && find_finger(&mt->prev_state, f[i].id);
51 gs->same_fingers = same;
52}
53
45static void extract_pointers(struct Gestures *gs, struct MTouch* mt) 54static void extract_pointers(struct Gestures *gs, struct MTouch* mt)
46{ 55{
47 const struct FingerState *f = mt->state.finger; 56 const struct FingerState *f = mt->state.finger;
@@ -54,7 +63,7 @@ static void extract_pointers(struct Gestures *gs, struct MTouch* mt)
54 return; 63 return;
55 } 64 }
56 65
57 if (mt->state.nfinger == mt->prev_state.nfinger) { 66 if (gs->same_fingers) {
58 for (i = 0; i < mt->state.nfinger; i++) { 67 for (i = 0; i < mt->state.nfinger; i++) {
59 if (GETBIT(mt->mem.pointing, i)) 68 if (GETBIT(mt->mem.pointing, i))
60 continue; 69 continue;
@@ -83,9 +92,8 @@ static void extract_pointers(struct Gestures *gs, struct MTouch* mt)
83 92
84static void extract_movement(struct Gestures *gs, struct MTouch* mt) 93static void extract_movement(struct Gestures *gs, struct MTouch* mt)
85{ 94{
86 const struct FingerState *prev[DIM_FINGER]; 95 const struct FingerState *prev, *f = mt->state.finger;
87 const struct FingerState *f = mt->state.finger; 96 int i, x = 0, y = 0;
88 int same_fingers, i, x = 0, y = 0;
89 int dx, dy, xcut, ycut, xmax = 0, ymax = 0; 97 int dx, dy, xcut, ycut, xmax = 0, ymax = 0;
90 98
91 mt->mem.moving = 0; 99 mt->mem.moving = 0;
@@ -94,13 +102,7 @@ static void extract_movement(struct Gestures *gs, struct MTouch* mt)
94 if (mt->state.nfinger == 0) 102 if (mt->state.nfinger == 0)
95 return; 103 return;
96 104
97 same_fingers = mt->state.nfinger == mt->prev_state.nfinger; 105 if (!gs->same_fingers) {
98 for (i = 0; i < mt->state.nfinger; i++) {
99 prev[i] = find_finger(&mt->prev_state, mt->state.finger[i].id);
100 same_fingers = same_fingers && prev[i];
101 }
102
103 if (!same_fingers) {
104 mt->mem.move_time = mt->state.evtime; 106 mt->mem.move_time = mt->state.evtime;
105 if (mt->state.nfinger > mt->prev_state.nfinger) 107 if (mt->state.nfinger > mt->prev_state.nfinger)
106 mt->mem.move_time += FINGER_ATTACK_MS; 108 mt->mem.move_time += FINGER_ATTACK_MS;
@@ -112,8 +114,9 @@ static void extract_movement(struct Gestures *gs, struct MTouch* mt)
112 for (i = 0; i < mt->state.nfinger; i++) { 114 for (i = 0; i < mt->state.nfinger; i++) {
113 if (!GETBIT(mt->mem.pointing, i)) 115 if (!GETBIT(mt->mem.pointing, i))
114 continue; 116 continue;
115 dx = dxval(&f[i], prev[i]); 117 prev = find_finger(&mt->prev_state, f[i].id);
116 dy = dyval(&f[i], prev[i]); 118 dx = dxval(&f[i], prev);
119 dy = dyval(&f[i], prev);
117 mt->mem.dx[i] += dx; 120 mt->mem.dx[i] += dx;
118 mt->mem.dy[i] += dy; 121 mt->mem.dy[i] += dy;
119 xmax = maxval(xmax, abs(mt->mem.dx[i])); 122 xmax = maxval(xmax, abs(mt->mem.dx[i]));
@@ -186,6 +189,7 @@ static void extract_type(struct Gestures *gs, struct MTouch* mt)
186void extract_gestures(struct Gestures *gs, struct MTouch* mt) 189void extract_gestures(struct Gestures *gs, struct MTouch* mt)
187{ 190{
188 memset(gs, 0, sizeof(struct Gestures)); 191 memset(gs, 0, sizeof(struct Gestures));
192 extract_finger_configuration(gs, mt);
189 extract_pointers(gs, mt); 193 extract_pointers(gs, mt);
190 extract_movement(gs, mt); 194 extract_movement(gs, mt);
191 extract_buttons(gs, mt); 195 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 @@
33 33
34struct Gestures { 34struct Gestures {
35 unsigned type, btmask, btdata; 35 unsigned type, btmask, btdata;
36 int dx, dy; 36 int same_fingers, dx, dy;
37}; 37};
38 38
39void extract_gestures(struct Gestures *gs, struct MTouch* mt); 39void extract_gestures(struct Gestures *gs, struct MTouch* mt);