From 4df29658eb0f92ee52a53ae66749f0cd45b030f1 Mon Sep 17 00:00:00 2001 From: WooHyun Jung Date: Mon, 23 Jul 2012 17:13:40 +0900 Subject: [PATCH] Rollback elm_gesture_layer for fixing gallery applicatiion problem --- src/lib/elm_gesture_layer.c | 120 ++++++++++++++++++++++++++------------------ 1 file changed, 71 insertions(+), 49 deletions(-) diff --git a/src/lib/elm_gesture_layer.c b/src/lib/elm_gesture_layer.c index 68b7758..af36efe 100644 --- a/src/lib/elm_gesture_layer.c +++ b/src/lib/elm_gesture_layer.c @@ -11,8 +11,6 @@ #define ELM_GESTURE_MULTI_TIMEOUT 50 #define ELM_GESTURE_MINIMUM_MOMENTUM 0.001 -#define ELM_GESTURE_TAP_TIMEOUT 0.2 - /* Some Trigo values */ #define RAD_90DEG M_PI_2 #define RAD_180DEG M_PI @@ -413,9 +411,7 @@ consume_event(Widget_Data *wd, void *event_info, if (!event_info) return; /* This happens when restarting gestures */ - if (!wd->repeat_events) ev_flags |= EVAS_EVENT_FLAG_ON_HOLD; - - if (ev_flags) + if ((ev_flags) || (!wd->repeat_events)) { switch(event_type) { @@ -1187,7 +1183,6 @@ _tap_gesture_check_finish(Gesture_Info *gesture) Taps_Type *st = gesture->data; Eina_List *l; Eina_List *pe_list; - if (!st || !st->l) return EINA_FALSE; EINA_LIST_FOREACH(st->l, l, pe_list) { if (eina_list_count(pe_list) != st->n_taps_needed) @@ -1211,14 +1206,12 @@ _tap_gesture_check_finish(Gesture_Info *gesture) static void _tap_gesture_finish(void *data) { /* This function will test each tap gesture when timer expires */ - Elm_Gesture_State s = ELM_GESTURE_STATE_ABORT; + Elm_Gesture_State s = ELM_GESTURE_STATE_END; Gesture_Info *gesture = data; Taps_Type *st = gesture->data; - if (_tap_gesture_check_finish(gesture)) - { - s = ELM_GESTURE_STATE_END; - } + if (!_tap_gesture_check_finish(data)) + s = ELM_GESTURE_STATE_ABORT; st->info.n = eina_list_count(st->l); _set_state(gesture, s, gesture->info, EINA_FALSE); @@ -1282,7 +1275,7 @@ _long_tap_timeout(void *data) /** * @internal * - * This function checks the state of a tap gesture. + * This function checks if a tap gesture should start * * @param wd Gesture Layer Widget Data. * @param pe The recent input event as stored in pe struct. @@ -1291,16 +1284,15 @@ _long_tap_timeout(void *data) * @param gesture what gesture is tested * @param how many taps for this gesture (1, 2 or 3) * + * @return Flag to determine if we need to set a timer for finish + * * @ingroup Elm_Gesture_Layer */ -static void -_tap_gesture_test(Widget_Data *wd, Pointer_Event *pe, +static Eina_Bool +_tap_gesture_start(Widget_Data *wd, Pointer_Event *pe, void *event_info, Evas_Callback_Type event_type, Gesture_Info *gesture, int taps) { /* Here we fill Tap struct */ - if (!pe) - return; - Taps_Type *st = gesture->data; if (!st) { /* Allocated once on first time */ @@ -1326,20 +1318,10 @@ _tap_gesture_test(Widget_Data *wd, Pointer_Event *pe, &st->info, EINA_FALSE); consume_event(wd, event_info, event_type, ev_flag); - return; + return EINA_FALSE; } pe_list = _record_pointer_event(st, pe_list, pe, wd, event_info, event_type); - if (!wd->dbl_timeout) - { - wd->dbl_timeout = ecore_timer_add(ELM_GESTURE_TAP_TIMEOUT, - _multi_tap_timeout, gesture->obj); - } - else - { - ecore_timer_reset(wd->dbl_timeout); - } - if ((pe->device == 0) && (eina_list_count(pe_list) == 1)) { /* This is the first mouse down we got */ ev_flag = _set_state(gesture, ELM_GESTURE_STATE_START, @@ -1348,13 +1330,7 @@ _tap_gesture_test(Widget_Data *wd, Pointer_Event *pe, st->n_taps_needed = taps * 2; /* count DOWN and UP */ - return; - } - else if (eina_list_count(pe_list) > st->n_taps_needed) - { - /* If we arleady got too many touches for this gesture. */ - ev_flag = _set_state(gesture, ELM_GESTURE_STATE_ABORT, - &st->info, EINA_FALSE); + return EINA_TRUE; } break; @@ -1363,7 +1339,7 @@ _tap_gesture_test(Widget_Data *wd, Pointer_Event *pe, case EVAS_CALLBACK_MOUSE_UP: pe_list = eina_list_search_unsorted(st->l, compare_pe_device, pe); if (!pe_list) - return; + return EINA_FALSE; pe_list = _record_pointer_event(st, pe_list, pe, wd, event_info, event_type); @@ -1376,7 +1352,7 @@ _tap_gesture_test(Widget_Data *wd, Pointer_Event *pe, if (_tap_gesture_check_finish(gesture)) { _tap_gesture_finish(gesture); - return; + return EINA_FALSE; } } @@ -1400,7 +1376,52 @@ _tap_gesture_test(Widget_Data *wd, Pointer_Event *pe, break; default: - return ; + return EINA_FALSE; + } + + return EINA_FALSE; +} + + +/** + * @internal + * + * This function checks all click/tap and double/triple taps + * + * @param obj The gesture-layer object. + * @param pe The recent input event as stored in pe struct. + * @param event_info Original input event pointer. + * @param event_type Type of original input event. + * + * @ingroup Elm_Gesture_Layer + */ +static void +_tap_gestures_test(Evas_Object *obj, Pointer_Event *pe, + void *event_info, Evas_Callback_Type event_type) +{ /* Here we fill Recent_Taps struct and fire-up click/tap timers */ + Eina_Bool need_timer = EINA_FALSE; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + + if (!pe) /* this happens when unhandled event arrived */ + return; /* see _make_pointer_event function */ + + if (IS_TESTED(ELM_GESTURE_N_TAPS)) + need_timer |= _tap_gesture_start(wd, pe, event_info, event_type, + wd->gesture[ELM_GESTURE_N_TAPS], 1); + + if (IS_TESTED(ELM_GESTURE_N_DOUBLE_TAPS)) + need_timer |= _tap_gesture_start(wd, pe, event_info, event_type, + wd->gesture[ELM_GESTURE_N_DOUBLE_TAPS], 2); + + if (IS_TESTED(ELM_GESTURE_N_TRIPLE_TAPS)) + need_timer |= _tap_gesture_start(wd, pe, event_info, event_type, + wd->gesture[ELM_GESTURE_N_TRIPLE_TAPS], 3); + + if ((need_timer) && (!wd->dbl_timeout)) + { /* Set a timer to finish these gestures */ + wd->dbl_timeout = ecore_timer_add(0.4, _multi_tap_timeout, + obj); } } @@ -3216,17 +3237,8 @@ _event_process(void *data, Evas_Object *obj __UNUSED__, _n_long_tap_test(data, pe, event_info, event_type, ELM_GESTURE_N_LONG_TAPS); - if (IS_TESTED(ELM_GESTURE_N_TAPS)) - _tap_gesture_test(wd, pe, event_info, event_type, - wd->gesture[ELM_GESTURE_N_TAPS], 1); - - if (IS_TESTED(ELM_GESTURE_N_DOUBLE_TAPS)) - _tap_gesture_test(wd, pe, event_info, event_type, - wd->gesture[ELM_GESTURE_N_DOUBLE_TAPS], 2); - - if (IS_TESTED(ELM_GESTURE_N_TRIPLE_TAPS)) - _tap_gesture_test(wd, pe, event_info, event_type, - wd->gesture[ELM_GESTURE_N_TRIPLE_TAPS], 3); + /* This takes care of single, double and tripple tap */ + _tap_gestures_test(data, pe, event_info, event_type); if (IS_TESTED(ELM_GESTURE_MOMENTUM)) _momentum_test(data, pe, event_info, event_type, @@ -3249,6 +3261,16 @@ _event_process(void *data, Evas_Object *obj __UNUSED__, if (_get_event_flag(event_info, event_type) & EVAS_EVENT_FLAG_ON_HOLD) _event_history_add(data, event_info, event_type); + else if ((event_type == EVAS_CALLBACK_MOUSE_UP) || + (event_type == EVAS_CALLBACK_MULTI_UP)) + { + Eina_List *pending = _device_is_pending(wd->pending, event_info, event_type); + if (pending) + { + consume_event(wd, event_info, event_type, EVAS_EVENT_FLAG_ON_HOLD); + _event_history_add(data, event_info, event_type); + } + } /* we maintain list of touched devices */ /* We also use move to track current device x.y pos */ -- 2.7.4