Gesture Manager: Add gestures and fix gesture managing, recognizer logic.
authorWoochanlee <wc0917.lee@samsung.com>
Tue, 14 May 2019 07:37:20 +0000 (16:37 +0900)
committerJunsuChoi <jsuya.choi@samsung.com>
Thu, 30 May 2019 08:17:51 +0000 (17:17 +0900)
Summary:
https://phab.enlightenment.org/T7544

Provides a way for a user to get a gesture manager, recognizer instance.

Supports different recognizer properties for each target(Eo).

Gesture, Touch Class Life-cycle re-implementation. for supporting multiple touches.

Add below gestures.
efl_canvas_gesture_tap
efl_canvas_gesture_double_tap
efl_canvas_gesture_triple_tap
efl_canvas_gesture_long_tap
efl_canvas_gesture_momentum
efl_canvas_gesture_zoom
efl_canvas_gesture_flick

Test Plan:
Simple test -> test_gesture_framework.c
More test cases will upload.

Reviewers: woohyun, smohanty, segfaultxavi, Jaehyun_Cho

Reviewed By: Jaehyun_Cho

Subscribers: Jaehyun_Cho, segfaultxavi, cedric

Tags: #efl, #do_not_merge

Differential Revision: https://phab.enlightenment.org/D7579

