Rollback elm_gesture_layer for fixing gallery applicatiion problem
authorWooHyun Jung <wh0705.jung@samsung.com>
Mon, 23 Jul 2012 08:13:40 +0000 (17:13 +0900)
committerWooHyun Jung <wh0705.jung@samsung.com>
Mon, 23 Jul 2012 08:13:40 +0000 (17:13 +0900)
src/lib/elm_gesture_layer.c

index 68b7758..af36efe 100644 (file)
@@ -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 */