From d07c43f9f19dc0ee38aaf44947cfc396f437490e Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Tue, 3 Aug 2010 15:01:50 +0200 Subject: Introduce zoom, rotate and combo gestures Introduce grail_mask bit functions, and add new gestures as separate functions, referring to the same move model. Signed-off-by: Henrik Rydberg --- src/grail-recognizer.c | 76 +++++++++++++++++++------------------------------- 1 file changed, 28 insertions(+), 48 deletions(-) (limited to 'src/grail-recognizer.c') diff --git a/src/grail-recognizer.c b/src/grail-recognizer.c index 9ede059..1e7a8bf 100644 --- a/src/grail-recognizer.c +++ b/src/grail-recognizer.c @@ -22,24 +22,21 @@ * ****************************************************************************/ -#include "grail-inserter.h" +#include "grail-recognizer.h" #include #include #include -struct gesture_recognizer { - struct touch_frame frame; - touch_time_t scroll_time; - int scroll_active; - int scroll_gslot; - int scroll_slots[2]; -}; +static const touch_time_t DROP_TIMEOUT_MS = 100; -int gru_init(struct grail *ge) +int gru_init(struct grail *ge, const struct touch_dev_caps *caps) { - ge->gru = calloc(1, sizeof(struct gesture_recognizer)); - if (!ge->gru) + struct gesture_recognizer *gru; + gru = calloc(1, sizeof(struct gesture_recognizer)); + if (!gru) return -ENOMEM; + ge->gru = gru; + gru_init_motion(ge, caps); return 0; } @@ -49,49 +46,32 @@ void gru_destroy(struct grail *ge) ge->gru = NULL; } +static void reset_gru_state(struct grail *ge, const struct touch_frame *frame) +{ + gru_reset_combo(ge, frame); + gru_reset_rotate(ge, frame); + gru_reset_zoom(ge, frame); + gru_reset_scroll(ge, frame); + gru_reset_motion(ge, frame); +} + void gru_recognize(struct grail *ge, const struct touch_frame *frame) { - struct gesture_inserter *gin = ge->gin; struct gesture_recognizer *gru = ge->gru; - grail_prop_t prop[DIM_GRAIL_PROP]; - grail_mask_t span[16]; - int slot, nslot, x, y, dx, dy; - if (!gru) - return; - if (frame->ncreate || frame->ndestroy) { - gin_gesture_end_all(gin); - gru->scroll_active = 0; + struct move_model *move = &gru->move; + if (!ge->gin || !ge->gru) return; - } - if (frame->ntouch != 2) + if (frame->nactive < move->ntouch && + frame->time < gru->frame.time + DROP_TIMEOUT_MS) return; - memset(span, 0, sizeof(span)); - nslot = 0; - x = y = dx = dy = 0; - for (slot = frame->slot; slot >= 0; slot = next_slot(frame, slot)) { - struct touch *ot = &gru->frame.touch[slot]; - const struct touch *t = &frame->touch[slot]; - gru->scroll_slots[nslot] = slot; - grail_set_mask(span, slot); - x += t->prop[TP_POS_X]; - y += t->prop[TP_POS_Y]; - dx += t->prop[TP_POS_X] - ot->prop[TP_POS_X]; - dy += t->prop[TP_POS_Y] - ot->prop[TP_POS_Y]; - nslot++; - } - x /= nslot; - y /= nslot; - dx /= nslot; - dy /= nslot; - if (!dy) + if (frame->nactive < 2 || frame->ncreate || frame->ndestroy) { + reset_gru_state(ge, frame); return; - if (!gru->scroll_active) { - gru->scroll_gslot = gin_gesture_begin(ge, frame, - GRAIL_TYPE_VSCROLL, - x, y, span); - gru->scroll_active = 1; } - prop[0] = dy; - gin_gesture_event(gin, gru->scroll_gslot, prop); + gru_compute_motion(ge, frame); + gru_scroll(ge, frame); + gru_zoom(ge, frame); + gru_rotate(ge, frame); + gru_combo(ge, frame); gru->frame = *frame; } -- cgit v1.2.3