summaryrefslogtreecommitdiff
path: root/src/gestures.c
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2010-05-14 01:09:42 +0200
committerHenrik Rydberg <rydberg@euromail.se>2010-05-14 01:41:39 +0200
commitf02210172efc6bfc05c4598c14e1268d2828097e (patch)
tree00457552d4fe048b17b4a73d58d17c9db63552f8 /src/gestures.c
parent1e37ed517ef0906767a230ab384b8e66869cf4b2 (diff)
Simplify bit bookkeeping
In preparation of adding several additional finger bit registers, remove the redundant bit-counting variables and introduce fast bit-traversal functions instead. Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Diffstat (limited to 'src/gestures.c')
-rw-r--r--src/gestures.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/src/gestures.c b/src/gestures.c
index 7346043..f44e6ab 100644
--- a/src/gestures.c
+++ b/src/gestures.c
@@ -58,7 +58,6 @@ static void extract_pointers(struct Gestures *gs, struct MTouch* mt)
58 58
59 if (mt->state.nfinger < 2) { 59 if (mt->state.nfinger < 2) {
60 mt->mem.pointing = mt->state.nfinger; 60 mt->mem.pointing = mt->state.nfinger;
61 mt->mem.npoint = mt->state.nfinger;
62 mt->mem.ybar = mt->caps.abs_position_y.maximum; 61 mt->mem.ybar = mt->caps.abs_position_y.maximum;
63 return; 62 return;
64 } 63 }
@@ -69,7 +68,6 @@ static void extract_pointers(struct Gestures *gs, struct MTouch* mt)
69 continue; 68 continue;
70 if (f[i].hw.position_y <= mt->mem.ybar) { 69 if (f[i].hw.position_y <= mt->mem.ybar) {
71 mt->mem.pointing = BITONES(mt->state.nfinger); 70 mt->mem.pointing = BITONES(mt->state.nfinger);
72 mt->mem.npoint = mt->state.nfinger;
73 return; 71 return;
74 } 72 }
75 } 73 }
@@ -77,15 +75,13 @@ static void extract_pointers(struct Gestures *gs, struct MTouch* mt)
77 } 75 }
78 76
79 mt->mem.pointing = 0; 77 mt->mem.pointing = 0;
80 mt->mem.npoint = 0;
81 mt->mem.ybar = mt->caps.yclick; 78 mt->mem.ybar = mt->caps.yclick;
82 for (i = 0; i < mt->state.nfinger; i++) { 79 for (i = 0; i < mt->state.nfinger; i++) {
83 if (f[i].hw.position_y > mt->caps.yclick) 80 if (f[i].hw.position_y > mt->caps.yclick)
84 continue; 81 continue;
85 if (!mt->mem.npoint || f[i].hw.position_y > mt->mem.ybar) 82 if (!mt->mem.pointing || f[i].hw.position_y > mt->mem.ybar)
86 mt->mem.ybar = f[i].hw.position_y; 83 mt->mem.ybar = f[i].hw.position_y;
87 SETBIT(mt->mem.pointing, i); 84 SETBIT(mt->mem.pointing, i);
88 mt->mem.npoint++;
89 } 85 }
90 86
91} 87}
@@ -97,7 +93,6 @@ static void extract_movement(struct Gestures *gs, struct MTouch* mt)
97 int dx, dy, xcut, ycut, xmax = 0, ymax = 0; 93 int dx, dy, xcut, ycut, xmax = 0, ymax = 0;
98 94
99 mt->mem.moving = 0; 95 mt->mem.moving = 0;
100 mt->mem.nmove = 0;
101 96
102 if (mt->state.nfinger == 0) 97 if (mt->state.nfinger == 0)
103 return; 98 return;
@@ -128,22 +123,21 @@ static void extract_movement(struct Gestures *gs, struct MTouch* mt)
128 if (!GETBIT(mt->mem.pointing, i)) 123 if (!GETBIT(mt->mem.pointing, i))
129 continue; 124 continue;
130 if (abs(mt->mem.dx[i]) > xcut || 125 if (abs(mt->mem.dx[i]) > xcut ||
131 abs(mt->mem.dy[i]) > ycut) { 126 abs(mt->mem.dy[i]) > ycut)
132 SETBIT(mt->mem.moving, i); 127 SETBIT(mt->mem.moving, i);
133 mt->mem.nmove++;
134 }
135 } 128 }
136 129
137 /* accumulate all movement during delay */ 130 /* accumulate all movement during delay */
138 if (mt->mem.nmove && mt->state.evtime >= mt->mem.move_time) { 131 if (mt->mem.moving && mt->state.evtime >= mt->mem.move_time) {
132 int nmove = bitcount(mt->mem.moving);
139 for (i = 0; i < mt->state.nfinger; i++) { 133 for (i = 0; i < mt->state.nfinger; i++) {
140 if (GETBIT(mt->mem.moving, i)) { 134 if (GETBIT(mt->mem.moving, i)) {
141 gs->dx += mt->mem.dx[i]; 135 gs->dx += mt->mem.dx[i];
142 gs->dy += mt->mem.dy[i]; 136 gs->dy += mt->mem.dy[i];
143 } 137 }
144 } 138 }
145 gs->dx /= mt->mem.nmove; 139 gs->dx /= nmove;
146 gs->dy /= mt->mem.nmove; 140 gs->dy /= nmove;
147 memset(mt->mem.dx, 0, sizeof(mt->mem.dx)); 141 memset(mt->mem.dx, 0, sizeof(mt->mem.dx));
148 memset(mt->mem.dy, 0, sizeof(mt->mem.dy)); 142 memset(mt->mem.dy, 0, sizeof(mt->mem.dy));
149 } 143 }
@@ -153,10 +147,11 @@ static void extract_movement(struct Gestures *gs, struct MTouch* mt)
153static void extract_buttons(struct Gestures *gs, struct MTouch* mt) 147static void extract_buttons(struct Gestures *gs, struct MTouch* mt)
154{ 148{
155 unsigned btdata = mt->state.button & BITONES(DIM_BUTTON); 149 unsigned btdata = mt->state.button & BITONES(DIM_BUTTON);
150 int npoint = bitcount(mt->mem.pointing);
156 if (mt->state.button == BITMASK(MT_BUTTON_LEFT)) { 151 if (mt->state.button == BITMASK(MT_BUTTON_LEFT)) {
157 if (mt->mem.npoint == 2) 152 if (npoint == 2)
158 btdata = BITMASK(MT_BUTTON_RIGHT); 153 btdata = BITMASK(MT_BUTTON_RIGHT);
159 if (mt->mem.npoint == 3) 154 if (npoint == 3)
160 btdata = BITMASK(MT_BUTTON_MIDDLE); 155 btdata = BITMASK(MT_BUTTON_MIDDLE);
161 } 156 }
162 if (mt->state.button != mt->prev_state.button) { 157 if (mt->state.button != mt->prev_state.button) {
@@ -170,18 +165,19 @@ static void extract_buttons(struct Gestures *gs, struct MTouch* mt)
170 165
171static void extract_type(struct Gestures *gs, struct MTouch* mt) 166static void extract_type(struct Gestures *gs, struct MTouch* mt)
172{ 167{
168 int npoint = bitcount(mt->mem.pointing);
173 if (gs->btmask) 169 if (gs->btmask)
174 SETBIT(gs->type, GS_BUTTON); 170 SETBIT(gs->type, GS_BUTTON);
175 if (gs->dx || gs->dy) { 171 if (gs->dx || gs->dy) {
176 if (mt->mem.npoint == 1) 172 if (npoint == 1)
177 SETBIT(gs->type, GS_MOVE); 173 SETBIT(gs->type, GS_MOVE);
178 if (mt->mem.npoint == 2) { 174 if (npoint == 2) {
179 if (gs->dx) 175 if (gs->dx)
180 SETBIT(gs->type, GS_HSCROLL); 176 SETBIT(gs->type, GS_HSCROLL);
181 if (gs->dy) 177 if (gs->dy)
182 SETBIT(gs->type, GS_VSCROLL); 178 SETBIT(gs->type, GS_VSCROLL);
183 } 179 }
184 if (mt->mem.npoint == 3) { 180 if (npoint == 3) {
185 if (gs->dx) 181 if (gs->dx)
186 SETBIT(gs->type, GS_HSWIPE); 182 SETBIT(gs->type, GS_HSWIPE);
187 if (gs->dy) 183 if (gs->dy)