summaryrefslogtreecommitdiff
path: root/src/memory.c
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2010-05-14 01:29:38 +0200
committerHenrik Rydberg <rydberg@euromail.se>2010-05-14 01:41:39 +0200
commitc8c74659d27b9eb0d45342db9a4969389e20f26a (patch)
treececd1876745b2288cb45007522a046f12d144f31 /src/memory.c
parentbfd266660d69e13263e3895fb059040b65255a72 (diff)
Refactor parsor memory usage
Add the bitmasks "fingers" and "added" to parsor memory, and extend time handling to use a hold time and a forget time. Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Diffstat (limited to 'src/memory.c')
-rw-r--r--src/memory.c99
1 files changed, 52 insertions, 47 deletions
diff --git a/src/memory.c b/src/memory.c
index a09eadb..7d8cda8 100644
--- a/src/memory.c
+++ b/src/memory.c
@@ -22,11 +22,12 @@
22#include "memory.h" 22#include "memory.h"
23 23
24/* fraction of max movement threshold */ 24/* fraction of max movement threshold */
25#define DELTA_CUT(x) (0.2 * (x)) 25#define DELTA_CUT(x) (0.5 * (x))
26 26
27/* timer for cursor stability on finger touch/release */ 27/* timer for cursor stability on finger touch/release */
28static const int FINGER_ATTACK_MS = 70; 28static const int FINGER_ATTACK_MS = 40;
29static const int FINGER_DECAY_MS = 120; 29static const int FINGER_DECAY_MS = 120;
30static const int FINGER_CORNER_MS = 150;
30 31
31static inline int dxval(const struct MTFinger *a, const struct MTFinger *b) 32static inline int dxval(const struct MTFinger *a, const struct MTFinger *b)
32{ 33{
@@ -57,10 +58,14 @@ static void update_configuration(struct Memory *m,
57 const struct MTState *state) 58 const struct MTState *state)
58{ 59{
59 const struct MTFinger *f = state->finger; 60 const struct MTFinger *f = state->finger;
61 unsigned fingers = BITONES(state->nfinger);
60 int i; 62 int i;
61 m->same = state->nfinger == prev_state->nfinger; 63 m->added = 0;
62 for (i = 0; i < state->nfinger; i++) 64 foreach_bit(i, fingers)
63 m->same = m->same && find_finger(prev_state, f[i].id); 65 if (!find_finger(prev_state, f[i].id))
66 SETBIT(m->added, i);
67 m->same = m->fingers == fingers && m->added == 0;
68 m->fingers = fingers;
64} 69}
65 70
66/** 71/**
@@ -81,17 +86,15 @@ static void update_pointers(struct Memory *m,
81 int i; 86 int i;
82 87
83 if (state->nfinger < 2) { 88 if (state->nfinger < 2) {
84 m->pointing = state->nfinger; 89 m->pointing = m->fingers;
85 m->ybar = caps->abs_position_y.maximum; 90 m->ybar = caps->abs_position_y.maximum;
86 return; 91 return;
87 } 92 }
88 93
89 if (m->same) { 94 if (m->same) {
90 for (i = 0; i < state->nfinger; i++) { 95 foreach_bit(i, m->fingers & ~m->pointing) {
91 if (GETBIT(m->pointing, i))
92 continue;
93 if (f[i].hw.position_y <= m->ybar) { 96 if (f[i].hw.position_y <= m->ybar) {
94 m->pointing = BITONES(state->nfinger); 97 m->pointing = m->fingers;
95 return; 98 return;
96 } 99 }
97 } 100 }
@@ -100,7 +103,7 @@ static void update_pointers(struct Memory *m,
100 103
101 m->pointing = 0; 104 m->pointing = 0;
102 m->ybar = caps->yclick; 105 m->ybar = caps->yclick;
103 for (i = 0; i < state->nfinger; i++) { 106 foreach_bit(i, m->fingers) {
104 if (f[i].hw.position_y > caps->yclick) 107 if (f[i].hw.position_y > caps->yclick)
105 continue; 108 continue;
106 if (!m->pointing || f[i].hw.position_y > m->ybar) 109 if (!m->pointing || f[i].hw.position_y > m->ybar)
@@ -129,49 +132,50 @@ static void update_movement(struct Memory *m,
129 const struct Capabilities *caps) 132 const struct Capabilities *caps)
130{ 133{
131 const struct MTFinger *prev, *f = state->finger; 134 const struct MTFinger *prev, *f = state->finger;
132 int i, x = 0, y = 0; 135 int i, xcut, ycut, xmax = 0, ymax = 0;
133 int dx, dy, xcut, ycut, xmax = 0, ymax = 0;
134 136
135 m->pending = 0;
136 m->moving = 0; 137 m->moving = 0;
137 138 m->pending = 0;
138 if (state->nfinger == 0)
139 return;
140 139
141 if (!m->same) { 140 if (!m->same) {
142 m->move_time = state->evtime; 141 mstime_t d2, d2max = center_maxdist2(caps);
143 if (state->nfinger > prev_state->nfinger) 142 mem_hold_movement(m, state->evtime + FINGER_ATTACK_MS);
144 m->move_time += FINGER_ATTACK_MS; 143 if (!m->added)
145 else 144 mem_hold_movement(m, state->evtime + FINGER_DECAY_MS);
146 m->move_time += FINGER_DECAY_MS; 145 foreach_bit(i, m->added) {
146 d2 = center_dist2(&f[i], caps);
147 d2 *= FINGER_CORNER_MS - FINGER_ATTACK_MS;
148 d2 /= d2max;
149 m->mvhold += d2;
150 }
147 memset(m->dx, 0, sizeof(m->dx)); 151 memset(m->dx, 0, sizeof(m->dx));
148 memset(m->dy, 0, sizeof(m->dy)); 152 memset(m->dy, 0, sizeof(m->dy));
149 } else { 153 return;
150 for (i = 0; i < state->nfinger; i++) { 154 }
151 if (!GETBIT(m->pointing, i)) 155
152 continue; 156 if (state->evtime < m->mvforget)
153 prev = find_finger(prev_state, f[i].id); 157 return;
154 dx = dxval(&f[i], prev);
155 dy = dyval(&f[i], prev);
156 m->dx[i] += dx;
157 m->dy[i] += dy;
158 xmax = maxval(xmax, abs(m->dx[i]));
159 ymax = maxval(ymax, abs(m->dy[i]));
160 }
161 xcut = DELTA_CUT(xmax);
162 ycut = DELTA_CUT(ymax);
163 for (i = 0; i < state->nfinger; i++) {
164 if (!GETBIT(m->pointing, i))
165 continue;
166 if (abs(m->dx[i]) > xcut ||
167 abs(m->dy[i]) > ycut)
168 SETBIT(m->pending, i);
169 }
170 158
171 /* accumulate all movement during delay */ 159 foreach_bit(i, m->pointing) {
172 if (m->pending && state->evtime >= m->move_time) 160 int dx, dy;
173 m->moving = m->pending; 161 prev = find_finger(prev_state, f[i].id);
162 dx = dxval(&f[i], prev);
163 dy = dyval(&f[i], prev);
164 m->dx[i] += dx;
165 m->dy[i] += dy;
166 xmax = maxval(xmax, abs(m->dx[i]));
167 ymax = maxval(ymax, abs(m->dy[i]));
174 } 168 }
169 xcut = DELTA_CUT(xmax);
170 ycut = DELTA_CUT(ymax);
171 foreach_bit(i, m->pointing)
172 if (abs(m->dx[i]) > xcut || abs(m->dy[i]) > ycut)
173 SETBIT(m->pending, i);
174
175 if (state->evtime < m->mvhold)
176 return;
177
178 m->moving = m->pending;
175} 179}
176 180
177void refresh_memory(struct Memory *m, 181void refresh_memory(struct Memory *m,
@@ -188,9 +192,10 @@ void output_memory(const struct Memory *m)
188{ 192{
189 int i; 193 int i;
190 xf86Msg(X_INFO, "btdata: %04x\n", m->btdata); 194 xf86Msg(X_INFO, "btdata: %04x\n", m->btdata);
195 xf86Msg(X_INFO, "fingers: %04x\n", m->fingers);
196 xf86Msg(X_INFO, "added: %04x\n", m->added);
191 xf86Msg(X_INFO, "pointing: %04x\n", m->pointing); 197 xf86Msg(X_INFO, "pointing: %04x\n", m->pointing);
192 xf86Msg(X_INFO, "pending: %04x\n", m->pending); 198 xf86Msg(X_INFO, "pending: %04x\n", m->pending);
193 xf86Msg(X_INFO, "moving: %04x\n", m->moving); 199 xf86Msg(X_INFO, "moving: %04x\n", m->moving);
194 xf86Msg(X_INFO, "ybar: %d\n", m->ybar); 200 xf86Msg(X_INFO, "ybar: %d\n", m->ybar);
195 xf86Msg(X_INFO, "move_time: %lld\n", m->move_time);
196} 201}