46 files changed:
src/Makefile_Evas.am
src/bin/elementary/test_gesture_framework.c
src/lib/evas/Evas_Eo.h
src/lib/evas/canvas/efl_canvas_object.eo
src/lib/evas/canvas/evas_callbacks.c
src/lib/evas/canvas/evas_object_main.c
src/lib/evas/gesture/efl_canvas_gesture.c
src/lib/evas/gesture/efl_canvas_gesture.eo
src/lib/evas/gesture/efl_canvas_gesture_double_tap.c [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_double_tap.eo [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_flick.c [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_flick.eo [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_long_tap.c
src/lib/evas/gesture/efl_canvas_gesture_long_tap.eo
src/lib/evas/gesture/efl_canvas_gesture_manager.c
src/lib/evas/gesture/efl_canvas_gesture_manager.eo
src/lib/evas/gesture/efl_canvas_gesture_momentum.c [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_momentum.eo [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_private.h
src/lib/evas/gesture/efl_canvas_gesture_recognizer.c
src/lib/evas/gesture/efl_canvas_gesture_recognizer.eo
src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.c [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.eo [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.eo [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_recognizer_long_tap.c
src/lib/evas/gesture/efl_canvas_gesture_recognizer_long_tap.eo
src/lib/evas/gesture/efl_canvas_gesture_recognizer_momentum.c [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_recognizer_momentum.eo [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_recognizer_tap.c
src/lib/evas/gesture/efl_canvas_gesture_recognizer_tap.eo
src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.eo [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.c [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.eo [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_tap.c
src/lib/evas/gesture/efl_canvas_gesture_tap.eo
src/lib/evas/gesture/efl_canvas_gesture_touch.c
src/lib/evas/gesture/efl_canvas_gesture_touch.eo
src/lib/evas/gesture/efl_canvas_gesture_triple_tap.c [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_triple_tap.eo [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_types.eot
src/lib/evas/gesture/efl_canvas_gesture_zoom.c [new file with mode: 0644]
src/lib/evas/gesture/efl_canvas_gesture_zoom.eo [new file with mode: 0644]
src/lib/evas/gesture/efl_gesture_events.eo [new file with mode: 0644]
src/lib/evas/gesture/meson.build

index 8e079e0..a3261a4 100755 (executable)
@@ -59,16 +59,25 @@ evas_gesture_eolian_pub_files = \
        lib/evas/gesture/efl_canvas_gesture.eo \
        lib/evas/gesture/efl_canvas_gesture_tap.eo \
        lib/evas/gesture/efl_canvas_gesture_long_tap.eo \
+       lib/evas/gesture/efl_canvas_gesture_double_tap.eo \
+       lib/evas/gesture/efl_canvas_gesture_triple_tap.eo \
+       lib/evas/gesture/efl_canvas_gesture_momentum.eo \
+       lib/evas/gesture/efl_canvas_gesture_flick.eo \
+       lib/evas/gesture/efl_canvas_gesture_zoom.eo \
        lib/evas/gesture/efl_canvas_gesture_recognizer.eo \
+       lib/evas/gesture/efl_canvas_gesture_recognizer_tap.eo \
+       lib/evas/gesture/efl_canvas_gesture_recognizer_long_tap.eo \
+       lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.eo \
+       lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.eo \
+       lib/evas/gesture/efl_canvas_gesture_recognizer_momentum.eo \
+       lib/evas/gesture/efl_canvas_gesture_recognizer_flick.eo \
+       lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.eo \
        lib/evas/gesture/efl_canvas_gesture_manager.eo \
+       lib/evas/gesture/efl_gesture_events.eo \
        $(NULL)
 
 evas_canvas_eolian_priv_files = \
-       lib/evas/include/evas_ector_buffer.eo
-
-evas_gesture_eolian_priv_files = \
-       lib/evas/gesture/efl_canvas_gesture_recognizer_tap.eo \
-       lib/evas/gesture/efl_canvas_gesture_recognizer_long_tap.eo
+    lib/evas/include/evas_ector_buffer.eo
 
 evas_canvas_eolian_type_files = \
     lib/evas/canvas/evas_canvas3d_types.eot \
@@ -80,9 +89,6 @@ evas_gesture_eolian_type_files = \
 evas_canvas_eolian_priv_c = $(evas_canvas_eolian_priv_files:%.eo=%.eo.c)
 evas_canvas_eolian_priv_h = $(evas_canvas_eolian_priv_files:%.eo=%.eo.h)
 
-evas_gesture_eolian_priv_c = $(evas_gesture_eolian_priv_files:%.eo=%.eo.c)
-evas_gesture_eolian_priv_h = $(evas_gesture_eolian_priv_files:%.eo=%.eo.h)
-
 evas_canvas_eolian_pub_c = $(evas_canvas_eolian_pub_files:%.eo=%.eo.c)
 evas_canvas_eolian_pub_h = $(evas_canvas_eolian_pub_files:%.eo=%.eo.h) \
                            $(evas_canvas_eolian_type_files:%.eot=%.eot.h)
@@ -97,13 +103,15 @@ evas_eolian_files = $(evas_canvas_eolian_pub_files) \
                     $(evas_gesture_eolian_type_files)
 
 evas_eolian_internal_files = $(evas_canvas_eolian_priv_files) \
-                             $(evas_gesture_eolian_priv_files)
+                             $(evas_eolian_legacy_files)
 
 evas_eolian_c = $(evas_canvas_eolian_pub_c) $(evas_canvas_eolian_priv_c) \
-                $(evas_gesture_eolian_pub_c) $(evas_gesture_eolian_priv_c)
+                $(evas_gesture_eolian_pub_c) \
+                $(evas_eolian_legacy_c)
 
 evas_eolian_h = $(evas_canvas_eolian_pub_h) $(evas_canvas_eolian_priv_h) \
-                $(evas_gesture_eolian_pub_h) $(evas_gesture_eolian_priv_h)
+                $(evas_gesture_eolian_pub_h) \
+                $(evas_eolian_legacy_h)
 
 BUILT_SOURCES += \
                  $(evas_eolian_c) \
@@ -322,9 +330,19 @@ lib/evas/gesture/efl_canvas_gesture_touch.c \
 lib/evas/gesture/efl_canvas_gesture.c \
 lib/evas/gesture/efl_canvas_gesture_tap.c \
 lib/evas/gesture/efl_canvas_gesture_long_tap.c \
+lib/evas/gesture/efl_canvas_gesture_double_tap.c \
+lib/evas/gesture/efl_canvas_gesture_triple_tap.c \
+lib/evas/gesture/efl_canvas_gesture_momentum.c \
+lib/evas/gesture/efl_canvas_gesture_flick.c \
+lib/evas/gesture/efl_canvas_gesture_zoom.c \
 lib/evas/gesture/efl_canvas_gesture_recognizer.c \
 lib/evas/gesture/efl_canvas_gesture_recognizer_tap.c \
 lib/evas/gesture/efl_canvas_gesture_recognizer_long_tap.c \
+lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.c \
+lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c \
+lib/evas/gesture/efl_canvas_gesture_recognizer_momentum.c \
+lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c \
+lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.c \
 lib/evas/gesture/efl_canvas_gesture_manager.c \
 lib/evas/common/region.c \
 lib/evas/common/region.h \
index ada28bc..5e2e935 100644 (file)
@@ -175,25 +175,19 @@ _color_and_icon_set(infra_data *infra, char *name, int n, int max,
 static void
 finger_tap_start(void *data , Efl_Canvas_Gesture *tap)
 {
-   Eina_Vector2 pos = efl_gesture_hotspot_get(tap);
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
 
    _color_and_icon_set(data, TAP_NAME, 1, MAX_TAP, START_COLOR);
-   printf("Tap Gesture started x,y=<%f,%f> \n", pos.x, pos.y);
-}
-
-static void
-finger_tap_update(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
-{
-   _color_and_icon_set(data, TAP_NAME, 1, MAX_TAP, UPDATE_COLOR);
+   printf("Tap Gesture started x,y=<%d,%d> \n", pos.x, pos.y);
 }
 
 static void
 finger_tap_end(void *data , Efl_Canvas_Gesture *tap)
 {
-   Eina_Vector2 pos = efl_gesture_hotspot_get(tap);
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
 
    _color_and_icon_set(data, TAP_NAME, 1, MAX_TAP, END_COLOR);
-   printf("Tap Gesture ended x,y=<%f,%f> \n", pos.x, pos.y);
+   printf("Tap Gesture ended x,y=<%d,%d> \n", pos.x, pos.y);
 }
 
 static void
@@ -204,12 +198,147 @@ finger_tap_abort(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
 }
 
 static void
+finger_flick_start(void *data , Efl_Canvas_Gesture *tap)
+{
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
+
+   _color_and_icon_set(data, FLICK_NAME, 1, MAX_TAP, START_COLOR);
+   printf("Flick Gesture started x,y=<%d,%d> \n", pos.x, pos.y);
+}
+
+static void
+finger_flick_end(void *data , Efl_Canvas_Gesture *tap)
+{
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
+   double angle = efl_gesture_flick_angle_get(tap);
+
+   _color_and_icon_set(data, FLICK_NAME, 1, MAX_TAP, END_COLOR);
+   printf("Flick Gesture ended x,y=<%d,%d> angle=<%f>\n", pos.x, pos.y, angle);
+}
+
+static void
+finger_flick_abort(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
+{
+   _color_and_icon_set(data, FLICK_NAME, 1, MAX_TAP, ABORT_COLOR);
+   printf("Flick Aborted\n");
+}
+
+static void
+finger_momentum_start(void *data , Efl_Canvas_Gesture *tap)
+{
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
+   unsigned int t = efl_gesture_timestamp_get(tap);
+
+   _color_and_icon_set(data, MOMENTUM_NAME, 1, MAX_TAP, START_COLOR);
+   printf("Momentum Gesture started x,y=<%d,%d> time=<%d>\n", pos.x, pos.y, t);
+}
+
+static void
+finger_momentum_update(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
+{
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
+   Eina_Vector2 m = efl_gesture_momentum_get(tap);
+   unsigned int t = efl_gesture_timestamp_get(tap);
+
+   _color_and_icon_set(data, MOMENTUM_NAME, 1, MAX_TAP, UPDATE_COLOR);
+   printf("Momentum Gesture updated x,y=<%d,%d> momentum=<%f %f> time=<%d>\n",
+          pos.x, pos.y, m.x, m.y, t);
+}
+
+static void
+finger_momentum_end(void *data , Efl_Canvas_Gesture *tap)
+{
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
+   Eina_Vector2 m = efl_gesture_momentum_get(tap);
+   unsigned int t = efl_gesture_timestamp_get(tap);
+
+   _color_and_icon_set(data, MOMENTUM_NAME, 1, MAX_TAP, END_COLOR);
+   printf("Momentum Gesture ended x,y=<%d,%d> momentum=<%f %f> time=<%d>\n",
+     pos.x, pos.y, m.x, m.y, t);
+}
+
+static void
+finger_momentum_abort(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
+{
+   _color_and_icon_set(data, MOMENTUM_NAME, 1, MAX_TAP, ABORT_COLOR);
+   printf("Momentum Aborted\n");
+}
+
+static void
+finger_triple_tap_start(void *data , Efl_Canvas_Gesture *tap)
+{
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
+
+   _color_and_icon_set(data, TRIPLE_TAP_NAME, 1, MAX_TAP, START_COLOR);
+   printf("Triple Tap Gesture started x,y=<%d,%d> \n", pos.x, pos.y);
+}
+
+static void
+finger_triple_tap_update(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
+{
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
+
+   _color_and_icon_set(data, TRIPLE_TAP_NAME, 1, MAX_TAP, UPDATE_COLOR);
+   printf("Triple Tap Gesture updated x,y=<%d,%d> \n", pos.x, pos.y);
+}
+
+static void
+finger_triple_tap_end(void *data , Efl_Canvas_Gesture *tap)
+{
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
+
+   _color_and_icon_set(data, TRIPLE_TAP_NAME, 1, MAX_TAP, END_COLOR);
+   printf("Triple Tap Gesture ended x,y=<%d,%d> \n", pos.x, pos.y);
+}
+
+static void
+finger_triple_tap_abort(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
+{
+   _color_and_icon_set(data, TRIPLE_TAP_NAME, 1, MAX_TAP, ABORT_COLOR);
+   printf("Triple Tap Aborted\n");
+}
+
+static void
+finger_double_tap_start(void *data , Efl_Canvas_Gesture *tap)
+{
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
+
+   _color_and_icon_set(data, DOUBLE_TAP_NAME, 1, MAX_TAP, START_COLOR);
+   printf("Double Tap Gesture started x,y=<%d,%d> \n", pos.x, pos.y);
+}
+
+static void
+finger_double_tap_update(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
+{
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
+
+   _color_and_icon_set(data, DOUBLE_TAP_NAME, 1, MAX_TAP, UPDATE_COLOR);
+   printf("Double Tap Gesture updated x,y=<%d,%d> \n", pos.x, pos.y);
+}
+
+static void
+finger_double_tap_end(void *data , Efl_Canvas_Gesture *tap)
+{
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
+
+   _color_and_icon_set(data, DOUBLE_TAP_NAME, 1, MAX_TAP, END_COLOR);
+   printf("Double Tap Gesture ended x,y=<%d,%d> \n", pos.x, pos.y);
+}
+
+static void
+finger_double_tap_abort(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
+{
+   _color_and_icon_set(data, DOUBLE_TAP_NAME, 1, MAX_TAP, ABORT_COLOR);
+   printf("Double Tap Aborted\n");
+}
+
+static void
 finger_long_tap_start(void *data , Efl_Canvas_Gesture *tap)
 {
-   Eina_Vector2 pos = efl_gesture_hotspot_get(tap);
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
 
    _color_and_icon_set(data, LONG_TAP_NAME, 1, MAX_TAP, START_COLOR);
-   printf("Long Tap Gesture started x,y=<%f,%f> \n", pos.x, pos.y);
+   printf("Long Tap Gesture started x,y=<%d,%d> \n", pos.x, pos.y);
 }
 
 static void
@@ -222,10 +351,10 @@ finger_long_tap_update(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
 static void
 finger_long_tap_end(void *data , Efl_Canvas_Gesture *tap)
 {
-   Eina_Vector2 pos = efl_gesture_hotspot_get(tap);
+   Eina_Position2D pos = efl_gesture_hotspot_get(tap);
 
    _color_and_icon_set(data, LONG_TAP_NAME, 1, MAX_TAP, END_COLOR);
-   printf("Long Tap Gesture ended x,y=<%f,%f> \n",pos.x, pos.y);
+   printf("Long Tap Gesture ended x,y=<%d,%d> \n",pos.x, pos.y);
 }
 
 static void
@@ -244,9 +373,6 @@ tap_gesture_cb(void *data , const Efl_Event *ev)
       case EFL_GESTURE_STARTED:
          finger_tap_start(data, g);
          break;
-      case EFL_GESTURE_UPDATED:
-         finger_tap_update(data, g);
-         break;
       case EFL_GESTURE_CANCELED:
          finger_tap_abort(data, g);
          break;
@@ -259,6 +385,95 @@ tap_gesture_cb(void *data , const Efl_Event *ev)
 }
 
 static void
+flick_gesture_cb(void *data , const Efl_Event *ev)
+{
+   Efl_Canvas_Gesture *g = ev->info;
+   switch(efl_gesture_state_get(g))
+   {
+      case EFL_GESTURE_STARTED:
+         finger_flick_start(data, g);
+         break;
+      case EFL_GESTURE_CANCELED:
+         finger_flick_abort(data, g);
+         break;
+      case EFL_GESTURE_FINISHED:
+         finger_flick_end(data, g);
+         break;
+      default:
+         break;
+   }
+}
+
+static void
+momentum_gesture_cb(void *data , const Efl_Event *ev)
+{
+   Efl_Canvas_Gesture *g = ev->info;
+   switch(efl_gesture_state_get(g))
+   {
+      case EFL_GESTURE_STARTED:
+         finger_momentum_start(data, g);
+         break;
+      case EFL_GESTURE_UPDATED:
+         finger_momentum_update(data, g);
+         break;
+      case EFL_GESTURE_CANCELED:
+         finger_momentum_abort(data, g);
+         break;
+      case EFL_GESTURE_FINISHED:
+         finger_momentum_end(data, g);
+         break;
+      default:
+         break;
+   }
+}
+
+static void
+triple_tap_gesture_cb(void *data , const Efl_Event *ev)
+{
+   Efl_Canvas_Gesture *g = ev->info;
+   switch(efl_gesture_state_get(g))
+   {
+      case EFL_GESTURE_STARTED:
+         finger_triple_tap_start(data, g);
+         break;
+      case EFL_GESTURE_UPDATED:
+         finger_triple_tap_update(data, g);
+         break;
+      case EFL_GESTURE_CANCELED:
+         finger_triple_tap_abort(data, g);
+         break;
+      case EFL_GESTURE_FINISHED:
+         finger_triple_tap_end(data, g);
+         break;
+      default:
+         break;
+   }
+}
+
+static void
+double_tap_gesture_cb(void *data , const Efl_Event *ev)
+{
+   Efl_Canvas_Gesture *g = ev->info;
+   switch(efl_gesture_state_get(g))
+   {
+      case EFL_GESTURE_STARTED:
+         finger_double_tap_start(data, g);
+         break;
+      case EFL_GESTURE_UPDATED:
+         finger_double_tap_update(data, g);
+         break;
+      case EFL_GESTURE_CANCELED:
+         finger_double_tap_abort(data, g);
+         break;
+      case EFL_GESTURE_FINISHED:
+         finger_double_tap_end(data, g);
+         break;
+      default:
+         break;
+   }
+}
+
+static void
 long_tap_gesture_cb(void *data , const Efl_Event *ev)
 {
    Efl_Canvas_Gesture *g = ev->info;
@@ -314,11 +529,22 @@ create_gesture_box(Evas_Object *win, icon_properties *icons,
 }
 
 void
+_tb_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   int w,h;
+
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+   evas_object_resize(data, w, h);
+   evas_object_color_set(data, 0, 0, 0, 0);
+   evas_object_show(data);
+}
+
+void
 test_gesture_framework(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
       void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *tb, *lb, *bx;
-   Evas_Object *r; /* Gesture layer transparent object */
+   Evas_Object *r, *target; /* Gesture layer transparent object */
 
    infra_data *infra = _infra_data_alloc();
 
@@ -336,6 +562,9 @@ test_gesture_framework(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
    evas_object_show(tb);
    evas_object_show(bx);
 
+   target = evas_object_rectangle_add(evas_object_evas_get(win));
+   evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, _tb_resize, target);
+
    /* Box of Tap icon and label */
    bx = create_gesture_box(win, infra->icons, 0, TAP_NAME, "Tap");
    elm_table_pack(tb, bx, 0, 0, 1, 1);
@@ -458,15 +687,13 @@ test_gesture_framework(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
    evas_object_show(lb);
    /* END   - Building icons table */
 
-   r = evas_object_rectangle_add(evas_object_evas_get(win));
-   evas_object_move(r, 250, 300);
-   evas_object_color_set(r, 0, 0, 255, 255);
-   evas_object_resize(r, 70, 70);
-   evas_object_show(r);
-
-   // LISTEN FOR TAP GESTURE
-   efl_event_callback_add(r, EFL_EVENT_GESTURE_TAP, tap_gesture_cb, infra);
-   efl_event_callback_add(r, EFL_EVENT_GESTURE_LONG_TAP, long_tap_gesture_cb, infra);
+   // LISTEN FOR GESTURES
+   efl_event_callback_add(target, EFL_EVENT_GESTURE_TAP, tap_gesture_cb, infra);
+   efl_event_callback_add(target, EFL_EVENT_GESTURE_LONG_TAP, long_tap_gesture_cb, infra);
+   efl_event_callback_add(target, EFL_EVENT_GESTURE_DOUBLE_TAP, double_tap_gesture_cb, infra);
+   efl_event_callback_add(target, EFL_EVENT_GESTURE_TRIPLE_TAP, triple_tap_gesture_cb, infra);
+   efl_event_callback_add(target, EFL_EVENT_GESTURE_MOMENTUM, momentum_gesture_cb, infra);
+   efl_event_callback_add(target, EFL_EVENT_GESTURE_FLICK, flick_gesture_cb, infra);
 
    /* Update color state 20 times a second */
    infra->colortimer = ecore_timer_add(0.05, _icon_color_set_cb, infra->icons);
index a4f611e..f3bcb6e 100644 (file)
@@ -187,6 +187,27 @@ struct _Efl_Canvas_Object_Animation_Event
 
 #include "canvas/efl_canvas_animation_types.eot.h"
 
+#include "gesture/efl_canvas_gesture_types.eot.h"
+#include "gesture/efl_canvas_gesture_touch.eo.h"
+#include "gesture/efl_canvas_gesture.eo.h"
+#include "gesture/efl_canvas_gesture_tap.eo.h"
+#include "gesture/efl_canvas_gesture_long_tap.eo.h"
+#include "gesture/efl_canvas_gesture_double_tap.eo.h"
+#include "gesture/efl_canvas_gesture_triple_tap.eo.h"
+#include "gesture/efl_canvas_gesture_momentum.eo.h"
+#include "gesture/efl_canvas_gesture_flick.eo.h"
+#include "gesture/efl_canvas_gesture_zoom.eo.h"
+#include "gesture/efl_canvas_gesture_recognizer.eo.h"
+#include "gesture/efl_canvas_gesture_recognizer_tap.eo.h"
+#include "gesture/efl_canvas_gesture_recognizer_long_tap.eo.h"
+#include "gesture/efl_canvas_gesture_recognizer_double_tap.eo.h"
+#include "gesture/efl_canvas_gesture_recognizer_triple_tap.eo.h"
+#include "gesture/efl_canvas_gesture_recognizer_momentum.eo.h"
+#include "gesture/efl_canvas_gesture_recognizer_flick.eo.h"
+#include "gesture/efl_canvas_gesture_recognizer_zoom.eo.h"
+#include "gesture/efl_canvas_gesture_manager.eo.h"
+#include "gesture/efl_gesture_events.eo.h"
+
 #include "canvas/efl_canvas_object.eo.h"
 
 #include "canvas/efl_canvas_animation.eo.h"
@@ -442,11 +463,3 @@ typedef void (Evas_Canvas3D_Surface_Func)(Evas_Real *out_x,
 #include "canvas/efl_input_hold.eo.h"
 #include "canvas/efl_input_interface.eo.h"
 #include "canvas/efl_input_focus.eo.h"
-
-# include "gesture/efl_canvas_gesture_types.eot.h"
-# include "gesture/efl_canvas_gesture_touch.eo.h"
-# include "gesture/efl_canvas_gesture.eo.h"
-# include "gesture/efl_canvas_gesture_tap.eo.h"
-# include "gesture/efl_canvas_gesture_long_tap.eo.h"
-# include "gesture/efl_canvas_gesture_recognizer.eo.h"
-# include "gesture/efl_canvas_gesture_manager.eo.h"
index 9a5f89d..6cd64ea 100644 (file)
@@ -8,7 +8,7 @@ struct Efl.Event_Animator_Tick {
 
 abstract Efl.Canvas.Object extends Efl.Loop_Consumer implements Efl.Gfx.Entity, Efl.Gfx.Color, Efl.Gfx.Stack,
                             Efl.Input.Interface, Efl.Gfx.Hint,
-                            Efl.Gfx.Mapping, Efl.Ui.I18n, Efl.Canvas.Pointer
+                            Efl.Gfx.Mapping, Efl.Ui.I18n, Efl.Canvas.Pointer, Efl.Gesture.Events
 {
    [[Efl canvas object abstract class
 
@@ -494,6 +494,10 @@ abstract Efl.Canvas.Object extends Efl.Loop_Consumer implements Efl.Gfx.Entity,
             return: bool; [[$true if the coords are inside the object, $false otherwise]]
          }
       }
+      gesture_manager_get @beta {
+         [[Returns current canvas's gesture manager]]
+         return: const(Efl.Canvas.Gesture_Manager); [[The gesture manager]]
+      }
    }
    implements {
       Efl.Object.constructor;
index dcd3338..0e9be65 100644 (file)
@@ -811,8 +811,7 @@ _check_event_catcher_add(void *data, const Efl_Event *event)
 
    for (i = 0; array[i].desc != NULL; i++)
      {
-        if (obj->layer->evas->gesture_manager &&
-            _efl_canvas_gesture_manager_watches(array[i].desc))
+        if (obj->layer->evas->gesture_manager)
           {
              if (!gd) gd = _efl_canvas_gesture_manager_private_data_get(obj->layer->evas->gesture_manager);
 
@@ -853,8 +852,7 @@ _check_event_catcher_del(void *data, const Efl_Event *event)
 
    for (i = 0; array[i].desc != NULL; i++)
      {
-        if (obj->layer->evas->gesture_manager &&
-            _efl_canvas_gesture_manager_watches(array[i].desc))
+        if (obj->layer->evas->gesture_manager)
           {
              if (!gd) gd = _efl_canvas_gesture_manager_private_data_get(obj->layer->evas->gesture_manager);
 
index 0719379..35556cb 100644 (file)
@@ -258,6 +258,15 @@ end:
    return efl_finalize(efl_super(eo_obj, MY_CLASS));
 }
 
+EOLIAN const Efl_Canvas_Gesture_Manager *
+_efl_canvas_object_gesture_manager_get(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *pd)
+{
+   if (!pd->layer || !pd->layer->evas)
+     return NULL;
+
+   return (pd->layer->evas)->gesture_manager;
+}
+
 void
 evas_object_change_reset(Evas_Object_Protected_Data *obj)
 {
index 7386a90..9017f82 100644 (file)
@@ -21,16 +21,29 @@ _efl_canvas_gesture_state_set(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Data *pd,
 }
 
 EOLIAN static void
-_efl_canvas_gesture_hotspot_set(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Data *pd, Eina_Vector2 hotspot)
+_efl_canvas_gesture_hotspot_set(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Data *pd, Eina_Position2D hotspot)
 {
    pd->hotspot = hotspot;
 }
 
 
-EOLIAN static Eina_Vector2
+EOLIAN static Eina_Position2D
 _efl_canvas_gesture_hotspot_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Data *pd)
 {
    return pd->hotspot;
 }
 
-#include "efl_canvas_gesture.eo.c"
\ No newline at end of file
+EOLIAN static void
+_efl_canvas_gesture_timestamp_set(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Data *pd, unsigned int timestamp)
+{
+   pd->timestamp = timestamp;
+}
+
+
+EOLIAN static unsigned int
+_efl_canvas_gesture_timestamp_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Data *pd)
+{
+   return pd->timestamp;
+}
+
+#include "efl_canvas_gesture.eo.c"
index eafb1d9..2a097d5 100644 (file)
@@ -2,7 +2,13 @@ import efl_canvas_gesture_types;
 
 abstract @beta Efl.Canvas.Gesture extends Efl.Object
 {
-   [[EFL Gesture abstract class]]
+   [[EFL Gesture abstract class
+
+     A gesture class defines a method that spcific gesture event and privides information
+     about the gesture's type, state, and associated pointer information.
+
+     For cetain gesture types, additional methods are defined to provide meaningful gesture
+     information to the user.]]
    c_prefix: efl_gesture;
    methods {
       @property type {
@@ -30,7 +36,17 @@ abstract @beta Efl.Canvas.Gesture extends Efl.Object
          set {
          }
          values {
-            hotspot: Eina.Vector2;[[hotspot co-ordinate]]
+            hotspot: Eina.Position2D;[[hotspot co-ordinate]]
+         }
+      }
+      @property timestamp {
+         [[This property holds the timestamp of the current gesture.]]
+         get {
+         }
+         set {
+         }
+         values {
+            timestamp: uint;[[The timestamp]]
          }
       }
    }
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_double_tap.c b/src/lib/evas/gesture/efl_canvas_gesture_double_tap.c
new file mode 100644 (file)
index 0000000..971d49e
--- /dev/null
@@ -0,0 +1,18 @@
+#include "efl_canvas_gesture_private.h"
+
+#define MY_CLASS EFL_CANVAS_GESTURE_DOUBLE_TAP_CLASS
+
+EOLIAN static Efl_Object *
+_efl_canvas_gesture_double_tap_efl_object_constructor(Eo *obj, void *pd EINA_UNUSED)
+{
+   Efl_Canvas_Gesture_Data *gd;
+
+   obj = efl_constructor(efl_super(obj, MY_CLASS));
+
+   gd = efl_data_scope_get(obj, EFL_CANVAS_GESTURE_CLASS);
+   gd->type = EFL_EVENT_GESTURE_DOUBLE_TAP;
+
+   return obj;
+}
+
+#include "efl_canvas_gesture_double_tap.eo.c"
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_double_tap.eo b/src/lib/evas/gesture/efl_canvas_gesture_double_tap.eo
new file mode 100644 (file)
index 0000000..39d84b8
--- /dev/null
@@ -0,0 +1,9 @@
+class @beta Efl.Canvas.Gesture_Double_Tap extends Efl.Canvas.Gesture
+{
+   [[EFL Gesture Double Tap class]]
+   data: null;
+   c_prefix: efl_gesture_double_tap;
+   implements {
+      Efl.Object.constructor;
+   }
+}
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_flick.c b/src/lib/evas/gesture/efl_canvas_gesture_flick.c
new file mode 100644 (file)
index 0000000..1095a84
--- /dev/null
@@ -0,0 +1,30 @@
+#include "efl_canvas_gesture_private.h"
+
+#define MY_CLASS EFL_CANVAS_GESTURE_FLICK_CLASS
+
+EOLIAN static Efl_Object *
+_efl_canvas_gesture_flick_efl_object_constructor(Eo *obj, Efl_Canvas_Gesture_Flick_Data *pd EINA_UNUSED)
+{
+   Efl_Canvas_Gesture_Data *gd;
+
+   obj = efl_constructor(efl_super(obj, MY_CLASS));
+
+   gd = efl_data_scope_get(obj, EFL_CANVAS_GESTURE_CLASS);
+   gd->type = EFL_EVENT_GESTURE_FLICK;
+
+   return obj;
+}
+
+EOLIAN static Eina_Vector2
+_efl_canvas_gesture_flick_momentum_get(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Flick_Data *pd)
+{
+   return pd->momentum;
+}
+
+EOLIAN static double
+_efl_canvas_gesture_flick_angle_get(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Flick_Data *pd)
+{
+   return pd->angle;
+}
+
+#include "efl_canvas_gesture_flick.eo.c"
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_flick.eo b/src/lib/evas/gesture/efl_canvas_gesture_flick.eo
new file mode 100644 (file)
index 0000000..7e87c55
--- /dev/null
@@ -0,0 +1,20 @@
+import eina_types;
+
+class @beta Efl.Canvas.Gesture_Flick extends Efl.Canvas.Gesture
+{
+   [[EFL Gesture Flick class]]
+   c_prefix: efl_gesture_flick;
+   methods {
+      momentum_get {
+         [[Gets flick gesture momentum value]]
+         return: Eina.Vector2; [[The momentum vector]]
+         }
+      angle_get {
+         [[Gets flick direction angle]]
+         return: double; [[The angle value]]
+      }
+   }
+   implements {
+      Efl.Object.constructor;
+   }
+}
index 099893a..21f0055 100644 (file)
@@ -2,9 +2,8 @@
 
 #define MY_CLASS EFL_CANVAS_GESTURE_LONG_TAP_CLASS
 
-
 EOLIAN static Efl_Object *
-_efl_canvas_gesture_long_tap_efl_object_constructor(Eo *obj, Efl_Canvas_Gesture_Long_Tap_Data *pd EINA_UNUSED)
+_efl_canvas_gesture_long_tap_efl_object_constructor(Eo *obj, void *pd EINA_UNUSED)
 {
    Efl_Canvas_Gesture_Data *gd;
 
@@ -16,11 +15,8 @@ _efl_canvas_gesture_long_tap_efl_object_constructor(Eo *obj, Efl_Canvas_Gesture_
 }
 
 EOLIAN static void
-_efl_canvas_gesture_long_tap_efl_object_destructor(Eo *obj, Efl_Canvas_Gesture_Long_Tap_Data *pd)
+_efl_canvas_gesture_long_tap_efl_object_destructor(Eo *obj, void *pd EINA_UNUSED)
 {
-   if (pd->timeout)
-     ecore_timer_del(pd->timeout);
-
    efl_destructor(efl_super(obj, MY_CLASS));
 }
 
index 1a690b0..79c5c6d 100644 (file)
@@ -1,11 +1,8 @@
 class @beta Efl.Canvas.Gesture_Long_Tap extends Efl.Canvas.Gesture
 {
    [[EFL Gesture Long Tap class]]
+   data: null;
    c_prefix: efl_gesture_long_tap;
-   event_prefix: efl;
-   events {
-      gesture,long_tap: Efl.Canvas.Gesture; [[Event for tap gesture]]
-   }
    implements {
       Efl.Object.constructor;
       Efl.Object.destructor;
index b174e49..8696004 100644 (file)
@@ -4,25 +4,25 @@
 
 typedef struct _Object_Gesture
 {
-   Eo                             *object;
-   const Efl_Event_Description    *type;
+   Eo                                    *object;
+   const Efl_Event_Description           *type;
    Efl_Canvas_Gesture                    *gesture;
    Efl_Canvas_Gesture_Recognizer         *recognizer;
-}Object_Gesture;
+} Object_Gesture;
 
 typedef struct _Efl_Canvas_Gesture_Manager_Data
 {
-   // keeps track of all the gesture request for a particular target
+   //Keeps track of all the gesture request for a particular target
    Eina_Hash    *m_gesture_contex;  // (*target, *event_desc)
-   // keeps all the event directed to this particular object from touch_begin till touch_end
+   //Keeps all the event directed to this particular object from touch_begin till touch_end
    Eina_Hash    *m_object_events;  // (*target, *efl_gesture_touch)
-   // keeps all the recognizer registered to gesture manager
+   //Keeps all the recognizer registered to gesture manager
    Eina_Hash    *m_recognizers; // (*gesture_type, *recognizer)
-   // keeps track of all current object gestures.
+   //Keeps track of all current object gestures.
    Eina_List    *m_object_gestures; //(List of *object_gesture)
-   // lazy deletion of gestures
+   //Lazy deletion of gestures
    Eina_List    *m_gestures_to_delete;
-
+   //Kepps config values for gesture recognize
    Eina_Hash    *m_config;
 } Efl_Canvas_Gesture_Manager_Data;
 
@@ -65,13 +65,18 @@ _efl_canvas_gesture_manager_efl_object_constructor(Eo *obj, Efl_Canvas_Gesture_M
 
    pd->m_config = eina_hash_string_superfast_new(EINA_FREE_CB(eina_value_free));
 
+   //Register all types of recognizers at very first time.
    efl_gesture_manager_recognizer_register(obj, efl_add(EFL_CANVAS_GESTURE_RECOGNIZER_TAP_CLASS, obj));
    efl_gesture_manager_recognizer_register(obj, efl_add(EFL_CANVAS_GESTURE_RECOGNIZER_LONG_TAP_CLASS, obj));
+   efl_gesture_manager_recognizer_register(obj, efl_add(EFL_CANVAS_GESTURE_RECOGNIZER_DOUBLE_TAP_CLASS, obj));
+   efl_gesture_manager_recognizer_register(obj, efl_add(EFL_CANVAS_GESTURE_RECOGNIZER_TRIPLE_TAP_CLASS, obj));
+   efl_gesture_manager_recognizer_register(obj, efl_add(EFL_CANVAS_GESTURE_RECOGNIZER_MOMENTUM_CLASS, obj));
+   efl_gesture_manager_recognizer_register(obj, efl_add(EFL_CANVAS_GESTURE_RECOGNIZER_FLICK_CLASS, obj));
+   efl_gesture_manager_recognizer_register(obj, efl_add(EFL_CANVAS_GESTURE_RECOGNIZER_ZOOM_CLASS, obj));
 
    return obj;
 }
 
-
 EOLIAN static Eina_Value *
 _efl_canvas_gesture_manager_config_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Manager_Data *pd, const char *name)
 {
@@ -84,6 +89,22 @@ _efl_canvas_gesture_manager_config_set(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_M
    Eina_Value *v = eina_value_new(eina_value_type_get(value));
    eina_value_copy(value, v);
    eina_hash_add(pd->m_config, name, v);
+
+   //Sets recognizer class property.
+   if (!strcmp(name, "glayer_tap_finger_size"))
+     {
+        int finger_size;
+        Efl_Canvas_Gesture_Recognizer *r;
+        Efl_Canvas_Gesture_Recognizer_Data *rd;
+
+        eina_value_get(value, &finger_size);
+
+        const Efl_Event_Description *type = EFL_EVENT_GESTURE_TAP;
+
+        r = eina_hash_find(pd->m_recognizers, &type);
+        rd = efl_data_scope_get(r, EFL_CANVAS_GESTURE_RECOGNIZER_CLASS);
+        rd->finger_size = finger_size;
+     }
 }
 
 EOLIAN static void
@@ -109,11 +130,11 @@ void
 _efl_canvas_gesture_manager_callback_add_hook(void *data, Eo *target, const Efl_Event_Description *type)
 {
    Efl_Canvas_Gesture_Manager_Data *pd = data;
-   // if there is a recognizer registered for that event then add it to the gesture context
+   //If there is a recognizer registered for that event then add it to the gesture context
    Efl_Canvas_Gesture_Recognizer *recognizer = eina_hash_find (pd->m_recognizers, &type);
    if (recognizer)
      {
-        // add it to the gesture context.
+        //Add it to the gesture context.
         eina_hash_list_append(pd->m_gesture_contex, &target, type);
      }
 }
@@ -122,7 +143,7 @@ void
 _efl_canvas_gesture_manager_callback_del_hook(void *data, Eo *target, const Efl_Event_Description *type)
 {
    Efl_Canvas_Gesture_Manager_Data *pd = data;
-   // if there is a recognizer registered for that event then add it to the gesture context
+   //If there is a recognizer registered for that event then add it to the gesture context
    Efl_Canvas_Gesture_Recognizer *recognizer = eina_hash_find (pd->m_recognizers, &type);
    if (recognizer)
      {
@@ -148,28 +169,39 @@ _efl_canvas_gesture_manager_filter_event(Eo *obj, Eo *target, void *event)
    gesture_context = eina_hash_find(pd->m_gesture_contex, &target);
    if (gesture_context)
      {
-        // get the touch event for this particular widget
-        touch_event = eina_hash_find(pd->m_object_events, &target);
-        if (!touch_event)
+        EINA_LIST_FOREACH(gesture_context, l, gesture_type)
           {
-             touch_event = efl_add_ref(EFL_CANVAS_GESTURE_TOUCH_CLASS, NULL);
-             eina_hash_add(pd->m_object_events, &target, touch_event);
-          }
+             //Check there is already created event exist or not.
+             touch_event = eina_hash_find(pd->m_object_events, &gesture_type);
 
-        efl_gesture_touch_point_record(touch_event, pointer_data->tool, pointer_data->cur,
-                                       pointer_data->timestamp, pointer_data->action);
+             if (!touch_event)
+               {
+                  touch_event = efl_add_ref(EFL_CANVAS_GESTURE_TOUCH_CLASS, NULL);
+                  eina_hash_add(pd->m_object_events, &gesture_type, touch_event);
+               }
 
-        if (efl_gesture_touch_state_get(touch_event) == EFL_GESTURE_TOUCH_UNKNOWN)
-          return;
+             efl_gesture_touch_point_record(touch_event, pointer_data->tool, pointer_data->cur,
+                                            pointer_data->timestamp, pointer_data->action);
+
+             //This is for handling the case that mouse event pairs dont match.
+                        //Such as the case of canceling gesture recognition after a mouse down.
+             if (efl_gesture_touch_state_get(touch_event) == EFL_GESTURE_TOUCH_UNKNOWN)
+               continue;
 
-        EINA_LIST_FOREACH(gesture_context, l, gesture_type)
-          {
              recognizer = eina_hash_find(pd->m_recognizers, &gesture_type);
+
+                        //If the gesture canceled or already finished by recognizer.
              gesture = _get_state(pd, target, recognizer, gesture_type);
              if (!gesture)
                continue;
+
+                        //Gesture detecting.
              recog_result = efl_gesture_recognizer_recognize(recognizer, gesture, target, touch_event);
              recog_state = recog_result & EFL_GESTURE_RESULT_MASK;
+
+             Efl_Canvas_Gesture_Recognizer_Data *rd =
+               efl_data_scope_get(recognizer, EFL_CANVAS_GESTURE_RECOGNIZER_CLASS);
+
              if (recog_state == EFL_GESTURE_TRIGGER)
                {
                   if (efl_gesture_state_get(gesture) == EFL_GESTURE_NONE)
@@ -188,53 +220,57 @@ _efl_canvas_gesture_manager_filter_event(Eo *obj, Eo *target, void *event)
              else if (recog_state == EFL_GESTURE_CANCEL)
                {
                   if (efl_gesture_state_get(gesture) != EFL_GESTURE_NONE)
+                    efl_gesture_state_set(gesture, EFL_GESTURE_CANCELED);
+                  else
                     {
-                       efl_gesture_state_set(gesture, EFL_GESTURE_CANCELED);
+                       //Need to recognize events that occur consecutively
+                       //in a mouse-down state.
+                       if (rd->continues)
+                         continue;
                     }
-                  else
-                    continue;
                }
              else if (recog_state == EFL_GESTURE_IGNORE)
                {
                   continue;
                }
+
+             efl_gesture_timestamp_set(gesture, efl_gesture_touch_cur_timestamp_get(touch_event));
              efl_event_callback_call(target, gesture_type, gesture);
-          }
 
-        if (efl_gesture_touch_state_get(touch_event) == EFL_GESTURE_TOUCH_END)
-          {
-             EINA_LIST_FOREACH(gesture_context, l, gesture_type)
-               _cleanup_cached_gestures(pd, target, gesture_type);
+             //If the current event recognizes the gesture continuously, dont delete gesture.
+             if (((recog_state == EFL_GESTURE_FINISH) || (recog_state == EFL_GESTURE_CANCEL)) &&
+                 !rd->continues)
+               {
+                  _cleanup_cached_gestures(pd, target, gesture_type);
+                  eina_hash_del(pd->m_object_events, &gesture_type, NULL);
+                  //FIXME: delete it by object not list.
+                  _cleanup_object(pd->m_gestures_to_delete);
+                  pd->m_gestures_to_delete = NULL;
 
-             eina_hash_del(pd->m_object_events, &target, NULL);
-             // free gesture_to_delete list
-             _cleanup_object(pd->m_gestures_to_delete);
-             pd->m_gestures_to_delete = NULL;
+               }
           }
      }
 }
 
-EOLIAN static const Efl_Event_Description *
+EOLIAN static void
 _efl_canvas_gesture_manager_recognizer_register(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Manager_Data *pd,
                                                 Efl_Canvas_Gesture_Recognizer *recognizer)
 {
    Efl_Canvas_Gesture_Recognizer_Data *rpd;
-   Efl_Canvas_Gesture *dummy = efl_gesture_recognizer_create(recognizer, 0);
+   Efl_Canvas_Gesture *dummy = efl_gesture_recognizer_add(recognizer, NULL);
 
    if (!dummy)
-     return NULL;
+     return;
 
    const Efl_Event_Description *type = efl_gesture_type_get(dummy);
 
-   // Add the recognizer to the m_recognizers
+   //Add the recognizer to the m_recognizers
    eina_hash_add(pd->m_recognizers, &type, efl_ref(recognizer));
-   // update the manager
+   //Update the manager
    rpd = efl_data_scope_get(recognizer, EFL_CANVAS_GESTURE_RECOGNIZER_CLASS);
    rpd->manager = obj;
 
    efl_del(dummy);
-
-   return type;
 }
 
 EOLIAN static void
@@ -248,19 +284,19 @@ _efl_canvas_gesture_manager_recognizer_unregister(Eo *obj EINA_UNUSED, Efl_Canva
 
    if (!recognizer) return;
 
-   // find the type of the recognizer
-   dummy = efl_gesture_recognizer_create(recognizer, 0);
+   //Find the type of the recognizer
+   dummy = efl_gesture_recognizer_add(recognizer, 0);
    if (!dummy)return;
 
    type = efl_gesture_type_get(dummy);
    efl_del(dummy);
 
-   // check if its already registered
+   //Check if its already registered
    recognizer = eina_hash_find(pd->m_recognizers, &type);
 
    if (!recognizer) return;
 
-   // remove that gesture from the list of object gestures
+   //Remove that gesture from the list of object gestures
    EINA_LIST_FOREACH_SAFE(pd->m_object_gestures, l, l_next, object_gesture)
      {
         if (object_gesture->type == type)
@@ -270,9 +306,71 @@ _efl_canvas_gesture_manager_recognizer_unregister(Eo *obj EINA_UNUSED, Efl_Canva
              pd->m_object_gestures = eina_list_remove_list(pd->m_object_gestures, l);
           }
      }
+
    eina_hash_del(pd->m_recognizers, &type, NULL);
 }
 
+static Efl_Canvas_Gesture_Recognizer *
+_find_match_recognizer(Efl_Canvas_Gesture_Manager_Data *pd, Efl_Canvas_Gesture_Recognizer_Type type)
+{
+   const Efl_Event_Description *event_type;
+
+   switch (type)
+     {
+       case EFL_GESTURE_TAP:
+         {
+            event_type = EFL_EVENT_GESTURE_TAP;
+            break;
+         }
+       case EFL_GESTURE_DOUBLETAP:
+         {
+            event_type = EFL_EVENT_GESTURE_DOUBLE_TAP;
+            break;
+         }
+       case EFL_GESTURE_TRIPLETAP:
+         {
+            event_type = EFL_EVENT_GESTURE_TRIPLE_TAP;
+            break;
+         }
+       case EFL_GESTURE_LONGTAP:
+         {
+            event_type = EFL_EVENT_GESTURE_LONG_TAP;
+            break;
+         }
+       case EFL_GESTURE_MOMENTUM:
+         {
+            event_type = EFL_EVENT_GESTURE_MOMENTUM;
+            break;
+         }
+       case EFL_GESTURE_FLICK:
+         {
+            event_type = EFL_EVENT_GESTURE_FLICK;
+            break;
+         }
+       case EFL_GESTURE_ZOOM:
+         {
+            event_type = EFL_EVENT_GESTURE_ZOOM;
+            break;
+         }
+       default:
+         return NULL;
+     }
+
+   return eina_hash_find(pd->m_recognizers, &event_type);
+}
+
+EOLIAN static const Efl_Canvas_Gesture_Recognizer *
+_efl_canvas_gesture_manager_recognizer_get(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Manager_Data *pd,
+                                           Efl_Canvas_Gesture_Recognizer_Type type)
+{
+   Efl_Canvas_Gesture_Recognizer *recognizer = _find_match_recognizer(pd, type);
+
+   if (recognizer)
+     return recognizer;
+   else
+     return NULL;
+}
+
 // EOLIAN static void
 // _efl_canvas_gesture_manager_ungrab_all(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Manager_Data *pd,
 //                                    Eo *target)
@@ -291,7 +389,7 @@ _efl_canvas_gesture_manager_recognizer_unregister(Eo *obj EINA_UNUSED, Efl_Canva
 //    eina_hash_del(pd->m_gesture_contex, &target, NULL);
 // }
 
-// get or create a gesture object that will represent the state for a given object, used by the recognizer
+//Get or create a gesture object that will represent the state for a given object, used by the recognizer
 Efl_Canvas_Gesture*
 _get_state(Efl_Canvas_Gesture_Manager_Data *pd,
            Eo *target, Efl_Canvas_Gesture_Recognizer *recognizer, const Efl_Event_Description *type)
@@ -299,9 +397,11 @@ _get_state(Efl_Canvas_Gesture_Manager_Data *pd,
    Eina_List *l;
    Object_Gesture *object_gesture;
    Efl_Canvas_Gesture *gesture;
+   Efl_Canvas_Gesture_Recognizer_Data *rd =
+     efl_data_scope_get(recognizer, EFL_CANVAS_GESTURE_RECOGNIZER_CLASS);
 
-   // if the widget is being deleted we should be careful not to
-   // create a new state.
+   //If the widget is being deleted we should be careful not to
+   //Create a new state.
    if (efl_destructed_is(target))
      return 0;
 
@@ -310,19 +410,27 @@ _get_state(Efl_Canvas_Gesture_Manager_Data *pd,
      {
         if (object_gesture->object == target &&
             object_gesture->recognizer == recognizer &&
-            object_gesture->type   == type)
+            object_gesture->type == type)
          {
-            // the gesture is already processed waiting for cleanup
-            if ((efl_gesture_state_get(object_gesture->gesture) == EFL_GESTURE_FINISHED) ||
-                (efl_gesture_state_get(object_gesture->gesture) == EFL_GESTURE_CANCELED))
-              return NULL;
+            //The gesture is already processed waiting for cleanup
+            if (((efl_gesture_state_get(object_gesture->gesture) == EFL_GESTURE_FINISHED) ||
+                (efl_gesture_state_get(object_gesture->gesture) == EFL_GESTURE_CANCELED)) &&
+                (!rd->continues))
+              {
+                 _cleanup_cached_gestures(pd, target, type);
+                 eina_hash_del(pd->m_object_events, &type, NULL);
+                 _cleanup_object(pd->m_gestures_to_delete);
+                 pd->m_gestures_to_delete = NULL;
+                 return NULL;
+              }
             return object_gesture->gesture;
          }
      }
 
-   gesture = efl_gesture_recognizer_create(recognizer, target);
+   gesture = efl_gesture_recognizer_add(recognizer, target);
    if (!gesture)
      return 0;
+
    object_gesture = calloc(1, sizeof(Object_Gesture));
    object_gesture->object = target;
    object_gesture->recognizer = recognizer;
@@ -343,7 +451,7 @@ _cleanup_cached_gestures(Efl_Canvas_Gesture_Manager_Data *pd,
 
    EINA_LIST_FOREACH_SAFE(pd->m_object_gestures, l, l_next, object_gesture)
      {
-        if ( (object_gesture->type == type) && (target == object_gesture->object))
+        if ((object_gesture->type == type) && (target == object_gesture->object))
           {
              pd->m_gestures_to_delete = eina_list_append(pd->m_gestures_to_delete, object_gesture->gesture);
              free(object_gesture);
@@ -371,4 +479,15 @@ _efl_canvas_gesture_manager_watches(const Efl_Event_Description *ev)
    return EINA_FALSE;
 }
 
+void
+efl_gesture_manager_gesture_clean_up(Eo *obj, Eo *target, const Efl_Event_Description *type)
+{
+   Efl_Canvas_Gesture_Manager_Data *pd = efl_data_scope_get(obj, MY_CLASS);
+
+   _cleanup_cached_gestures(pd, target, type);
+   eina_hash_del(pd->m_object_events, &type, NULL);
+   _cleanup_object(pd->m_gestures_to_delete);
+   pd->m_gestures_to_delete = NULL;
+}
+
 #include "efl_canvas_gesture_manager.eo.c"
index a39318a..d626ca1 100644 (file)
@@ -8,7 +8,6 @@ class @beta Efl.Canvas.Gesture_Manager extends Efl.Object
          params {
             @in recognizer: Efl.Canvas.Gesture_Recognizer; [[The gesture recognizer object]]
          }
-         return: ptr(const(Efl.Event_Description)); [[Returns the Efl.Event_Description type the recognizer supports]]
       }
       recognizer_unregister {
          [[This function is called to unregister a Efl.Canvas.Gesture_Recognizer]]
@@ -16,6 +15,13 @@ class @beta Efl.Canvas.Gesture_Manager extends Efl.Object
             @in recognizer: Efl.Canvas.Gesture_Recognizer; [[The gesture recognizer object]]
          }
       }
+      recognizer_get {
+         [[Gets event type's recognizer]]
+         params {
+            @in gesture_type: Efl.Canvas.Gesture_Recognizer_Type; [[The gesture type]]
+         }
+         return: const(Efl.Canvas.Gesture_Recognizer); [[The gesture recognizer]]
+      }
       @property config {
          [[This property holds the config value for the recognizer]]
          set {
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_momentum.c b/src/lib/evas/gesture/efl_canvas_gesture_momentum.c
new file mode 100644 (file)
index 0000000..e7eb34a
--- /dev/null
@@ -0,0 +1,24 @@
+#include "efl_canvas_gesture_private.h"
+
+#define MY_CLASS EFL_CANVAS_GESTURE_MOMENTUM_CLASS
+
+EOLIAN static Efl_Object *
+_efl_canvas_gesture_momentum_efl_object_constructor(Eo *obj, Efl_Canvas_Gesture_Momentum_Data *pd EINA_UNUSED)
+{
+   Efl_Canvas_Gesture_Data *gd;
+
+   obj = efl_constructor(efl_super(obj, MY_CLASS));
+
+   gd = efl_data_scope_get(obj, EFL_CANVAS_GESTURE_CLASS);
+   gd->type = EFL_EVENT_GESTURE_MOMENTUM;
+
+   return obj;
+}
+
+EOLIAN static Eina_Vector2
+_efl_canvas_gesture_momentum_momentum_get(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Momentum_Data *pd)
+{
+   return pd->momentum;
+}
+
+#include "efl_canvas_gesture_momentum.eo.c"
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_momentum.eo b/src/lib/evas/gesture/efl_canvas_gesture_momentum.eo
new file mode 100644 (file)
index 0000000..c5aebcb
--- /dev/null
@@ -0,0 +1,16 @@
+import eina_types;
+
+class @beta Efl.Canvas.Gesture_Momentum extends Efl.Canvas.Gesture
+{
+   [[EFL Gesture Momentum class]]
+   c_prefix: efl_gesture_momentum;
+   methods {
+      momentum_get {
+         [[Gets momentum value]]
+         return: Eina.Vector2; [[The momentum vector]]
+      }
+   }
+   implements {
+      Efl.Object.constructor;
+   }
+}
index c09fd26..e1de45c 100644 (file)
 #define EFL_INTERNAL_UNSTABLE
 #include "interfaces/efl_common_internal.h"
 
+#include "efl_gesture_events.eo.c"
+
 #include <Ecore.h>
 
-//private gesture classes
-#include "efl_canvas_gesture_recognizer_tap.eo.h"
-#include "efl_canvas_gesture_recognizer_long_tap.eo.h"
+void efl_gesture_manager_gesture_clean_up(Eo *obj, Eo *target, const Efl_Event_Description *type);
 
+typedef struct _Efl_Canvas_Gesture_Manager_Data                Efl_Canvas_Gesture_Manager_Data;
 typedef struct _Efl_Canvas_Gesture_Recognizer_Data             Efl_Canvas_Gesture_Recognizer_Data;
+typedef struct _Efl_Canvas_Gesture_Recognizer_Tap_Data         Efl_Canvas_Gesture_Recognizer_Tap_Data;
+typedef struct _Efl_Canvas_Gesture_Recognizer_Long_Tap_Data    Efl_Canvas_Gesture_Recognizer_Long_Tap_Data;
+typedef struct _Efl_Canvas_Gesture_Recognizer_Double_Tap_Data  Efl_Canvas_Gesture_Recognizer_Double_Tap_Data;
+typedef struct _Efl_Canvas_Gesture_Recognizer_Triple_Tap_Data  Efl_Canvas_Gesture_Recognizer_Triple_Tap_Data;
+typedef struct _Efl_Canvas_Gesture_Recognizer_Momentum_Data    Efl_Canvas_Gesture_Recognizer_Momentum_Data;
+typedef struct _Efl_Canvas_Gesture_Recognizer_Flick_Data       Efl_Canvas_Gesture_Recognizer_Flick_Data;
+typedef struct _Efl_Canvas_Gesture_Recognizer_Zoom_Data        Efl_Canvas_Gesture_Recognizer_Zoom_Data;
 typedef struct _Efl_Canvas_Gesture_Data                        Efl_Canvas_Gesture_Data;
-typedef struct _Efl_Canvas_Gesture_Tap_Data                    Efl_Canvas_Gesture_Tap_Data;
-typedef struct _Efl_Canvas_Gesture_Long_Tap_Data               Efl_Canvas_Gesture_Long_Tap_Data;
+typedef struct _Efl_Canvas_Gesture_Momentum_Data               Efl_Canvas_Gesture_Momentum_Data;
+typedef struct _Efl_Canvas_Gesture_Flick_Data                  Efl_Canvas_Gesture_Flick_Data;
+typedef struct _Efl_Canvas_Gesture_Zoom_Data                   Efl_Canvas_Gesture_Zoom_Data;
+
+typedef struct _Pointer_Data
+{
+   struct
+     {
+        Eina_Position2D pos;
+        unsigned int timestamp;
+     } start, prev, cur;
+   int id;
+   Efl_Pointer_Action action;
+} Pointer_Data;
+
+typedef struct _Efl_Canvas_Gesture_Touch_Data
+{
+   Efl_Canvas_Gesture_Touch_State state;
+   Eina_Hash              *touch_points;
+   int                     touch_down;
+   Eina_Bool               multi_touch;
+   Eo                     *target;
+} Efl_Canvas_Gesture_Touch_Data;
 
 struct _Efl_Canvas_Gesture_Recognizer_Data
 {
-   Eo *manager; // keeps a reference of the manager
+   Eo                            *manager; // keeps a reference of the manager
+   Eo                            *gesture;
+   int                            finger_size;
+   Eina_Bool                      continues;
+};
+
+struct _Efl_Canvas_Gesture_Recognizer_Tap_Data
+{
+   Eo                             *target;
+   Eo                             *gesture;
+   Ecore_Timer                    *timeout;
+};
+
+struct _Efl_Canvas_Gesture_Recognizer_Long_Tap_Data
+{
+   Eina_List                      *target_timeout;
+   Eo                             *target;
+   Efl_Canvas_Gesture             *gesture;
+   Ecore_Timer                    *timeout;
+   double                          start_timeout;
+   Eina_Bool                       is_timeout;
+};
+
+struct _Efl_Canvas_Gesture_Recognizer_Double_Tap_Data
+{
+   Eina_List                      *target_timeout;
+   Eo                             *target;
+   Eo                             *gesture;
+   Ecore_Timer                    *timeout;
+   double                          start_timeout;
+   Eina_Bool                       is_timeout;
+   int                             tap_count;
+};
+
+struct _Efl_Canvas_Gesture_Recognizer_Triple_Tap_Data
+{
+   Eina_List                      *target_timeout;
+   Eo                             *target;
+   Eo                             *gesture;
+   Ecore_Timer                    *timeout;
+   double                          start_timeout;
+   Eina_Bool                       is_timeout;
+   int                             tap_count;
+};
+
+struct _Efl_Canvas_Gesture_Recognizer_Momentum_Data
+{
+   Eina_Position2D                 st_line;
+   Eina_Position2D                 end_line;
+   unsigned int                    t_st;
+   unsigned int                    t_end;
+   int                             xdir;
+   int                             ydir;
+   Eina_Bool                       touched;
+};
+
+struct _Efl_Canvas_Gesture_Recognizer_Flick_Data
+{
+   Eina_Position2D                 st_line;
+   unsigned int                    t_st;
+   unsigned int                    t_end;
+   int                             line_length;
+   double                          line_angle;
+   Eina_Bool                       touched;
+};
+
+struct _Efl_Canvas_Gesture_Recognizer_Zoom_Data
+{
+   Pointer_Data                    zoom_st;
+   Pointer_Data                    zoom_st1;
+
+   Pointer_Data                    zoom_mv;
+   Pointer_Data                    zoom_mv1;
+
+   Evas_Coord                      zoom_base; /* Holds gap between fingers on
+                                                                          * zoom-start  */
+   double                          zoom_distance_tolerance;
+   double                          zoom_finger_factor;
+   double                          zoom_step;
+   double                          next_step;
+   Eina_Bool                       calc_temp;
 };
 
 struct _Efl_Canvas_Gesture_Data
 {
    const Efl_Event_Description    *type;
-   Efl_Canvas_Gesture_State               state;
-   Eina_Vector2                    hotspot;
+   Efl_Canvas_Gesture_State        state;
+   Eina_Position2D                 hotspot;
+   unsigned int                    timestamp;
+};
+
+struct _Efl_Canvas_Gesture_Momentum_Data
+{
+   Eina_Vector2                    momentum;
 };
 
-struct _Efl_Canvas_Gesture_Tap_Data
+struct _Efl_Canvas_Gesture_Flick_Data
 {
+   Eina_Vector2                    momentum;
+   double                          angle;
 };
 
-struct _Efl_Canvas_Gesture_Long_Tap_Data
+struct _Efl_Canvas_Gesture_Zoom_Data
 {
-   Ecore_Timer      *timeout;
-   Eina_Bool         is_timeout;
+   double                          radius;
+   double                          zoom;
 };
 
 #endif
index eac5f1c..8a83e2f 100644 (file)
@@ -2,6 +2,7 @@
 
 #define MY_CLASS EFL_CANVAS_GESTURE_RECOGNIZER_CLASS
 
+#define EFL_GESTURE_TAP_FINGER_SIZE 10
 EOLIAN static Eina_Value *
 _efl_canvas_gesture_recognizer_config_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Data *pd, const char *name)
 {
@@ -15,4 +16,13 @@ _efl_canvas_gesture_recognizer_reset(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Rec
 
 }
 
+EOLIAN static Efl_Object *
+_efl_canvas_gesture_recognizer_efl_object_constructor(Eo *obj, Efl_Canvas_Gesture_Recognizer_Data *pd)
+{
+   obj = efl_constructor(efl_super(obj, MY_CLASS));
+
+   pd->finger_size = EFL_GESTURE_TAP_FINGER_SIZE;
+
+   return obj;
+}
 #include "efl_canvas_gesture_recognizer.eo.c"
index 8574089..aaee7d2 100644 (file)
@@ -2,10 +2,18 @@ import efl_canvas_gesture_types;
 
 abstract @beta Efl.Canvas.Gesture_Recognizer extends Efl.Object
 {
-   [[EFL Gesture Recognizer abstract class]]
+   [[EFL Gesture Recognizer abstract class
+
+     The gesture recognizer class grabs events that occur on the target
+     object that user register to see if a particluar gesture has occurred.
+
+     Uesr can adjust the config value involved in gesture recognition
+     through the method provided by the gesture recognizer.
+
+     The default config values follow the system default config value.]]
    c_prefix: efl_gesture_recognizer;
    methods {
-      create @pure_virtual {
+      add @pure_virtual {
          [[This function is called to create a new Efl.Canvas.Gesture object for the given target]]
          params {
             @in target: Efl.Object; [[The target widget]]
@@ -44,4 +52,7 @@ abstract @beta Efl.Canvas.Gesture_Recognizer extends Efl.Object
          }
       }
    }
+   implements {
+      Efl.Object.constructor;
+   }
 }
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.c b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.c
new file mode 100644 (file)
index 0000000..1656bb6
--- /dev/null
@@ -0,0 +1,191 @@
+#include "efl_canvas_gesture_private.h"
+
+#define MY_CLASS EFL_CANVAS_GESTURE_RECOGNIZER_DOUBLE_TAP_CLASS
+
+#define TAP_TIME_OUT 0.33
+
+EOLIAN static Efl_Canvas_Gesture *
+_efl_canvas_gesture_recognizer_double_tap_efl_canvas_gesture_recognizer_add(Eo *obj, Efl_Canvas_Gesture_Recognizer_Double_Tap_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED)
+{
+   return efl_add(EFL_CANVAS_GESTURE_DOUBLE_TAP_CLASS, obj);
+}
+
+EOLIAN static void
+_efl_canvas_gesture_recognizer_double_tap_efl_object_destructor(Eo *obj,
+                                                                Efl_Canvas_Gesture_Recognizer_Double_Tap_Data *pd)
+{
+   if (pd->timeout)
+     ecore_timer_del(pd->timeout);
+
+   efl_destructor(efl_super(obj, MY_CLASS));
+}
+
+static Eina_Bool
+_tap_timeout_cb(void *data)
+{
+   Efl_Canvas_Gesture_Recognizer_Data *rd;
+   Efl_Canvas_Gesture_Recognizer_Double_Tap_Data *pd;
+
+   rd = efl_data_scope_get(data, EFL_CANVAS_GESTURE_RECOGNIZER_CLASS);
+   pd = efl_data_scope_get(data, EFL_CANVAS_GESTURE_RECOGNIZER_DOUBLE_TAP_CLASS);
+
+   efl_gesture_state_set(pd->gesture, EFL_GESTURE_CANCELED);
+   efl_event_callback_call(pd->target, EFL_EVENT_GESTURE_DOUBLE_TAP, pd->gesture);
+
+   efl_gesture_manager_gesture_clean_up(rd->manager, pd->target, EFL_EVENT_GESTURE_DOUBLE_TAP);
+
+   pd->timeout = NULL;
+   pd->tap_count = 0;
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+EOLIAN static Efl_Canvas_Gesture_Recognizer_Result
+_efl_canvas_gesture_recognizer_double_tap_efl_canvas_gesture_recognizer_recognize(Eo *obj,
+                                                                                  Efl_Canvas_Gesture_Recognizer_Double_Tap_Data *pd,
+                                                                                  Efl_Canvas_Gesture *gesture, Efl_Object *watched,
+                                                                                  Efl_Canvas_Gesture_Touch *event)
+{
+   double length;
+   double timeout = TAP_TIME_OUT;
+   Eina_Position2D pos;
+   Eina_Vector2 dist;
+   Efl_Canvas_Gesture_Recognizer_Result result = EFL_GESTURE_CANCEL;
+   Efl_Canvas_Gesture_Recognizer_Data *rd = efl_data_scope_get(obj, EFL_CANVAS_GESTURE_RECOGNIZER_CLASS);
+
+   pd->target = watched;
+   pd->gesture = gesture;
+
+   if (!pd->start_timeout)
+     {
+        double time;
+        Eina_Value *val =  efl_gesture_recognizer_config_get(obj, "glayer_doublee_tap_timeout");
+
+        if (val)
+          {
+             eina_value_get(val, &time);
+             pd->start_timeout = timeout = time;
+          }
+     }
+   else
+     timeout = pd->start_timeout;
+
+   switch (efl_gesture_touch_state_get(event))
+     {
+      case EFL_GESTURE_TOUCH_BEGIN:
+           {
+              pos = efl_gesture_touch_start_point_get(event);
+              efl_gesture_hotspot_set(gesture, pos);
+
+              if (pd->timeout)
+                ecore_timer_reset(pd->timeout);
+              else
+                pd->timeout = ecore_timer_add(timeout, _tap_timeout_cb, obj);
+
+              result = EFL_GESTURE_TRIGGER;
+
+              break;
+           }
+
+      case EFL_GESTURE_TOUCH_UPDATE:
+           {
+              result = EFL_GESTURE_IGNORE;
+
+              if (efl_gesture_state_get(gesture) != EFL_GESTURE_NONE &&
+                  !efl_gesture_touch_multi_touch_get(event))
+                {
+                   dist = efl_gesture_touch_distance(event, 0);
+                   length = fabs(dist.x) + fabs(dist.y);
+
+                   if (length > rd->finger_size)
+                     {
+                        if (pd->timeout)
+                          {
+                             ecore_timer_del(pd->timeout);
+                             pd->timeout = NULL;
+                          }
+
+                        result = EFL_GESTURE_CANCEL;
+
+                        pd->tap_count = 0;
+                     }
+                }
+
+              break;
+           }
+      case EFL_GESTURE_TOUCH_END:
+           {
+
+              if (efl_gesture_state_get(gesture) != EFL_GESTURE_NONE &&
+                  !efl_gesture_touch_multi_touch_get(event))
+                {
+                   dist = efl_gesture_touch_distance(event, 0);
+                   length = fabs(dist.x) + fabs(dist.y);
+
+                   if (length <= rd->finger_size)
+                     {
+                        pd->tap_count++;
+                        if (pd->tap_count == 1)
+                          {
+                             if (pd->timeout)
+                               ecore_timer_reset(pd->timeout);
+
+                             result = EFL_GESTURE_TRIGGER;
+                          }
+                        else
+                          {
+                             if (pd->timeout)
+                               {
+                                  ecore_timer_del(pd->timeout);
+                                  pd->timeout = NULL;
+                               }
+
+                             if (efl_gesture_touch_state_get(event) == EFL_GESTURE_TOUCH_END)
+                               result = EFL_GESTURE_FINISH;
+                             else
+                               result = EFL_GESTURE_TRIGGER;
+
+                             pd->tap_count = 0;
+                          }
+                     }
+                   else
+                     {
+                        if (pd->timeout)
+                          {
+                             ecore_timer_del(pd->timeout);
+                             pd->timeout = NULL;
+                          }
+
+                        result = EFL_GESTURE_CANCEL;
+
+                        pd->tap_count = 0;
+                     }
+                }
+
+              break;
+           }
+
+      default:
+
+        break;
+     }
+
+   return result;
+}
+
+EOLIAN static double
+_efl_canvas_gesture_recognizer_double_tap_timeout_get(const Eo *obj EINA_UNUSED,
+                                                      Efl_Canvas_Gesture_Recognizer_Double_Tap_Data *pd)
+{
+   return pd->start_timeout;
+}
+
+EOLIAN static void
+_efl_canvas_gesture_recognizer_double_tap_timeout_set(Eo *obj EINA_UNUSED,
+                                                      Efl_Canvas_Gesture_Recognizer_Double_Tap_Data *pd,
+                                                      double time)
+{
+   pd->start_timeout = time;
+}
+
+#include "efl_canvas_gesture_recognizer_double_tap.eo.c"
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.eo b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.eo
new file mode 100644 (file)
index 0000000..9f3ab0a
--- /dev/null
@@ -0,0 +1,22 @@
+class @beta Efl.Canvas.Gesture_Recognizer_Double_Tap extends Efl.Canvas.Gesture_Recognizer
+{
+   [[EFL Gesture Recognizer Double Tap class]]
+   c_prefix: efl_gesture_recognizer_double_tap;
+   methods {
+      @property timeout {
+         [[Sets the time between taps to be recognized as a double tap]]
+         set {
+         }
+         get {
+         }
+         values {
+            time: double; [[Allowed time gap value]]
+         }
+      }
+   }
+   implements {
+      Efl.Object.destructor;
+      Efl.Canvas.Gesture_Recognizer.add;
+      Efl.Canvas.Gesture_Recognizer.recognize;
+   }
+}
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c
new file mode 100644 (file)
index 0000000..4968c61
--- /dev/null
@@ -0,0 +1,354 @@
+#include "efl_canvas_gesture_private.h"
+
+#define MY_CLASS EFL_CANVAS_GESTURE_RECOGNIZER_FLICK_CLASS
+
+#define MOMENTUM_TIMEOUT 50
+#define THUMBSCROLL_FRICTION 0.95
+#define THUMBSCROLL_MOMENTUM_THRESHOLD 100.0
+#define EFL_GESTURE_MINIMUM_MOMENTUM 0.001
+
+#define RAD2DEG(x) ((x) * 57.295779513)
+#define DEG2RAD(x) ((x) / 57.295779513)
+
+EOLIAN static Efl_Canvas_Gesture *
+_efl_canvas_gesture_recognizer_flick_efl_canvas_gesture_recognizer_add(Eo *obj, Efl_Canvas_Gesture_Recognizer_Flick_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED)
+{
+   return efl_add(EFL_CANVAS_GESTURE_FLICK_CLASS, obj);
+}
+
+static void
+_momentum_set(Eo *obj,
+              Efl_Canvas_Gesture_Flick_Data *fd,
+              Eina_Position2D v1,
+              Eina_Position2D v2,
+              unsigned int t1,
+              unsigned int t2)
+{
+   Evas_Coord velx = 0, vely = 0, vel;
+   Evas_Coord dx = v2.x - v1.x;
+   Evas_Coord dy = v2.y - v1.y;
+   int dt = t2 - t1;
+   Eina_Value *tf, *tmt;
+   double thumbscroll_friction, thumbscroll_momentum_threshold;
+
+   if (dt > 0)
+     {
+        velx = (dx * 1000) / dt;
+        vely = (dy * 1000) / dt;
+     }
+
+   vel = sqrt((velx * velx) + (vely * vely));
+
+   tf = efl_gesture_recognizer_config_get(obj, "thumbscroll_friction");
+   if (tf) eina_value_get(tf, &thumbscroll_friction);
+   else thumbscroll_friction = THUMBSCROLL_FRICTION;
+
+   tmt = efl_gesture_recognizer_config_get(obj, "thumbscroll_momentum_threshold");
+   if (tmt) eina_value_get(tmt, &thumbscroll_momentum_threshold);
+   else thumbscroll_momentum_threshold = THUMBSCROLL_MOMENTUM_THRESHOLD;
+
+   if ((thumbscroll_friction > 0.0) &&
+       (vel > thumbscroll_momentum_threshold)) /* report
+                                                * momentum */
+     {
+        fd->momentum.x = velx;
+        fd->momentum.y = vely;
+     }
+   else
+     {
+        fd->momentum.x = 0;
+        fd->momentum.y = 0;
+     }
+}
+
+static void
+_single_line_process(Eo *obj,
+                     Efl_Canvas_Gesture_Recognizer_Flick_Data *pd,
+                     Efl_Canvas_Gesture *gesture,
+                     Efl_Canvas_Gesture_Flick_Data *fd,
+                     Efl_Canvas_Gesture_Touch *event)
+{
+   switch (efl_gesture_touch_state_get(event))
+     {
+       case EFL_GESTURE_TOUCH_BEGIN:
+       case EFL_GESTURE_TOUCH_UPDATE:
+         if (!pd->t_st)
+           {
+              pd->st_line = efl_gesture_touch_cur_point_get(event);
+              pd->t_st = efl_gesture_touch_cur_timestamp_get(event);
+
+              efl_gesture_hotspot_set(gesture, pd->st_line);
+
+              return;
+           }
+
+         break;
+
+       case EFL_GESTURE_TOUCH_END:
+         {
+            if (!pd->t_st) return;
+
+            pd->t_end = efl_gesture_touch_cur_timestamp_get(event);
+
+            break;
+         }
+
+       default:
+
+         return;
+     }
+
+   _momentum_set(obj, fd, pd->st_line, efl_gesture_touch_cur_point_get(event),
+                 pd->t_st, efl_gesture_touch_cur_timestamp_get(event));
+}
+
+static double
+_angle_get(Evas_Coord xx1,
+           Evas_Coord yy1,
+           Evas_Coord xx2,
+           Evas_Coord yy2)
+{
+   double a, xx, yy, rt = (-1);
+
+   xx = abs(xx2 - xx1);
+   yy = abs(yy2 - yy1);
+
+   if (((int)xx) && ((int)yy))
+     {
+        rt = a = RAD2DEG(atan(yy / xx));
+        if (xx1 < xx2)
+          {
+             if (yy1 < yy2) rt = 360 - a;
+             else rt = a;
+          }
+        else
+          {
+             if (yy1 < yy2) rt = 180 + a;
+             else rt = 180 - a;
+          }
+     }
+
+   if (rt < 0) /* Do this only if rt is not set */
+     {
+        if (((int)xx)) /* Horizontal line */
+          {
+             if (xx2 < xx1) rt = 180;
+             else rt = 0.0;
+          }
+        else
+          {  /* Vertical line */
+             if (yy2 < yy1) rt = 90;
+             else rt = 270;
+          }
+     }
+
+   /* Now we want to change from:
+    *                      90                   0
+    * original circle   180   0   We want:  270   90
+    *                     270                 180
+    */
+   rt = 450 - rt;
+   if (rt >= 360) rt -= 360;
+
+   return rt;
+}
+
+
+static void
+_vector_get(Eina_Position2D v1,
+            Eina_Position2D v2,
+            int *l,
+            double *a)
+{
+   int xx, yy;
+
+   xx = (int)(v2.x - v1.x);
+   yy = (int)(v2.y - v1.y);
+   *l = (int)sqrt((xx * xx) + (yy * yy));
+   *a = _angle_get((int)v1.x, (int)v1.y, (int)v2.x, (int)v2.y);
+}
+
+EOLIAN static Efl_Canvas_Gesture_Recognizer_Result
+_efl_canvas_gesture_recognizer_flick_efl_canvas_gesture_recognizer_recognize(Eo *obj,
+                                                                             Efl_Canvas_Gesture_Recognizer_Flick_Data *pd,
+                                                                             Efl_Canvas_Gesture *gesture, Efl_Object *watched,
+                                                                             Efl_Canvas_Gesture_Touch *event)
+{
+   double angle;
+   Eina_Value *val;
+   unsigned char glayer_continues_enable;
+   Efl_Canvas_Gesture_Recognizer_Result result = EFL_GESTURE_CANCEL;
+   Eina_Bool touch_up = EINA_FALSE;
+   Efl_Canvas_Gesture_Flick_Data *fd = efl_data_scope_get(gesture, EFL_CANVAS_GESTURE_FLICK_CLASS);
+   Efl_Canvas_Gesture_Recognizer_Data *rd = efl_data_scope_get(obj, EFL_CANVAS_GESTURE_RECOGNIZER_CLASS);
+
+   val = efl_gesture_recognizer_config_get(obj, "glayer_continues_enable");
+   if (val) eina_value_get(val, &glayer_continues_enable);
+   else glayer_continues_enable = 1;
+
+   //We need to cover events that occur continuously in the mouse down state
+   //without mouse up.
+   //Recognizing the gesture again, even though it was canceled during gesture
+   //recognition.
+   if (efl_gesture_state_get(gesture) == EFL_GESTURE_CANCELED)
+     efl_gesture_state_set(gesture, EFL_GESTURE_NONE);
+
+   if (efl_gesture_touch_state_get(event) == EFL_GESTURE_TOUCH_END)
+     touch_up = EINA_TRUE;
+
+   //This is to handle a case with a mouse click on the target object.
+   if (efl_gesture_touch_state_get(event) == EFL_GESTURE_TOUCH_END && !pd->touched)
+     efl_gesture_manager_gesture_clean_up(rd->manager, watched, EFL_EVENT_GESTURE_FLICK);
+
+   if (glayer_continues_enable && !pd->touched)
+     {
+       pd->touched = EINA_TRUE;
+       pd->line_angle = -1.0;
+       rd->continues = EINA_TRUE;
+
+       return EFL_GESTURE_IGNORE;
+     }
+
+   _single_line_process(obj, pd, gesture, fd, event);
+   _vector_get(pd->st_line, efl_gesture_touch_cur_point_get(event),
+               &pd->line_length, &angle);
+
+   if (pd->t_st)
+     {
+        if (pd->line_angle >= 0.0)
+          {
+             double line_distance_tolerance, line_angular_tolerance;
+             double a = fabs(angle - pd->line_angle);
+             double d = (tan(DEG2RAD(a))) * pd->line_length;
+
+             val = efl_gesture_recognizer_config_get(obj, "glayer_line_distance_tolerance");
+             if (val) eina_value_get(val, &line_distance_tolerance);
+             else line_distance_tolerance = 3.0;
+
+             line_distance_tolerance *= rd->finger_size;
+
+             val = efl_gesture_recognizer_config_get(obj, "glayer_line_angular_tolerance");
+             if (val) eina_value_get(val, &line_angular_tolerance);
+             else line_angular_tolerance = 20.0;
+
+             if ((d > line_distance_tolerance) ||
+                 (a > line_angular_tolerance))
+               {
+                  memset(pd, 0, sizeof(Efl_Canvas_Gesture_Recognizer_Flick_Data));
+
+                  if (touch_up) rd->continues = EINA_FALSE;
+
+                  return EFL_GESTURE_CANCEL;
+               }
+
+             /* We may finish line if momentum is zero */
+             if (glayer_continues_enable)
+               {
+                  /* This is for continues-gesture */
+                  /* Finish line on zero momentum for continues gesture */
+                  if ((!fd->momentum.x) && (!fd->momentum.y))
+                    pd->t_end = efl_gesture_touch_cur_timestamp_get(event);
+               }
+          }
+        else
+          {
+             double line_min_length;
+
+             val = efl_gesture_recognizer_config_get(obj, "glayer_line_min_length");
+             if (val) eina_value_get(val, &line_min_length);
+             else line_min_length = 1.0;
+
+             line_min_length *= rd->finger_size;
+
+             if (pd->line_length >= line_min_length)
+               fd->angle = pd->line_angle = angle;
+
+          }
+
+        if (pd->t_end)
+          {
+             if (pd->line_angle < 0.0)
+               {
+                  memset(pd, 0, sizeof(Efl_Canvas_Gesture_Recognizer_Flick_Data));
+
+                  if (touch_up) rd->continues = EINA_FALSE;
+
+                  return EFL_GESTURE_CANCEL;
+               }
+          }
+     }
+
+   unsigned int tm_end = efl_gesture_touch_cur_timestamp_get(event);
+   if (pd->t_end)
+     {
+        if (pd->t_end < tm_end)
+          tm_end = pd->t_end;
+     }
+
+   unsigned int time_limit_ms;
+   val = efl_gesture_recognizer_config_get(obj, "glayer_flick_time_limit_ms");
+   if (val) eina_value_get(val, &time_limit_ms);
+   else time_limit_ms = 120;
+
+   if ((tm_end - pd->t_st) > time_limit_ms)
+   {
+     memset(pd, 0, sizeof(Efl_Canvas_Gesture_Recognizer_Flick_Data));
+
+     if (touch_up) rd->continues = EINA_FALSE;
+
+     return EFL_GESTURE_CANCEL;
+   }
+
+   switch (efl_gesture_touch_state_get(event))
+     {
+      case EFL_GESTURE_TOUCH_BEGIN:
+      case EFL_GESTURE_TOUCH_UPDATE:
+        {
+           if (pd->t_st)
+             {
+                if (glayer_continues_enable && pd->t_end)
+                  {
+                     result = EFL_GESTURE_FINISH;
+                  }
+                else
+                  {
+                     result = EFL_GESTURE_TRIGGER;
+                  }
+             }
+           break;
+        }
+
+      case EFL_GESTURE_TOUCH_END:
+        {
+           if (!pd->t_st)
+             {
+                pd->touched = EINA_FALSE;
+                rd->continues = EINA_FALSE;
+
+                return EFL_GESTURE_CANCEL;
+             }
+           if (pd->t_st && pd->t_end)
+             {
+                rd->continues = EINA_FALSE;
+
+                result = EFL_GESTURE_FINISH;
+             }
+
+           efl_gesture_hotspot_set(gesture, efl_gesture_touch_cur_point_get(event));
+
+           memset(pd, 0, sizeof(Efl_Canvas_Gesture_Recognizer_Flick_Data));
+
+                  rd->continues = EINA_FALSE;
+
+           break;
+        }
+
+      default:
+
+        break;
+     }
+
+   return result;
+}
+
+#include "efl_canvas_gesture_recognizer_flick.eo.c"
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.eo b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.eo
new file mode 100644 (file)
index 0000000..c7103ad
--- /dev/null
@@ -0,0 +1,9 @@
+class @beta Efl.Canvas.Gesture_Recognizer_Flick extends Efl.Canvas.Gesture_Recognizer
+{
+   [[EFL Gesture Recognizer Flick Class]]
+   c_prefix: efl_gesture_recognizer_flick;
+   implements {
+      Efl.Canvas.Gesture_Recognizer.add;
+      Efl.Canvas.Gesture_Recognizer.recognize;
+   }
+}
index 9f5463c..8f67735 100644 (file)
@@ -2,36 +2,71 @@
 
 #define MY_CLASS EFL_CANVAS_GESTURE_RECOGNIZER_LONG_TAP_CLASS
 
-#define LONG_TAP_TIME_OUT 0.2
+#define EFL_GESTURE_LONG_TAP_TIME_OUT 1.2
 
 EOLIAN static Efl_Canvas_Gesture *
-_efl_canvas_gesture_recognizer_long_tap_efl_canvas_gesture_recognizer_create(Eo *obj, void *pd EINA_UNUSED,
-                                                               Efl_Object *target EINA_UNUSED)
+_efl_canvas_gesture_recognizer_long_tap_efl_canvas_gesture_recognizer_add(Eo *obj,
+                                                                          Efl_Canvas_Gesture_Recognizer_Long_Tap_Data *pd EINA_UNUSED,
+                                                                          Efl_Object *target EINA_UNUSED)
 {
    return efl_add(EFL_CANVAS_GESTURE_LONG_TAP_CLASS, obj);
 }
 
+EOLIAN static void
+_efl_canvas_gesture_recognizer_long_tap_efl_object_destructor(Eo *obj,
+                                                              Efl_Canvas_Gesture_Recognizer_Long_Tap_Data *pd)
+{
+   if (pd->timeout)
+     ecore_timer_del(pd->timeout);
+
+   efl_destructor(efl_super(obj, MY_CLASS));
+}
+
 static Eina_Bool
 _long_tap_timeout_cb(void *data)
 {
-   Efl_Canvas_Gesture_Long_Tap_Data *ltp = data;
+   Efl_Canvas_Gesture_Recognizer_Long_Tap_Data *pd = data;
 
    /* FIXME: Needs to propagate this event back to evas! */
-   ltp->is_timeout = EINA_TRUE;
+   pd->is_timeout = EINA_TRUE;
+
+   efl_gesture_state_set(pd->gesture, EFL_GESTURE_UPDATED);
+   efl_event_callback_call(pd->target, EFL_EVENT_GESTURE_LONG_TAP, pd->gesture);
 
    return ECORE_CALLBACK_RENEW;
 }
 
 EOLIAN static Efl_Canvas_Gesture_Recognizer_Result
-_efl_canvas_gesture_recognizer_long_tap_efl_canvas_gesture_recognizer_recognize(Eo *obj EINA_UNUSED,
-                                                                  void *pd EINA_UNUSED,
-                                                                  Efl_Canvas_Gesture *gesture, Efl_Object *watched EINA_UNUSED,
-                                                                  Efl_Canvas_Gesture_Touch *event)
+_efl_canvas_gesture_recognizer_long_tap_efl_canvas_gesture_recognizer_recognize(Eo *obj,
+                                                                                Efl_Canvas_Gesture_Recognizer_Long_Tap_Data *pd,
+                                                                                Efl_Canvas_Gesture *gesture,
+                                                                                Efl_Object *watched,
+                                                                                Efl_Canvas_Gesture_Touch *event)
 {
    double length; // Manhattan distance
-   Eina_Vector2 pos, dist;
+   double timeout = EFL_GESTURE_LONG_TAP_TIME_OUT;
+   Eina_Position2D pos;
+   Eina_Vector2 dist;
    Efl_Canvas_Gesture_Recognizer_Result result = EFL_GESTURE_CANCEL;
-   Efl_Canvas_Gesture_Long_Tap_Data *ltp = efl_data_scope_get(gesture, EFL_CANVAS_GESTURE_LONG_TAP_CLASS);
+   Efl_Canvas_Gesture_Recognizer_Data *rd = efl_data_scope_get(obj, EFL_CANVAS_GESTURE_RECOGNIZER_CLASS);
+
+   pd->target = watched;
+   pd->gesture = gesture;
+
+   if (!pd->start_timeout)
+     {
+        double time;
+        Eina_Value *val =  efl_gesture_recognizer_config_get(obj, "glayer_long_tap_start_timeout");
+
+        if (val)
+          {
+             eina_value_get(val, &time);
+             pd->start_timeout = timeout = time;
+          }
+     }
+   else
+     timeout = pd->start_timeout;
+
 
    switch (efl_gesture_touch_state_get(event))
      {
@@ -39,49 +74,56 @@ _efl_canvas_gesture_recognizer_long_tap_efl_canvas_gesture_recognizer_recognize(
         {
            pos = efl_gesture_touch_start_point_get(event);
            efl_gesture_hotspot_set(gesture, pos);
-           if (ltp->timeout)
-             ecore_timer_del(ltp->timeout);
-           ltp->timeout = ecore_timer_add(LONG_TAP_TIME_OUT,
-                                          _long_tap_timeout_cb, ltp);
-           result = EFL_GESTURE_MAYBE;
+
+           if (pd->timeout)
+             {
+                ecore_timer_del(pd->timeout);
+             }
+           pd->timeout = ecore_timer_add(timeout,
+                                         _long_tap_timeout_cb, pd);
+
+           result = EFL_GESTURE_TRIGGER;
+
            break;
         }
+
       case EFL_GESTURE_TOUCH_UPDATE:
         {
-           if (!efl_gesture_touch_multi_touch_get(event))
+           dist = efl_gesture_touch_distance(event, 0);
+           length = fabs(dist.x) + fabs(dist.y);
+
+           if ((efl_gesture_touch_multi_touch_get(event)) || (length > rd->finger_size))
              {
-                dist = efl_gesture_touch_distance(event, 0);
-                length = fabs(dist.x) + fabs(dist.y);
-                if (length <= 50) // FIXME config!
-                  {
-                     if (ltp->is_timeout)
-                       {
-                          ltp->is_timeout = EINA_FALSE;
-                          result = EFL_GESTURE_TRIGGER;
-                       }
-                     else
-                       {
-                          result = EFL_GESTURE_MAYBE;
-                       }
-                  }
-                else
+                if (pd->timeout)
                   {
-                     result = EFL_GESTURE_CANCEL;
+                     ecore_timer_del(pd->timeout);
+                     pd->timeout = NULL;
                   }
+
+                result = EFL_GESTURE_CANCEL;
              }
+           else
+             {
+                result = EFL_GESTURE_MAYBE;
+             }
+
            break;
         }
+
       case EFL_GESTURE_TOUCH_END:
         {
-           if (ltp->timeout)
-             ecore_timer_del(ltp->timeout);
-           ltp->timeout = NULL;
+           if (pd->timeout)
+             {
+                ecore_timer_del(pd->timeout);
+                pd->timeout = NULL;
+             }
+
            if (efl_gesture_state_get(gesture) != EFL_GESTURE_NONE &&
                !efl_gesture_touch_multi_touch_get(event))
              {
                 dist = efl_gesture_touch_distance(event, 0);
                 length = fabs(dist.x) + fabs(dist.y);
-                if (length <= 50 && ltp->is_timeout) // FIXME config!
+                if (length <= rd->finger_size && pd->is_timeout)
                   {
                      result = EFL_GESTURE_FINISH;
                   }
@@ -90,26 +132,45 @@ _efl_canvas_gesture_recognizer_long_tap_efl_canvas_gesture_recognizer_recognize(
                      result = EFL_GESTURE_CANCEL;
                   }
              }
+
            break;
         }
+
       default:
+
         break;
      }
+
    return result;
 }
 
 EOLIAN static void
 _efl_canvas_gesture_recognizer_long_tap_efl_canvas_gesture_recognizer_reset(Eo *obj,
-                                                              void *pd EINA_UNUSED,
-                                                              Efl_Canvas_Gesture *gesture)
+                                                                            Efl_Canvas_Gesture_Recognizer_Long_Tap_Data *pd,
+                                                                            Efl_Canvas_Gesture *gesture)
 {
-   Efl_Canvas_Gesture_Long_Tap_Data *ltp;
-   ltp = efl_data_scope_get(gesture, EFL_CANVAS_GESTURE_LONG_TAP_CLASS);
-   if (ltp->timeout)
-     ecore_timer_del(ltp->timeout);
-   ltp->timeout = NULL;
-   ltp->is_timeout = EINA_FALSE;
+   if (pd->timeout)
+     {
+        ecore_timer_del(pd->timeout);
+        pd->timeout = NULL;
+     }
+   pd->is_timeout = EINA_FALSE;
    efl_gesture_recognizer_reset(efl_super(obj, MY_CLASS), gesture);
 }
 
+EOLIAN static double
+_efl_canvas_gesture_recognizer_long_tap_timeout_get(const Eo *obj EINA_UNUSED,
+                                                    Efl_Canvas_Gesture_Recognizer_Long_Tap_Data *pd)
+{
+   return pd->start_timeout;
+}
+
+EOLIAN static void
+_efl_canvas_gesture_recognizer_long_tap_timeout_set(Eo *obj EINA_UNUSED,
+                                                    Efl_Canvas_Gesture_Recognizer_Long_Tap_Data *pd,
+                                                    double time)
+{
+   pd->start_timeout = time;
+}
+
 #include "efl_canvas_gesture_recognizer_long_tap.eo.c"
index 8094655..7c8df2c 100644 (file)
@@ -1,10 +1,22 @@
 class @beta Efl.Canvas.Gesture_Recognizer_Long_Tap extends Efl.Canvas.Gesture_Recognizer
 {
    [[EFL Gesture Recognizer Long Tap class]]
-   data: null;
    c_prefix: efl_gesture_recognizer_long_tap;
+   methods {
+      @property timeout {
+         [[Sets the holding time to be recognized as a long tap.]]
+         set {
+         }
+         get {
+         }
+         values {
+            time: double; [[Allowed time gap value]]
+         }
+      }
+   }
    implements {
-      Efl.Canvas.Gesture_Recognizer.create;
+      Efl.Object.destructor;
+      Efl.Canvas.Gesture_Recognizer.add;
       Efl.Canvas.Gesture_Recognizer.recognize;
       Efl.Canvas.Gesture_Recognizer.reset;
    }
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_momentum.c b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_momentum.c
new file mode 100644 (file)
index 0000000..34c9030
--- /dev/null
@@ -0,0 +1,197 @@
+#include "efl_canvas_gesture_private.h"
+
+#define MY_CLASS EFL_CANVAS_GESTURE_RECOGNIZER_MOMENTUM_CLASS
+
+#define MOMENTUM_TIMEOUT 50
+#define THUMBSCROLL_FRICTION 0.95
+#define THUMBSCROLL_MOMENTUM_THRESHOLD 100.0
+#define EFL_GESTURE_MINIMUM_MOMENTUM 0.001
+
+EOLIAN static Efl_Canvas_Gesture *
+_efl_canvas_gesture_recognizer_momentum_efl_canvas_gesture_recognizer_add(Eo *obj, Efl_Canvas_Gesture_Recognizer_Momentum_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED)
+{
+   return efl_add(EFL_CANVAS_GESTURE_MOMENTUM_CLASS, obj);
+}
+
+static void
+_momentum_set(Eo *obj,
+              Efl_Canvas_Gesture_Momentum_Data *md,
+              Eina_Position2D v1,
+              Eina_Position2D v2,
+              unsigned int t1,
+              unsigned int t2)
+{
+   Evas_Coord velx = 0, vely = 0, vel;
+   Evas_Coord dx = v2.x - v1.x;
+   Evas_Coord dy = v2.y - v1.y;
+   int dt = t2 - t1;
+   Eina_Value *tf, *tmt;
+   double thumbscroll_friction, thumbscroll_momentum_threshold;
+
+   if (dt > 0)
+     {
+        velx = (dx * 1000) / dt;
+        vely = (dy * 1000) / dt;
+        }
+
+   vel = sqrt((velx * velx) + (vely * vely));
+
+   tf = efl_gesture_recognizer_config_get(obj, "thumbscroll_friction");
+   if (tf) eina_value_get(tf, &thumbscroll_friction);
+   else thumbscroll_friction = THUMBSCROLL_FRICTION;
+
+   tmt = efl_gesture_recognizer_config_get(obj, "thumbscroll_momentum_threshold");
+   if (tmt) eina_value_get(tmt, &thumbscroll_momentum_threshold);
+   else thumbscroll_momentum_threshold = THUMBSCROLL_MOMENTUM_THRESHOLD;
+
+   if ((thumbscroll_friction > 0.0) &&
+       (vel > thumbscroll_momentum_threshold)) /* report
+                                                * momentum */
+     {
+        md->momentum.x = velx;
+        md->momentum.y = vely;
+     }
+   else
+     {
+        md->momentum.x = 0;
+        md->momentum.y = 0;
+     }
+}
+
+static int
+_direction_get(Evas_Coord xx1,
+               Evas_Coord xx2)
+{
+   if (xx2 < xx1) return -1;
+   if (xx2 > xx1) return 1;
+
+   return 0;
+}
+
+EOLIAN static Efl_Canvas_Gesture_Recognizer_Result
+_efl_canvas_gesture_recognizer_momentum_efl_canvas_gesture_recognizer_recognize(Eo *obj,
+                                                                                  Efl_Canvas_Gesture_Recognizer_Momentum_Data *pd,
+                                                                                  Efl_Canvas_Gesture *gesture, Efl_Object *watched EINA_UNUSED,
+                                                                                  Efl_Canvas_Gesture_Touch *event)
+{
+   Eina_Value *val;
+   unsigned char glayer_continues_enable;
+   Efl_Canvas_Gesture_Recognizer_Result result = EFL_GESTURE_CANCEL;
+   Efl_Canvas_Gesture_Momentum_Data *md = efl_data_scope_get(gesture, EFL_CANVAS_GESTURE_MOMENTUM_CLASS);
+
+   val = efl_gesture_recognizer_config_get(obj, "glayer_continues_enable");
+   if (val) eina_value_get(val, &glayer_continues_enable);
+   else glayer_continues_enable = 1;
+
+   //Check the touched to ignore very first event.
+   //It does not have any meanging of this gesture.
+   if (glayer_continues_enable && !pd->touched)
+     {
+       pd->touched = EINA_TRUE;
+
+          return EFL_GESTURE_IGNORE;
+        }
+
+   switch (efl_gesture_touch_state_get(event))
+     {
+      case EFL_GESTURE_TOUCH_BEGIN:
+      case EFL_GESTURE_TOUCH_UPDATE:
+        {
+           if (!pd->t_st)
+             {
+                if (efl_gesture_touch_state_get(event) == EFL_GESTURE_TOUCH_BEGIN ||
+                    glayer_continues_enable)
+                  {
+                     pd->t_st = pd->t_end =  efl_gesture_touch_cur_timestamp_get(event);
+
+                     pd->st_line = pd->end_line =
+                        efl_gesture_touch_start_point_get(event);
+
+                     efl_gesture_hotspot_set(gesture, pd->st_line);
+
+                     return EFL_GESTURE_TRIGGER;
+                  }
+             }
+
+           if ((efl_gesture_touch_cur_timestamp_get(event) - MOMENTUM_TIMEOUT) >
+               pd->t_end)
+             {
+                pd->st_line = efl_gesture_touch_cur_point_get(event);
+                               pd->t_st = efl_gesture_touch_cur_timestamp_get(event);
+                               pd->xdir = pd->ydir = 0;
+                        }
+                  else
+                    {
+                int xdir, ydir;
+                Eina_Position2D cur_p = efl_gesture_touch_cur_point_get(event);
+
+                xdir = _direction_get(pd->end_line.x, cur_p.x);
+                ydir = _direction_get(pd->end_line.y, cur_p.y);
+
+                if (xdir && (xdir != pd->xdir))
+                  {
+                     pd->st_line.x = pd->end_line.x;
+                                        pd->t_st = pd->t_end;
+                     pd->xdir = xdir;
+                  }
+
+                if (ydir && (ydir != pd->ydir))
+                  {
+                     pd->st_line.y = pd->end_line.y;
+                                        pd->t_st = pd->t_end;
+                     pd->ydir = ydir;
+                  }
+             }
+
+           pd->end_line = efl_gesture_touch_cur_point_get(event);
+                  pd->t_end = efl_gesture_touch_cur_timestamp_get(event);
+           efl_gesture_hotspot_set(gesture, pd->end_line);
+
+           _momentum_set(obj, md, pd->st_line, efl_gesture_touch_cur_point_get(event),
+                         pd->t_st, efl_gesture_touch_cur_timestamp_get(event));
+
+           result = EFL_GESTURE_TRIGGER;
+
+           break;
+        }
+
+      case EFL_GESTURE_TOUCH_END:
+        {
+           if (!pd->t_st)
+             {
+                pd->touched = EINA_FALSE;
+
+                return EFL_GESTURE_CANCEL;
+             }
+
+           if ((efl_gesture_touch_cur_timestamp_get(event) - MOMENTUM_TIMEOUT) > pd->t_end)
+             {
+                pd->st_line = efl_gesture_touch_cur_point_get(event);
+                pd->t_st = efl_gesture_touch_cur_timestamp_get(event);
+                pd->xdir = pd->ydir = 0;
+             }
+
+           pd->end_line = efl_gesture_touch_cur_point_get(event);
+                  pd->t_end = efl_gesture_touch_cur_timestamp_get(event);
+           efl_gesture_hotspot_set(gesture, pd->end_line);
+
+           if ((abs(md->momentum.x) > EFL_GESTURE_MINIMUM_MOMENTUM) ||
+               (abs(md->momentum.y) > EFL_GESTURE_MINIMUM_MOMENTUM))
+                result = EFL_GESTURE_FINISH;
+           else
+                result = EFL_GESTURE_CANCEL;
+
+           memset(pd, 0, sizeof(Efl_Canvas_Gesture_Recognizer_Momentum_Data));
+
+                  break;
+        }
+
+      default:
+
+        break;
+     }
+
+   return result;
+}
+
+#include "efl_canvas_gesture_recognizer_momentum.eo.c"
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_momentum.eo b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_momentum.eo
new file mode 100644 (file)
index 0000000..1ae250d
--- /dev/null
@@ -0,0 +1,9 @@
+class @beta Efl.Canvas.Gesture_Recognizer_Momentum extends Efl.Canvas.Gesture_Recognizer
+{
+   [[EFL Gesture Recognizer Momentum class]]
+   c_prefix: efl_gesture_recognizer_momentum;
+   implements {
+      Efl.Canvas.Gesture_Recognizer.add;
+      Efl.Canvas.Gesture_Recognizer.recognize;
+   }
+}
index 2e4a5a6..8f53a05 100644 (file)
@@ -2,22 +2,45 @@
 
 #define MY_CLASS EFL_CANVAS_GESTURE_RECOGNIZER_TAP_CLASS
 
+//FIXME: It doesnt have matched config value.
+//       may using dobule tap timeout value?
+#define EFL_GESTURE_TAP_TIME_OUT 0.33
+
 EOLIAN static Efl_Canvas_Gesture *
-_efl_canvas_gesture_recognizer_tap_efl_canvas_gesture_recognizer_create(Eo *obj, void *pd EINA_UNUSED,
-                                                          Efl_Object *target EINA_UNUSED)
+_efl_canvas_gesture_recognizer_tap_efl_canvas_gesture_recognizer_add(Eo *obj,
+                                                                     Efl_Canvas_Gesture_Recognizer_Tap_Data *pd EINA_UNUSED,
+                                                                     Efl_Object *target EINA_UNUSED)
 {
    return efl_add(EFL_CANVAS_GESTURE_TAP_CLASS, obj);
 }
 
+static Eina_Bool
+_tap_timeout_cb(void *data)
+{
+   Efl_Canvas_Gesture_Recognizer_Tap_Data *pd = data;
+
+   efl_gesture_state_set(pd->gesture, EFL_GESTURE_CANCELED);
+   efl_event_callback_call(pd->target, EFL_EVENT_GESTURE_TAP, pd->gesture);
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+
 EOLIAN static Efl_Canvas_Gesture_Recognizer_Result
-_efl_canvas_gesture_recognizer_tap_efl_canvas_gesture_recognizer_recognize(Eo *obj EINA_UNUSED,
-                                                             void *pd EINA_UNUSED,
-                                                             Efl_Canvas_Gesture *gesture, Efl_Object *watched EINA_UNUSED,
-                                                             Efl_Canvas_Gesture_Touch *event EINA_UNUSED)
+_efl_canvas_gesture_recognizer_tap_efl_canvas_gesture_recognizer_recognize(Eo *obj,
+                                                                           Efl_Canvas_Gesture_Recognizer_Tap_Data *pd,
+                                                                           Efl_Canvas_Gesture *gesture,
+                                                                           Efl_Object *watched,
+                                                                           Efl_Canvas_Gesture_Touch *event)
 {
    double length;
-   Eina_Vector2 pos, dist;
+   Eina_Position2D pos;
+   Eina_Vector2 dist;
    Efl_Canvas_Gesture_Recognizer_Result result = EFL_GESTURE_CANCEL;
+   Efl_Canvas_Gesture_Recognizer_Data *rd = efl_data_scope_get(obj, EFL_CANVAS_GESTURE_RECOGNIZER_CLASS);
+
+   pd->target = watched;
+   pd->gesture = gesture;
 
    switch (efl_gesture_touch_state_get(event))
      {
@@ -25,18 +48,31 @@ _efl_canvas_gesture_recognizer_tap_efl_canvas_gesture_recognizer_recognize(Eo *o
         {
            pos = efl_gesture_touch_start_point_get(event);
            efl_gesture_hotspot_set(gesture, pos);
+
+           if (pd->timeout)
+             ecore_timer_del(pd->timeout);
+           pd->timeout = ecore_timer_add(EFL_GESTURE_TAP_TIME_OUT, _tap_timeout_cb, pd);
+
            result = EFL_GESTURE_TRIGGER;
+
            break;
         }
+
       case EFL_GESTURE_TOUCH_UPDATE:
       case EFL_GESTURE_TOUCH_END:
         {
+           if (pd->timeout)
+             {
+                ecore_timer_del(pd->timeout);
+                pd->timeout = NULL;
+             }
+
            if (efl_gesture_state_get(gesture) != EFL_GESTURE_NONE &&
                !efl_gesture_touch_multi_touch_get(event))
              {
                 dist = efl_gesture_touch_distance(event, 0);
                 length = fabs(dist.x) + fabs(dist.y);
-                if (length <= 50) // FIXME config!
+                if (length <= rd->finger_size)
                   {
                      if (efl_gesture_touch_state_get(event) == EFL_GESTURE_TOUCH_END)
                        result = EFL_GESTURE_FINISH;
@@ -44,11 +80,15 @@ _efl_canvas_gesture_recognizer_tap_efl_canvas_gesture_recognizer_recognize(Eo *o
                        result = EFL_GESTURE_TRIGGER;
                   }
              }
+
            break;
         }
+
       default:
+
         break;
      }
+
    return result;
 }
 
index 65ae8c0..d7aabc7 100644 (file)
@@ -1,10 +1,9 @@
 class @beta Efl.Canvas.Gesture_Recognizer_Tap extends Efl.Canvas.Gesture_Recognizer
 {
    [[EFL Gesture Recognizer Tap class]]
-   data: null;
    c_prefix: efl_gesture_recognizer_tap;
    implements {
-      Efl.Canvas.Gesture_Recognizer.create;
+      Efl.Canvas.Gesture_Recognizer.add;
       Efl.Canvas.Gesture_Recognizer.recognize;
    }
 }
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c
new file mode 100644 (file)
index 0000000..cd54d45
--- /dev/null
@@ -0,0 +1,191 @@
+#include "efl_canvas_gesture_private.h"
+
+#define MY_CLASS EFL_CANVAS_GESTURE_RECOGNIZER_TRIPLE_TAP_CLASS
+
+#define TAP_TIME_OUT 0.33
+
+EOLIAN static Efl_Canvas_Gesture *
+_efl_canvas_gesture_recognizer_triple_tap_efl_canvas_gesture_recognizer_add(Eo *obj, Efl_Canvas_Gesture_Recognizer_Triple_Tap_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED)
+{
+   return efl_add(EFL_CANVAS_GESTURE_TRIPLE_TAP_CLASS, obj);
+}
+
+EOLIAN static void
+_efl_canvas_gesture_recognizer_triple_tap_efl_object_destructor(Eo *obj,
+                                                                Efl_Canvas_Gesture_Recognizer_Triple_Tap_Data *pd)
+{
+   if (pd->timeout)
+     ecore_timer_del(pd->timeout);
+
+   efl_destructor(efl_super(obj, MY_CLASS));
+}
+
+static Eina_Bool
+_tap_timeout_cb(void *data)
+{
+   Efl_Canvas_Gesture_Recognizer_Data *rd;
+   Efl_Canvas_Gesture_Recognizer_Triple_Tap_Data *pd;
+
+   rd = efl_data_scope_get(data, EFL_CANVAS_GESTURE_RECOGNIZER_CLASS);
+   pd = efl_data_scope_get(data, EFL_CANVAS_GESTURE_RECOGNIZER_TRIPLE_TAP_CLASS);
+
+   efl_gesture_state_set(pd->gesture, EFL_GESTURE_CANCELED);
+   efl_event_callback_call(pd->target, EFL_EVENT_GESTURE_TRIPLE_TAP, pd->gesture);
+
+   efl_gesture_manager_gesture_clean_up(rd->manager, pd->target, EFL_EVENT_GESTURE_TRIPLE_TAP);
+
+   pd->timeout = NULL;
+   pd->tap_count = 0;
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+EOLIAN static Efl_Canvas_Gesture_Recognizer_Result
+_efl_canvas_gesture_recognizer_triple_tap_efl_canvas_gesture_recognizer_recognize(Eo *obj,
+                                                                                  Efl_Canvas_Gesture_Recognizer_Triple_Tap_Data *pd,
+                                                                                  Efl_Canvas_Gesture *gesture, Efl_Object *watched,
+                                                                                  Efl_Canvas_Gesture_Touch *event)
+{
+   double length;
+   double timeout = TAP_TIME_OUT;
+   Eina_Position2D pos;
+   Eina_Vector2 dist;
+   Efl_Canvas_Gesture_Recognizer_Result result = EFL_GESTURE_CANCEL;
+   Efl_Canvas_Gesture_Recognizer_Data *rd = efl_data_scope_get(obj, EFL_CANVAS_GESTURE_RECOGNIZER_CLASS);
+
+   pd->target = watched;
+   pd->gesture = gesture;
+
+   if (!pd->start_timeout)
+     {
+        double time;
+        Eina_Value *val =  efl_gesture_recognizer_config_get(obj, "glayer_doublee_tap_timeout");
+
+        if (val)
+          {
+             eina_value_get(val, &time);
+             pd->start_timeout = timeout = time;
+          }
+     }
+   else
+     timeout = pd->start_timeout;
+
+   switch (efl_gesture_touch_state_get(event))
+     {
+      case EFL_GESTURE_TOUCH_BEGIN:
+           {
+              pos = efl_gesture_touch_start_point_get(event);
+              efl_gesture_hotspot_set(gesture, pos);
+
+              if (pd->timeout)
+                ecore_timer_reset(pd->timeout);
+              else
+                pd->timeout = ecore_timer_add(timeout, _tap_timeout_cb, obj);
+
+              result = EFL_GESTURE_TRIGGER;
+
+              break;
+           }
+
+      case EFL_GESTURE_TOUCH_UPDATE:
+           {
+              result = EFL_GESTURE_IGNORE;
+
+              if (efl_gesture_state_get(gesture) != EFL_GESTURE_NONE &&
+                  !efl_gesture_touch_multi_touch_get(event))
+                {
+                   dist = efl_gesture_touch_distance(event, 0);
+                   length = fabs(dist.x) + fabs(dist.y);
+
+                   if (length > rd->finger_size)
+                     {
+                        if (pd->timeout)
+                          {
+                             ecore_timer_del(pd->timeout);
+                             pd->timeout = NULL;
+                          }
+
+                        result = EFL_GESTURE_CANCEL;
+
+                        pd->tap_count = 0;
+                     }
+                }
+
+              break;
+           }
+      case EFL_GESTURE_TOUCH_END:
+           {
+
+              if (efl_gesture_state_get(gesture) != EFL_GESTURE_NONE &&
+                  !efl_gesture_touch_multi_touch_get(event))
+                {
+                   dist = efl_gesture_touch_distance(event, 0);
+                   length = fabs(dist.x) + fabs(dist.y);
+
+                   if (length <= rd->finger_size)
+                     {
+                        pd->tap_count++;
+                        if (pd->tap_count < 3)
+                          {
+                             if (pd->timeout)
+                               ecore_timer_reset(pd->timeout);
+
+                             result = EFL_GESTURE_TRIGGER;
+                          }
+                        else
+                          {
+                             if (pd->timeout)
+                               {
+                                  ecore_timer_del(pd->timeout);
+                                  pd->timeout = NULL;
+                               }
+
+                             if (efl_gesture_touch_state_get(event) == EFL_GESTURE_TOUCH_END)
+                               result = EFL_GESTURE_FINISH;
+                             else
+                               result = EFL_GESTURE_TRIGGER;
+
+                             pd->tap_count = 0;
+                          }
+                     }
+                   else
+                     {
+                        if (pd->timeout)
+                          {
+                             ecore_timer_del(pd->timeout);
+                             pd->timeout = NULL;
+                          }
+
+                        result = EFL_GESTURE_CANCEL;
+
+                        pd->tap_count = 0;
+                     }
+                }
+
+              break;
+           }
+
+      default:
+
+        break;
+     }
+
+   return result;
+}
+
+EOLIAN static double
+_efl_canvas_gesture_recognizer_triple_tap_timeout_get(const Eo *obj EINA_UNUSED,
+                                                      Efl_Canvas_Gesture_Recognizer_Triple_Tap_Data *pd)
+{
+   return pd->start_timeout;
+}
+
+EOLIAN static void
+_efl_canvas_gesture_recognizer_triple_tap_timeout_set(Eo *obj EINA_UNUSED,
+                                                      Efl_Canvas_Gesture_Recognizer_Triple_Tap_Data *pd,
+                                                      double time)
+{
+   pd->start_timeout = time;
+}
+
+#include "efl_canvas_gesture_recognizer_triple_tap.eo.c"
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.eo b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.eo
new file mode 100644 (file)
index 0000000..2ed02bb
--- /dev/null
@@ -0,0 +1,22 @@
+class @beta Efl.Canvas.Gesture_Recognizer_Triple_Tap extends Efl.Canvas.Gesture_Recognizer
+{
+   [[EFL Gesture Recognizer Triple Tap class]]
+   c_prefix: efl_gesture_recognizer_triple_tap;
+   methods {
+      @property timeout {
+         [[Sets the time between taps to be recognized as a double tap.]]
+         set {
+                }
+                get {
+                }
+                values {
+            time: double; [[Time value.]]
+                }
+         }
+   }
+   implements {
+      Efl.Object.destructor;
+      Efl.Canvas.Gesture_Recognizer.add;
+      Efl.Canvas.Gesture_Recognizer.recognize;
+   }
+}
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.c b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.c
new file mode 100644 (file)
index 0000000..190e476
--- /dev/null
@@ -0,0 +1,275 @@
+#include "efl_canvas_gesture_private.h"
+
+#define MY_CLASS EFL_CANVAS_GESTURE_RECOGNIZER_ZOOM_CLASS
+
+static Evas_Coord
+_finger_gap_length_get(Evas_Coord xx1,
+               Evas_Coord yy1,
+               Evas_Coord xx2,
+               Evas_Coord yy2,
+               Evas_Coord *x,
+               Evas_Coord *y)
+{
+   double a, b, xx, yy, gap;
+   xx = abs(xx2 - xx1);
+   yy = abs(yy2 - yy1);
+   gap = sqrt((xx * xx) + (yy * yy));
+
+   /* START - Compute zoom center point */
+   /* The triangle defined as follows:
+    *             B
+    *           / |
+    *          /  |
+    *     gap /   | a
+    *        /    |
+    *       A-----C
+    *          b
+    * http://en.wikipedia.org/wiki/Trigonometric_functions
+    *************************************/
+   if (((int)xx) && ((int)yy))
+     {
+        double A = atan((yy / xx));
+        a = (Evas_Coord)((gap / 2) * sin(A));
+        b = (Evas_Coord)((gap / 2) * cos(A));
+        *x = (Evas_Coord)((xx2 > xx1) ? (xx1 + b) : (xx2 + b));
+        *y = (Evas_Coord)((yy2 > yy1) ? (yy1 + a) : (yy2 + a));
+     }
+   else
+     {
+        if ((int)xx) /* horiz line, take half width */
+          {
+             *x = (Evas_Coord)((xx1 + xx2) / 2);
+             *y = (Evas_Coord)(yy1);
+          }
+
+        if ((int)yy) /* vert line, take half width */
+          {
+             *x = (Evas_Coord)(xx1);
+             *y = (Evas_Coord)((yy1 + yy2) / 2);
+          }
+     }
+   /* END   - Compute zoom center point */
+
+   return (Evas_Coord)gap;
+}
+
+static double
+_zoom_compute(Efl_Canvas_Gesture_Recognizer_Zoom_Data *pd,
+              Efl_Canvas_Gesture_Zoom_Data *zd,
+              Evas_Coord xx1,
+              Evas_Coord yy1,
+              Evas_Coord xx2,
+              Evas_Coord yy2,
+              double zoom_finger_factor)
+{
+   double rt = 1.0;
+   //TODO: Enable below code if the zoom momentum is need
+   //unsigned int tm_end = (pd->zoom_mv.cur.timestamp > pd->zoom_mv1.cur.timestamp) ?
+   //   pd->zoom_mv.cur.timestamp : pd->zoom_mv1.cur.timestamp;
+
+   int x,y; //Hot spot
+   Evas_Coord diam = _finger_gap_length_get(xx1, yy1, xx2, yy2,
+                                            &x, &y);
+
+   zd->radius = diam / 2;
+
+   if (!pd->zoom_base)
+     {
+        pd->zoom_base = diam;
+        return zd->zoom;
+     }
+
+   if (pd->zoom_distance_tolerance) /* zoom tolerance <> ZERO, means
+                                     * zoom action NOT started yet */
+     {
+        /* avoid jump with zoom value when break tolerance */
+        if (diam < (pd->zoom_base - pd->zoom_distance_tolerance))
+          {
+             pd->zoom_base -= pd->zoom_distance_tolerance;
+             pd->zoom_distance_tolerance = 0;
+          }
+
+        /* avoid jump with zoom value when break tolerance */
+        if (diam > (pd->zoom_base + pd->zoom_distance_tolerance))
+          {
+             pd->zoom_base += pd->zoom_distance_tolerance;
+             pd->zoom_distance_tolerance = 0;
+          }
+
+        return rt;
+     }
+
+   /* We use factor only on the difference between gap-base   */
+   /* if gap=120, base=100, we get ((120-100)/100)=0.2*factor */
+   rt = ((1.0) + ((((float)diam - (float)pd->zoom_base) /
+                   (float)pd->zoom_base) * zoom_finger_factor));
+
+   //TODO: Enable below code if the zoom momentum is need
+   /* Momentum: zoom per second: */
+   //zd->momentum = _zoom_momentum_get(st, tm_end, rt);
+
+   return rt;
+}
+
+EOLIAN static Efl_Canvas_Gesture *
+_efl_canvas_gesture_recognizer_zoom_efl_canvas_gesture_recognizer_add(Eo *obj,
+                                                                      Efl_Canvas_Gesture_Recognizer_Zoom_Data *pd EINA_UNUSED,
+                                                                      Efl_Object *target EINA_UNUSED)
+{
+   return efl_add(EFL_CANVAS_GESTURE_ZOOM_CLASS, obj);
+}
+
+EOLIAN static Efl_Canvas_Gesture_Recognizer_Result
+_efl_canvas_gesture_recognizer_zoom_efl_canvas_gesture_recognizer_recognize(Eo *obj,
+                                                                            Efl_Canvas_Gesture_Recognizer_Zoom_Data *pd,
+                                                                            Efl_Canvas_Gesture *gesture,
+                                                                            Efl_Object *watched,
+                                                                            Efl_Canvas_Gesture_Touch *event)
+{
+   int id1 = 0;
+   int id2 = 1;
+   Eina_Value *val;
+   unsigned char zoom_finger_enable;
+   unsigned char glayer_continues_enable;
+   Efl_Canvas_Gesture_Recognizer_Result result = EFL_GESTURE_CANCEL;
+   Efl_Canvas_Gesture_Zoom_Data *zd = efl_data_scope_get(gesture, EFL_CANVAS_GESTURE_ZOOM_CLASS);
+   Efl_Canvas_Gesture_Touch_Data *td = efl_data_scope_get(event, EFL_CANVAS_GESTURE_TOUCH_CLASS);
+   Efl_Canvas_Gesture_Recognizer_Data *rd = efl_data_scope_get(obj, EFL_CANVAS_GESTURE_RECOGNIZER_CLASS);
+
+   //FIXME: Wheel zoom test first here.
+
+   val = efl_gesture_recognizer_config_get(obj, "glayer_continues_enable");
+   if (val) eina_value_get(val, &glayer_continues_enable);
+   else glayer_continues_enable = 1;
+
+   val = efl_gesture_recognizer_config_get(obj, "glayer_zoom_finger_enable");
+   if (val) eina_value_get(val, &zoom_finger_enable);
+   else zoom_finger_enable = 1;
+
+   val = efl_gesture_recognizer_config_get(obj, "glayer_zoom_finger_factor");
+   if (val)  eina_value_get(val, &pd->zoom_finger_factor);
+   else pd->zoom_finger_factor = 1.0;
+
+   rd->continues = EINA_TRUE;
+
+   if (!pd->zoom_distance_tolerance && !pd->calc_temp)
+     {
+        pd->calc_temp = EINA_TRUE;
+        val = efl_gesture_recognizer_config_get(obj, "glayer_zoom_distance_tolerance");
+        if (val)  eina_value_get(val, &pd->zoom_distance_tolerance);
+        else pd->zoom_distance_tolerance = 1.0;
+
+        pd->zoom_distance_tolerance *= rd->finger_size;
+     }
+
+   switch (efl_gesture_touch_state_get(event))
+     {
+      case EFL_GESTURE_TOUCH_UPDATE:
+        {
+           if ((!glayer_continues_enable) && (!pd->zoom_st.cur.timestamp))
+             {
+                return EFL_GESTURE_IGNORE;
+             }
+           EINA_FALLTHROUGH;
+        }
+      case EFL_GESTURE_TOUCH_BEGIN:
+        {
+           if (td->touch_down > 2)
+             {
+                return EFL_GESTURE_CANCEL;
+             }
+
+           if (!pd->zoom_st.cur.timestamp) /* Now scan touched-devices list
+                                            * and find other finger */
+             {
+                if (!efl_gesture_touch_multi_touch_get(event))
+                  return EFL_GESTURE_IGNORE;
+
+                Pointer_Data *p1 = eina_hash_find(td->touch_points, &id1);
+                Pointer_Data *p2 = eina_hash_find(td->touch_points, &id2);
+
+                memcpy(&pd->zoom_st, p2, sizeof(Pointer_Data));
+                memcpy(&pd->zoom_st1, p1, sizeof(Pointer_Data));
+
+                memcpy(&pd->zoom_mv, p2, sizeof(Pointer_Data));
+                memcpy(&pd->zoom_mv1, p1, sizeof(Pointer_Data));
+
+                int x,y; //Hot spot
+                zd->zoom = 1.0;
+                pd->zoom_base = _finger_gap_length_get(pd->zoom_st1.cur.pos.x,
+                                                       pd->zoom_st1.cur.pos.y,
+                                                       pd->zoom_st.cur.pos.x,
+                                                       pd->zoom_st.cur.pos.y,
+                                                       &x, &y);
+
+                zd->radius = pd->zoom_base / 2;
+
+                if ((efl_gesture_state_get(gesture) != EFL_GESTURE_STARTED) &&
+                    (efl_gesture_state_get(gesture) != EFL_GESTURE_UPDATED))
+                  return EFL_GESTURE_TRIGGER;
+
+                return EFL_GESTURE_CANCEL;
+             }
+
+           Pointer_Data *p2 = eina_hash_find(td->touch_points, &id2);
+           if (p2->id == pd->zoom_mv.id)
+             memcpy(&pd->zoom_mv, p2, sizeof(Pointer_Data));
+           else if (p2->id == pd->zoom_mv1.id)
+             memcpy(&pd->zoom_mv1, p2, sizeof(Pointer_Data));
+
+           zd->zoom = _zoom_compute(pd, zd, pd->zoom_mv.cur.pos.x,
+                                    pd->zoom_mv.cur.pos.y, pd->zoom_mv1.cur.pos.x,
+                                    pd->zoom_mv1.cur.pos.y, pd->zoom_finger_factor);
+
+
+           if (!pd->zoom_distance_tolerance)
+             {
+                double d = zd->zoom - pd->next_step;
+
+                if (d < 0.0) d = (-d);
+
+                if (d >= pd->zoom_step)
+                  {
+                     pd->next_step = zd->zoom;
+
+                     return EFL_GESTURE_TRIGGER;
+                  }
+             }
+
+           return EFL_GESTURE_IGNORE;
+        }
+      case EFL_GESTURE_TOUCH_END:
+        {
+           if (td->touch_down == 0)
+             {
+                rd->continues = EINA_FALSE;
+
+                memset(pd, 0, sizeof(Efl_Canvas_Gesture_Recognizer_Zoom_Data));
+                efl_gesture_manager_gesture_clean_up(rd->manager, watched, EFL_EVENT_GESTURE_ZOOM);
+
+                return EFL_GESTURE_IGNORE;
+             }
+           if ((pd->zoom_base) && (pd->zoom_distance_tolerance == 0))
+             {
+                memset(pd, 0, sizeof(Efl_Canvas_Gesture_Recognizer_Zoom_Data));
+
+                return EFL_GESTURE_FINISH;
+             }
+
+           if (efl_gesture_state_get(gesture) != EFL_GESTURE_NONE)
+             {
+                memset(pd, 0, sizeof(Efl_Canvas_Gesture_Recognizer_Zoom_Data));
+
+                return EFL_GESTURE_CANCEL;
+             }
+        }
+
+      default:
+
+         break;
+     }
+
+   return result;
+}
+
+#include "efl_canvas_gesture_recognizer_zoom.eo.c"
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.eo b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.eo
new file mode 100644 (file)
index 0000000..350614c
--- /dev/null
@@ -0,0 +1,9 @@
+class @beta Efl.Canvas.Gesture_Recognizer_Zoom extends Efl.Canvas.Gesture_Recognizer
+{
+   [[EFL Gesture Recognizer Zoom class]]
+   c_prefix: efl_gesture_recognizer_zoom;
+   implements {
+      Efl.Canvas.Gesture_Recognizer.add;
+      Efl.Canvas.Gesture_Recognizer.recognize;
+   }
+}
index aca24a9..d777beb 100644 (file)
@@ -2,9 +2,8 @@
 
 #define MY_CLASS EFL_CANVAS_GESTURE_TAP_CLASS
 
-
 EOLIAN static Efl_Object *
-_efl_canvas_gesture_tap_efl_object_constructor(Eo *obj, Efl_Canvas_Gesture_Tap_Data *pd EINA_UNUSED)
+_efl_canvas_gesture_tap_efl_object_constructor(Eo *obj, void *pd EINA_UNUSED)
 {
    Efl_Canvas_Gesture_Data *gd;
 
index a994b90..bd6daba 100644 (file)
@@ -1,11 +1,8 @@
 class @beta Efl.Canvas.Gesture_Tap extends Efl.Canvas.Gesture
 {
    [[EFL Gesture Tap class]]
+   data: null;
    c_prefix: efl_gesture_tap;
-   event_prefix: efl;
-   events {
-      gesture,tap: Efl.Canvas.Gesture; [[Event for tap gesture]]
-   }
    implements {
       Efl.Object.constructor;
    }
index 9f997f5..4a5f5ca 100644 (file)
@@ -2,29 +2,9 @@
 
 #define MY_CLASS EFL_CANVAS_GESTURE_TOUCH_CLASS
 
-typedef struct _Pointer_Data
-{
-   struct
-   {
-      Eina_Vector2 pos;
-      double timestamp;
-   } start, prev, cur;
-   Efl_Pointer_Action action;
-} Pointer_Data;
-
-typedef struct _Efl_Canvas_Gesture_Touch_Data
-{
-   Efl_Canvas_Gesture_Touch_State state;
-   Eina_Hash              *touch_points;
-   int                     touch_down;
-   Eina_Bool               multi_touch;
-   Eo                     *target;
-} Efl_Canvas_Gesture_Touch_Data;
-
-
-// This event object accumulates all the touch points
-// that are directed to a particular object from the
-// first finger down to the last finger up
+//This event object accumulates all the touch points
+//that are directed to a particular object from the
+//first finger down to the last finger up
 
 static void _hash_free_cb(Pointer_Data *point)
 {
@@ -63,40 +43,52 @@ _efl_canvas_gesture_touch_state_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gestur
 
 EOLIAN static void
 _efl_canvas_gesture_touch_point_record(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Touch_Data *pd,
-                                int id, Eina_Vector2 pos, double timestamp, Efl_Pointer_Action action)
+                                int id, Eina_Vector2 pos, unsigned int timestamp, Efl_Pointer_Action action)
 {
    Pointer_Data *point = eina_hash_find(pd->touch_points, &id);
+   Eina_Position2D _pos = { pos.x, pos.y };
 
    if (action == EFL_POINTER_ACTION_DOWN)
-     pd->touch_down++;
+     {
+        pd->touch_down++;
+        //TODO: Need to handle 2 or more case.
+        if (pd->touch_down == 2)
+          pd->multi_touch = EINA_TRUE;
+     }
    else if ((action == EFL_POINTER_ACTION_UP) ||
             (action == EFL_POINTER_ACTION_CANCEL))
-     pd->touch_down--;
-   EINA_SAFETY_ON_FALSE_GOTO(pd->touch_down >= 0, bad_fingers);
+     {
+        pd->touch_down--;
+        if (pd->multi_touch && pd->touch_down == 1)
+          pd->multi_touch = EINA_FALSE;
+     }
+
+   if (pd->touch_down < 0) goto finished_touch;
 
    if (point)
      {
-        // the point already exists. update the cur and prev point
+        //The point already exists. update the cur and prev point
         point->prev = point->cur;
-        point->cur.pos = pos;
+        point->cur.pos = _pos;
         point->cur.timestamp = timestamp;
      }
    else
      {
-        // new finger
+        //New finger
         if (!id && (action != EFL_POINTER_ACTION_DOWN))
           {
-             // discard any other event
+             //Discard any other event
              return;
           }
         point = calloc(1, sizeof(Pointer_Data));
         if (!point) return;
-        point->start.pos = point->prev.pos = point->cur.pos = pos;
+        point->start.pos = point->prev.pos = point->cur.pos = _pos;
         point->start.timestamp = point->prev.timestamp = point->cur.timestamp = timestamp;
+        point->id = id;
 
-        // add to the hash
+        //Add to the hash
         eina_hash_add(pd->touch_points, &id, point);
-        // FIXME: finger_list was broken
+        //FIXME: finger_list was broken
         if (id)
           pd->multi_touch = EINA_TRUE;
      }
@@ -106,7 +98,7 @@ _efl_canvas_gesture_touch_point_record(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_T
      {
         pd->state = EFL_GESTURE_TOUCH_BEGIN;
      }
-   else if ((action ==  EFL_POINTER_ACTION_UP) && (pd->touch_down == 0))
+   else if (action ==  EFL_POINTER_ACTION_UP)
      {
         pd->state = EFL_GESTURE_TOUCH_END;
      }
@@ -116,8 +108,7 @@ _efl_canvas_gesture_touch_point_record(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_T
      }
    return;
 
-bad_fingers:
-   ERR("Inconsistent touch events received!");
+finished_touch:
    _touch_points_reset(pd);
 }
 
@@ -127,12 +118,12 @@ _efl_canvas_gesture_touch_multi_touch_get(const Eo *obj EINA_UNUSED, Efl_Canvas_
    return pd->multi_touch;
 }
 
-EOLIAN static Eina_Vector2
+EOLIAN static Eina_Position2D
 _efl_canvas_gesture_touch_start_point_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Touch_Data *pd)
 {
    int tool = 0;
    Pointer_Data *point = eina_hash_find(pd->touch_points, &tool);
-   Eina_Vector2 vec = { 0, 0 };
+   Eina_Position2D vec = { 0, 0 };
 
    if (!point)
      return vec;
@@ -140,16 +131,43 @@ _efl_canvas_gesture_touch_start_point_get(const Eo *obj EINA_UNUSED, Efl_Canvas_
    return point->start.pos;
 }
 
+EOLIAN static Eina_Position2D
+_efl_canvas_gesture_touch_cur_point_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Touch_Data *pd)
+{
+   int tool = 0;
+   Pointer_Data *point = eina_hash_find(pd->touch_points, &tool);
+   Eina_Position2D vec = { 0, 0 };
+
+   if (!point)
+     return vec;
+
+   return point->cur.pos;
+}
+
+EOLIAN static unsigned int
+_efl_canvas_gesture_touch_cur_timestamp_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Touch_Data *pd)
+{
+   int tool = 0;
+   Pointer_Data *point = eina_hash_find(pd->touch_points, &tool);
+
+   if (!point)
+     return 0;
+
+   return point->cur.timestamp;
+}
+
 EOLIAN static Eina_Vector2
 _efl_canvas_gesture_touch_delta(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Touch_Data *pd, int tool)
 {
    Pointer_Data *point = eina_hash_find(pd->touch_points, &tool);
    Eina_Vector2 vec = { 0, 0 };
+   Eina_Vector2 v1 = { point->cur.pos.x, point->cur.pos.y };
+   Eina_Vector2 v2 = { point->prev.pos.x, point->prev.pos.y };
 
    if (!point)
      return vec;
 
-   eina_vector2_subtract(&vec, &point->cur.pos, &point->prev.pos);
+   eina_vector2_subtract(&vec, &v1, &v2);
    return vec;
 }
 
@@ -158,11 +176,13 @@ _efl_canvas_gesture_touch_distance(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture
 {
    Pointer_Data *point = eina_hash_find(pd->touch_points, &tool);
    Eina_Vector2 vec = { 0, 0 };
+   Eina_Vector2 v1 = { point->cur.pos.x, point->cur.pos.y };
+   Eina_Vector2 v2 = { point->start.pos.x, point->start.pos.y };
 
    if (!point)
      return vec;
 
-   eina_vector2_subtract(&vec, &point->cur.pos, &point->start.pos);
+   eina_vector2_subtract(&vec, &v1, &v2);
    return vec;
 }
 
index 4109b47..8b78e19 100644 (file)
@@ -13,7 +13,7 @@ class @beta Efl.Canvas.Gesture_Touch extends Efl.Object
          params {
             @in tool       : int; [[The finger id ]]
             @in pos        : Eina.Vector2; [[Position of the event]]
-            @in timestamp  : double; [[The timestamp of the event]]
+            @in timestamp  : uint; [[The timestamp of the event]]
             @in action     : Efl.Pointer.Action; [[action of the event]]
          }
       }
@@ -36,7 +36,21 @@ class @beta Efl.Canvas.Gesture_Touch extends Efl.Object
          [[Returns the first touch point.]]
          get {}
          values {
-            pos: Eina.Vector2; [[The start position.]]
+            pos: Eina.Position2D; [[The start position.]]
+         }
+      }
+      @property cur_point {
+         [[Returns the current touch point.]]
+         get {}
+         values {
+            pos: Eina.Position2D; [[The current position.]]
+         }
+      }
+      @property cur_timestamp {
+         [[Returns the timestamp.]]
+         get {}
+         values {
+            time: uint; [[The timestamp.]]
          }
       }
       @property multi_touch {
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_triple_tap.c b/src/lib/evas/gesture/efl_canvas_gesture_triple_tap.c
new file mode 100644 (file)
index 0000000..5a6bb2f
--- /dev/null
@@ -0,0 +1,18 @@
+#include "efl_canvas_gesture_private.h"
+
+#define MY_CLASS EFL_CANVAS_GESTURE_TRIPLE_TAP_CLASS
+
+EOLIAN static Efl_Object *
+_efl_canvas_gesture_triple_tap_efl_object_constructor(Eo *obj, void *pd EINA_UNUSED)
+{
+   Efl_Canvas_Gesture_Data *gd;
+
+   obj = efl_constructor(efl_super(obj, MY_CLASS));
+
+   gd = efl_data_scope_get(obj, EFL_CANVAS_GESTURE_CLASS);
+   gd->type = EFL_EVENT_GESTURE_TRIPLE_TAP;
+
+   return obj;
+}
+
+#include "efl_canvas_gesture_triple_tap.eo.c"
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_triple_tap.eo b/src/lib/evas/gesture/efl_canvas_gesture_triple_tap.eo
new file mode 100644 (file)
index 0000000..bab59c6
--- /dev/null
@@ -0,0 +1,9 @@
+class @beta Efl.Canvas.Gesture_Triple_Tap extends Efl.Canvas.Gesture
+{
+   [[EFL Gesture Triple Tap class]]
+   data: null;
+   c_prefix: efl_gesture_triple_tap;
+   implements {
+      Efl.Object.constructor;
+   }
+}
index 8be4528..96a2ff6 100644 (file)
@@ -31,3 +31,16 @@ enum @beta Efl.Canvas.Gesture_Recognizer_Result
    cancel    = 0x0010, [[The event made it clear that it is not a gesture. If the gesture recognizer was in Triggered state before, then the gesture is canceled.]]
    result_mask = 0x00ff, [[The gesture result mask]]
 }
+
+enum @beta Efl.Canvas.Gesture_Recognizer_Type
+{
+   [[ This enum type describes the state of a touch event. ]]
+   legacy: efl_gesture;
+   tap = 0,
+   doubleTap,
+   tripleTap,
+   longTap,
+   momentum,
+   flick,
+   zoom,
+}
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_zoom.c b/src/lib/evas/gesture/efl_canvas_gesture_zoom.c
new file mode 100644 (file)
index 0000000..3ac4ffc
--- /dev/null
@@ -0,0 +1,35 @@
+#include "efl_canvas_gesture_private.h"
+
+#define MY_CLASS EFL_CANVAS_GESTURE_ZOOM_CLASS
+
+EOLIAN static Efl_Object *
+_efl_canvas_gesture_zoom_efl_object_constructor(Eo *obj, Efl_Canvas_Gesture_Zoom_Data *pd EINA_UNUSED)
+{
+   Efl_Canvas_Gesture_Data *gd;
+
+   obj = efl_constructor(efl_super(obj, MY_CLASS));
+   gd = efl_data_scope_get(obj, EFL_CANVAS_GESTURE_CLASS);
+   gd->type = EFL_EVENT_GESTURE_ZOOM;
+
+   return obj;
+}
+
+EOLIAN static void
+_efl_canvas_gesture_zoom_efl_object_destructor(Eo *obj, Efl_Canvas_Gesture_Zoom_Data *pd EINA_UNUSED)
+{
+   efl_destructor(efl_super(obj, MY_CLASS));
+}
+
+EOLIAN static double
+_efl_canvas_gesture_zoom_radius_get(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Zoom_Data *pd)
+{
+   return pd->radius;
+}
+
+EOLIAN static double
+_efl_canvas_gesture_zoom_zoom_get(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Zoom_Data *pd)
+{
+   return pd->zoom;
+}
+
+#include "efl_canvas_gesture_zoom.eo.c"
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_zoom.eo b/src/lib/evas/gesture/efl_canvas_gesture_zoom.eo
new file mode 100644 (file)
index 0000000..1cb7f7d
--- /dev/null
@@ -0,0 +1,19 @@
+class @beta Efl.Canvas.Gesture_Zoom extends Efl.Canvas.Gesture
+{
+   [[EFL Gesture Zoom class]]
+   c_prefix: efl_gesture_zoom;
+   methods {
+      radius_get {
+         [[Gets zoom center point reported to user]]
+         return: double; [[The radius value]]
+         }
+      zoom_get {
+         [[Gets zoom value. (1.0 means no zoom)]]
+         return: double; [[The zoom value]]
+         }
+   }
+   implements {
+      Efl.Object.constructor;
+      Efl.Object.destructor;
+   }
+}
diff --git a/src/lib/evas/gesture/efl_gesture_events.eo b/src/lib/evas/gesture/efl_gesture_events.eo
new file mode 100644 (file)
index 0000000..376b51e
--- /dev/null
@@ -0,0 +1,13 @@
+interface @beta Efl.Gesture.Events
+{
+   event_prefix: efl;
+   events {
+      gesture,tap: Efl.Canvas.Gesture_Tap; [[Event for tap gesture]]
+      gesture,double_tap: Efl.Canvas.Gesture_Double_Tap; [[Event for double tap gesture]]
+         gesture,triple_tap: Efl.Canvas.Gesture_Triple_Tap; [[Event for triple tap gesture]]
+         gesture,long_tap: Efl.Canvas.Gesture_Long_Tap; [[Event for long tap gesture]]
+      gesture,momentum: Efl.Canvas.Gesture_Momentum; [[Event for momentum gesture]]
+         gesture,flick: Efl.Canvas.Gesture_Flick; [[Event for flick gesture]]
+         gesture,zoom: Efl.Canvas.Gesture_Zoom; [[Event for zoom gesture]]
+   }
+}
index 3765a0b..3c7847a 100644 (file)
@@ -2,9 +2,22 @@ pub_eo_files = [
   'efl_canvas_gesture_touch.eo',
   'efl_canvas_gesture.eo',
   'efl_canvas_gesture_tap.eo',
+  'efl_canvas_gesture_double_tap.eo',
+  'efl_canvas_gesture_triple_tap.eo',
   'efl_canvas_gesture_long_tap.eo',
+  'efl_canvas_gesture_momentum.eo',
+  'efl_canvas_gesture_flick.eo',
+  'efl_canvas_gesture_zoom.eo',
   'efl_canvas_gesture_recognizer.eo',
-  'efl_canvas_gesture_manager.eo'
+  'efl_canvas_gesture_recognizer_tap.eo',
+  'efl_canvas_gesture_recognizer_double_tap.eo',
+  'efl_canvas_gesture_recognizer_triple_tap.eo',
+  'efl_canvas_gesture_recognizer_long_tap.eo',
+  'efl_canvas_gesture_recognizer_momentum.eo',
+  'efl_canvas_gesture_recognizer_flick.eo',
+  'efl_canvas_gesture_recognizer_zoom.eo',
+  'efl_canvas_gesture_manager.eo',
+  'efl_gesture_events.eo'
 ]
 
 evas_gesture_eo_files = pub_eo_files
@@ -16,28 +29,7 @@ foreach eo_file : pub_eo_files
     depfile : eo_file + '.d',
     install : true,
     install_dir : join_paths(dir_package_include, 'gesture'),
-    command : eolian_gen + [ '-I', meson.current_source_dir(), eolian_include_directories,
-                           '-o', 'h:' + join_paths(meson.current_build_dir(), eo_file + '.h'),
-                           '-o', 'c:' + join_paths(meson.current_build_dir(), eo_file + '.c'),
-                           '-o', 'd:' + join_paths(meson.current_build_dir(), eo_file + '.d'),
-                           '-gchd', '@INPUT@'])
-endforeach
-
-pub_evas_eo_files += files(pub_eo_files)
-
-pub_eo_files = [
-  'efl_canvas_gesture_recognizer_tap.eo',
-  'efl_canvas_gesture_recognizer_long_tap.eo'
-]
-
-foreach eo_file : pub_eo_files
-  pub_eo_file_target += custom_target('eolian_gen_' + eo_file,
-    input : eo_file,
-    output : [eo_file + '.h'],
-    depfile : eo_file + '.d',
-    install : false,
-    install_dir : join_paths(dir_package_include, 'gesture'),
-    command : eolian_gen + [ '-I', meson.current_source_dir(), eolian_include_directories,
+    command : [eolian_gen, '-I', meson.current_source_dir(), eolian_include_directories,
                            '-o', 'h:' + join_paths(meson.current_build_dir(), eo_file + '.h'),
                            '-o', 'c:' + join_paths(meson.current_build_dir(), eo_file + '.c'),
                            '-o', 'd:' + join_paths(meson.current_build_dir(), eo_file + '.d'),
@@ -59,7 +51,7 @@ foreach eo_file : pub_eo_types_files
     depfile : eo_file + '.d',
     install : true,
     install_dir : join_paths(dir_package_include, 'gesture'),
-    command : eolian_gen + [ '-I', meson.current_source_dir(), eolian_include_directories,
+    command : [eolian_gen, '-I', meson.current_source_dir(), eolian_include_directories,
                            '-o', 'h:' + join_paths(meson.current_build_dir(), eo_file + '.h'),
                            '-o', 'd:' + join_paths(meson.current_build_dir(), eo_file + '.d'),
                            '-ghd', '@INPUT@'])
@@ -69,10 +61,20 @@ evas_src += files([
   'efl_canvas_gesture_touch.c',
   'efl_canvas_gesture.c',
   'efl_canvas_gesture_tap.c',
+  'efl_canvas_gesture_double_tap.c',
+  'efl_canvas_gesture_triple_tap.c',
   'efl_canvas_gesture_long_tap.c',
+  'efl_canvas_gesture_momentum.c',
+  'efl_canvas_gesture_flick.c',
+  'efl_canvas_gesture_zoom.c',
   'efl_canvas_gesture_recognizer.c',
   'efl_canvas_gesture_recognizer_tap.c',
+  'efl_canvas_gesture_recognizer_double_tap.c',
+  'efl_canvas_gesture_recognizer_triple_tap.c',
   'efl_canvas_gesture_recognizer_long_tap.c',
+  'efl_canvas_gesture_recognizer_momentum.c',
+  'efl_canvas_gesture_recognizer_flick.c',
+  'efl_canvas_gesture_recognizer_zoom.c',
   'efl_canvas_gesture_manager.c',
 ])