diff options
-rw-r--r-- | src/gestures.c | 69 | ||||
-rw-r--r-- | src/memory.h | 7 |
2 files changed, 57 insertions, 19 deletions
diff --git a/src/gestures.c b/src/gestures.c index 915a521..3502255 100644 --- a/src/gestures.c +++ b/src/gestures.c @@ -25,10 +25,23 @@ #include "gestures.h" +#define DELTA_CUT(x) (0.2 * (x)) + /* timer for cursor stability on finger touch/release */ static const int FINGER_ATTACK_MS = 70; static const int FINGER_DECAY_MS = 120; +static inline int maxval(int x, int y) { return x > y ? x : y; } + +inline int dxval(const struct FingerState *a, const struct FingerState *b) +{ + return a->hw.position_x - b->hw.position_x; +} +inline int dyval(const struct FingerState *a, const struct FingerState *b) +{ + return a->hw.position_y - b->hw.position_y; +} + static void extract_pointers(struct Gestures *gs, struct MTouch* mt) { const struct FingerState *f = mt->state.finger; @@ -73,6 +86,10 @@ 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; + int dx, dy, xcut, ycut, xmax = 0, ymax = 0; + + mt->mem.moving = 0; + mt->mem.nmove = 0; if (mt->state.nfinger == 0) return; @@ -83,29 +100,47 @@ static void extract_movement(struct Gestures *gs, struct MTouch* mt) same_fingers = same_fingers && prev[i]; } - for (i = 0; i < mt->state.nfinger; i++) { - x += f[i].hw.position_x; - y += f[i].hw.position_y; - } - x /= mt->state.nfinger; - y /= mt->state.nfinger; - if (!same_fingers) { mt->mem.move_time = mt->state.evtime; if (mt->state.nfinger > mt->prev_state.nfinger) mt->mem.move_time += FINGER_ATTACK_MS; else mt->mem.move_time += FINGER_DECAY_MS; - } else if (mt->state.evtime >= mt->mem.move_time) { - gs->dx = x - mt->mem.move_x; - gs->dy = y - mt->mem.move_y; } else { + 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]); + mt->mem.dx[i] += dx; + mt->mem.dy[i] += dy; + xmax = maxval(xmax, abs(mt->mem.dx[i])); + ymax = maxval(ymax, abs(mt->mem.dy[i])); + } + xcut = DELTA_CUT(xmax); + ycut = DELTA_CUT(ymax); + for (i = 0; i < mt->state.nfinger; i++) { + if (abs(mt->mem.dx[i]) > xcut || + abs(mt->mem.dy[i]) > ycut) { + SETBIT(mt->mem.moving, i); + mt->mem.nmove++; + } + } + /* accumulate all movement during delay */ - return; + if (mt->mem.nmove && mt->state.evtime >= mt->mem.move_time) { + for (i = 0; i < mt->state.nfinger; i++) { + if (GETBIT(mt->mem.moving, i)) { + gs->dx += mt->mem.dx[i]; + gs->dy += mt->mem.dy[i]; + } + } + gs->dx /= mt->mem.nmove; + gs->dy /= mt->mem.nmove; + memset(mt->mem.dx, 0, sizeof(mt->mem.dx)); + memset(mt->mem.dy, 0, sizeof(mt->mem.dy)); + } } - - mt->mem.move_x = x; - mt->mem.move_y = y; } static void extract_buttons(struct Gestures *gs, struct MTouch* mt) @@ -127,15 +162,15 @@ static void extract_buttons(struct Gestures *gs, struct MTouch* mt) static void extract_type(struct Gestures *gs, struct MTouch* mt) { if (gs->dx || gs->dy) { - if (mt->state.nfinger == 1) + if (mt->mem.npoint == 1) SETBIT(gs->type, GS_MOVE); - if (mt->state.nfinger == 2) { + if (mt->mem.npoint == 2) { if (gs->dx) SETBIT(gs->type, GS_HSCROLL); if (gs->dy) SETBIT(gs->type, GS_VSCROLL); } - if (mt->state.nfinger == 3) { + if (mt->mem.npoint == 3) { if (gs->dx) SETBIT(gs->type, GS_HSWIPE); if (gs->dy) diff --git a/src/memory.h b/src/memory.h index 3b947b9..5e8a31c 100644 --- a/src/memory.h +++ b/src/memory.h @@ -25,10 +25,13 @@ #include "mtstate.h" struct Memory { - unsigned btdata, pointing; + unsigned btdata, pointing, moving; int npoint, ybar; mstime_t move_time; - int move_x, move_y; + int dx[DIM_FINGER], dy[DIM_FINGER], nmove; + + + }; void init_memory(struct Memory *mem); |