From 5d7ec311cdef842e60756d9189d09e3814e4ad1d Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Fri, 25 Mar 2011 19:10:19 +0100 Subject: Decouple timeout from discard Move the actual gesture discard from the recognition phase to the instantiation phase. Signed-off-by: Henrik Rydberg --- src/gestures-drag.c | 8 ++------ src/gestures-pinch.c | 8 ++------ src/gestures-rotate.c | 8 ++------ src/grail-inserter.c | 15 +++++++++++++++ src/grail-inserter.h | 2 ++ 5 files changed, 23 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/gestures-drag.c b/src/gestures-drag.c index 9f2bcaf..962aa6d 100644 --- a/src/gestures-drag.c +++ b/src/gestures-drag.c @@ -74,10 +74,8 @@ int gru_drag(struct grail *ge, } if ((move->timeout & fm_mask) == fm_mask) { if (state->active) { - gin_gid_discard(ge, state->gid); - state->active = 0; + gin_gid_timeout(ge, state->gid); } - return 0; } if (!state->active) { int type = getype[move->ntouch]; @@ -111,10 +109,8 @@ int gru_windrag(struct grail *ge, } if ((move->timeout & fm_mask) == fm_mask) { if (state->active) { - gin_gid_discard(ge, state->gid); - state->active = 0; + gin_gid_timeout(ge, state->gid); } - return 0; } if (!state->active) { if (move->ntouch == 4) { diff --git a/src/gestures-pinch.c b/src/gestures-pinch.c index 18772a0..bc5db1f 100644 --- a/src/gestures-pinch.c +++ b/src/gestures-pinch.c @@ -64,10 +64,8 @@ int gru_pinch(struct grail *ge, } if ((move->timeout & fm_mask) == fm_mask) { if (state->active) { - gin_gid_discard(ge, state->gid); - state->active = 0; + gin_gid_timeout(ge, state->gid); } - return 0; } if (!(move->tickle & mask)) return 0; @@ -102,10 +100,8 @@ int gru_winpinch(struct grail *ge, } if ((move->timeout & fm_mask) == fm_mask) { if (state->active) { - gin_gid_discard(ge, state->gid); - state->active = 0; + gin_gid_timeout(ge, state->gid); } - return 0; } if (!(move->tickle & mask)) return 0; diff --git a/src/gestures-rotate.c b/src/gestures-rotate.c index 03e8f3c..0fff8a4 100644 --- a/src/gestures-rotate.c +++ b/src/gestures-rotate.c @@ -63,10 +63,8 @@ int gru_rotate(struct grail *ge, } if ((move->timeout & fm_mask) == fm_mask) { if (state->active) { - gin_gid_discard(ge, state->gid); - state->active = 0; + gin_gid_timeout(ge, state->gid); } - return 0; } if (!(move->tickle & mask)) return 0; @@ -101,10 +99,8 @@ int gru_winrotate(struct grail *ge, } if ((move->timeout & fm_mask) == fm_mask) { if (state->active) { - gin_gid_discard(ge, state->gid); - state->active = 0; + gin_gid_timeout(ge, state->gid); } - return 0; } if (!(move->tickle & mask)) return 0; diff --git a/src/grail-inserter.c b/src/grail-inserter.c index 1ee8e5a..5225cb8 100644 --- a/src/grail-inserter.c +++ b/src/grail-inserter.c @@ -141,6 +141,13 @@ void gin_frame_end(struct grail *ge, const struct utouch_frame *frame) gin_gid_discard(ge, s->id); } + grail_mask_foreach(i, gin->used, sizeof(gin->used)) { + struct slot_state *s = &gin->state[i]; + if (!s->timeout) + continue; + gin_gid_discard(ge, s->id); + } + grail_mask_foreach(i, gin->used, sizeof(gin->used)) { struct slot_state *s = &gin->state[i]; struct gesture_event ev; @@ -178,6 +185,7 @@ int gin_gid_begin(struct grail *ge, int type, int priority, s->priority = priority; s->slice = 0; } + s->timeout = 0; s->id = gin->gestureid++ & MAX_GESTURE_ID; s->status = GRAIL_STATUS_BEGIN; s->nclient = 0; @@ -204,6 +212,13 @@ void gin_gid_discard(struct grail *ge, int gid) grail_mask_set(gin->unused, i); } +void gin_gid_timeout(struct grail *ge, int gid) +{ + int i = find_gslot(ge->gin, gid); + if (i >= 0) + ge->gin->state[i].timeout = 1; +} + void gin_gid_event(struct grail *ge, int gid, float x, float y, int ntouch, const grail_prop_t *prop, int nprop, diff --git a/src/grail-inserter.h b/src/grail-inserter.h index 12d0dc9..d1faa0a 100644 --- a/src/grail-inserter.h +++ b/src/grail-inserter.h @@ -38,6 +38,7 @@ struct slot_state { int type; int priority; int slice; + int timeout; int id; int status; int nclient; @@ -91,6 +92,7 @@ void gin_frame_end(struct grail *ge, const struct utouch_frame *frame); int gin_gid_begin(struct grail *ge, int type, int priority, const struct utouch_frame *frame); void gin_gid_discard(struct grail *ge, int gid); +void gin_gid_timeout(struct grail *ge, int gid); void gin_gid_event(struct grail *ge, int gid, float x, float y, int ntouch, -- cgit v1.2.3