jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=d5f72053fd92a1df5fc85186d12fec83b7693f1a

commit d5f72053fd92a1df5fc85186d12fec83b7693f1a
Author: smohanty <[email protected]>
Date:   Thu Sep 21 10:23:18 2017 +0900

    evas/gesture: Added long_tap gesture to gesture framework
---
 src/Makefile_Evas.am                               |   7 +-
 src/lib/evas/Evas_Eo.h                             |   1 +
 src/lib/evas/gesture/efl_gesture_long_tap.c        |  40 ++++++
 src/lib/evas/gesture/efl_gesture_long_tap.eo       |  26 ++++
 src/lib/evas/gesture/efl_gesture_manager.c         |   2 +
 src/lib/evas/gesture/efl_gesture_private.h         |   1 +
 .../evas/gesture/efl_gesture_recognizer_long_tap.c | 134 +++++++++++++++++++++
 .../gesture/efl_gesture_recognizer_long_tap.eo     |  10 ++
 8 files changed, 219 insertions(+), 2 deletions(-)

diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am
index 4c0a60991d..12710d6e4b 100644
--- a/src/Makefile_Evas.am
+++ b/src/Makefile_Evas.am
@@ -63,6 +63,7 @@ evas_eolian_pub_files = \
        lib/evas/gesture/efl_gesture_touch.eo \
        lib/evas/gesture/efl_gesture.eo \
        lib/evas/gesture/efl_gesture_tap.eo \
+       lib/evas/gesture/efl_gesture_long_tap.eo \
        lib/evas/gesture/efl_gesture_recognizer.eo \
        lib/evas/gesture/efl_gesture_manager.eo \
        $(NULL)
@@ -79,8 +80,8 @@ evas_eolian_legacy_files = \
 
 evas_eolian_priv_files = \
        lib/evas/include/evas_ector_buffer.eo \
-       lib/evas/gesture/efl_gesture_recognizer_tap.eo
-
+       lib/evas/gesture/efl_gesture_recognizer_tap.eo \
+       lib/evas/gesture/efl_gesture_recognizer_long_tap.eo
 
 evas_eolian_type_files = \
     lib/evas/canvas/evas_canvas3d_types.eot \
@@ -268,8 +269,10 @@ lib/evas/canvas/efl_animation_object_group_sequential.c \
 lib/evas/gesture/efl_gesture_touch.c \
 lib/evas/gesture/efl_gesture.c \
 lib/evas/gesture/efl_gesture_tap.c \
+lib/evas/gesture/efl_gesture_long_tap.c \
 lib/evas/gesture/efl_gesture_recognizer.c \
 lib/evas/gesture/efl_gesture_recognizer_tap.c \
+lib/evas/gesture/efl_gesture_recognizer_long_tap.c \
 lib/evas/gesture/efl_gesture_manager.c \
 $(NULL)
 
diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h
index a2d6d6e242..030a18fc63 100644
--- a/src/lib/evas/Evas_Eo.h
+++ b/src/lib/evas/Evas_Eo.h
@@ -333,6 +333,7 @@ typedef void (Evas_Canvas3D_Surface_Func)(Evas_Real *out_x,
 # include "gesture/efl_gesture_touch.eo.h"
 # include "gesture/efl_gesture.eo.h"
 # include "gesture/efl_gesture_tap.eo.h"
+# include "gesture/efl_gesture_long_tap.eo.h"
 # include "gesture/efl_gesture_recognizer.eo.h"
 # include "gesture/efl_gesture_manager.eo.h"
 #endif /* EFL_EO_API_SUPPORT */
diff --git a/src/lib/evas/gesture/efl_gesture_long_tap.c 
b/src/lib/evas/gesture/efl_gesture_long_tap.c
new file mode 100644
index 0000000000..64f39a4975
--- /dev/null
+++ b/src/lib/evas/gesture/efl_gesture_long_tap.c
@@ -0,0 +1,40 @@
+#include "efl_gesture_private.h"
+
+#define MY_CLASS EFL_GESTURE_LONG_TAP_CLASS
+
+
+EOLIAN static void
+_efl_gesture_long_tap_position_set(Eo *obj EINA_UNUSED, 
Efl_Gesture_Long_Tap_Data *pd,
+                                   Eina_Vector2 pos)
+{
+   pd->pos = pos;
+}
+
+EOLIAN static Eina_Vector2
+_efl_gesture_long_tap_position_get(Eo *obj EINA_UNUSED, 
Efl_Gesture_Long_Tap_Data *pd)
+{
+   return pd->pos;
+}
+
+EOLIAN static Efl_Object *
+_efl_gesture_long_tap_efl_object_constructor(Eo *obj, 
Efl_Gesture_Long_Tap_Data *pd EINA_UNUSED)
+{
+   Efl_Gesture_Data *gd;
+
+   obj = efl_constructor(efl_super(obj, MY_CLASS));
+   gd = efl_data_scope_get(obj, EFL_GESTURE_CLASS);
+   gd->type = EFL_EVENT_GESTURE_LONG_TAP;
+
+   return obj;
+}
+
+EOLIAN static void
+_efl_gesture_long_tap_efl_object_destructor(Eo *obj, Efl_Gesture_Long_Tap_Data 
*pd)
+{
+   if (pd->timeout)
+     ecore_timer_del(pd->timeout);
+
+   efl_destructor(efl_super(obj, MY_CLASS));
+}
+
+#include "efl_gesture_long_tap.eo.c"
\ No newline at end of file
diff --git a/src/lib/evas/gesture/efl_gesture_long_tap.eo 
b/src/lib/evas/gesture/efl_gesture_long_tap.eo
new file mode 100644
index 0000000000..e575199c38
--- /dev/null
+++ b/src/lib/evas/gesture/efl_gesture_long_tap.eo
@@ -0,0 +1,26 @@
+import efl_gesture_types;
+
+class Efl.Gesture.Long.Tap(Efl.Gesture)
+{
+   methods {
+      @property position {
+         [[This property holds the type of the gesture.]]
+         set {
+         }
+         get {
+         }
+         values {
+            pos: Eina.Vector2;[[position of the mouse event]]
+         }
+      }
+   }
+   event_prefix: efl;
+   events {
+      gesture_long_tap; [[Event for tap gesture]]
+   }
+
+   implements {
+      Efl.Object.constructor;
+      Efl.Object.destructor;
+   }
+}
\ No newline at end of file
diff --git a/src/lib/evas/gesture/efl_gesture_manager.c 
b/src/lib/evas/gesture/efl_gesture_manager.c
index 5936ded22b..2b90db9379 100644
--- a/src/lib/evas/gesture/efl_gesture_manager.c
+++ b/src/lib/evas/gesture/efl_gesture_manager.c
@@ -66,6 +66,8 @@ _efl_gesture_manager_efl_object_constructor(Eo *obj, 
Efl_Gesture_Manager_Data *p
    pd->m_config = 
eina_hash_string_superfast_new(EINA_FREE_CB(eina_value_free));
 
    efl_gesture_manager_recognizer_register(obj, 
efl_add(EFL_GESTURE_RECOGNIZER_TAP_CLASS, obj));
+   efl_gesture_manager_recognizer_register(obj, 
efl_add(EFL_GESTURE_RECOGNIZER_LONG_TAP_CLASS, obj));
+
    return obj;
 }
 
diff --git a/src/lib/evas/gesture/efl_gesture_private.h 
b/src/lib/evas/gesture/efl_gesture_private.h
index 4a4468adda..e00faf6324 100644
--- a/src/lib/evas/gesture/efl_gesture_private.h
+++ b/src/lib/evas/gesture/efl_gesture_private.h
@@ -10,6 +10,7 @@
 
 //private gesture classes
 #include "efl_gesture_recognizer_tap.eo.h"
+#include "efl_gesture_recognizer_long_tap.eo.h"
 
 typedef struct _Efl_Gesture_Recognizer_Data             
Efl_Gesture_Recognizer_Data;
 typedef struct _Efl_Gesture_Data                        Efl_Gesture_Data;
diff --git a/src/lib/evas/gesture/efl_gesture_recognizer_long_tap.c 
b/src/lib/evas/gesture/efl_gesture_recognizer_long_tap.c
new file mode 100644
index 0000000000..2ba7cd875f
--- /dev/null
+++ b/src/lib/evas/gesture/efl_gesture_recognizer_long_tap.c
@@ -0,0 +1,134 @@
+#include "efl_gesture_private.h"
+
+#define MY_CLASS EFL_GESTURE_RECOGNIZER_LONG_TAP_CLASS
+
+#define LONG_TAP_TIME_OUT 0.2
+
+typedef struct _Efl_Gesture_Recognizer_Long_Tap_Data
+{
+
+} Efl_Gesture_Recognizer_Long_Tap_Data;
+
+EOLIAN static Efl_Object *
+_efl_gesture_recognizer_long_tap_efl_object_constructor(Eo *obj, 
Efl_Gesture_Recognizer_Long_Tap_Data *pd EINA_UNUSED)
+{
+   obj = efl_constructor(efl_super(obj, MY_CLASS));
+   return obj;
+}
+
+EOLIAN static void
+_efl_gesture_recognizer_long_tap_efl_object_destructor(Eo *obj EINA_UNUSED, 
Efl_Gesture_Recognizer_Long_Tap_Data *pd EINA_UNUSED)
+{
+   efl_destructor(efl_super(obj, MY_CLASS));
+}
+
+EOLIAN static Efl_Gesture *
+_efl_gesture_recognizer_long_tap_efl_gesture_recognizer_create(Eo *obj, 
Efl_Gesture_Recognizer_Long_Tap_Data *pd EINA_UNUSED,
+                                                               Efl_Object 
*target EINA_UNUSED)
+{
+   return efl_add(EFL_GESTURE_LONG_TAP_CLASS, obj);
+}
+
+static Eina_Bool
+_long_tap_timeout_cb(void *data)
+{
+   Efl_Gesture_Long_Tap_Data *ltp = data;
+
+   ltp->is_timeout = EINA_TRUE;
+   return ECORE_CALLBACK_RENEW;
+}
+
+EOLIAN static Efl_Gesture_Recognizer_Result
+_efl_gesture_recognizer_long_tap_efl_gesture_recognizer_recognize(Eo *obj 
EINA_UNUSED,
+                                                                   
Efl_Gesture_Recognizer_Long_Tap_Data *pd EINA_UNUSED,
+                                                                   Efl_Gesture 
*gesture, Efl_Object *watched EINA_UNUSED,
+                                                                   
Efl_Gesture_Touch *event)
+{
+    double dist_x, dist_y, length, x, y;
+    Eina_Vector2 pos;
+    Efl_Gesture_Recognizer_Result result = EFL_GESTURE_CANCEL;
+    Efl_Gesture_Long_Tap_Data *ltp = efl_data_scope_get(gesture, 
EFL_GESTURE_LONG_TAP_CLASS);
+
+    switch (efl_gesture_touch_state_get(event))
+      {
+         case EFL_GESTURE_TOUCH_BEGIN:
+           {
+              efl_gesture_touch_start_point(event, &x, &y);
+              eina_vector2_set(&pos, x, y);
+              efl_gesture_long_tap_position_set(gesture, pos);
+              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;
+              break;
+           }
+         case EFL_GESTURE_TOUCH_UPDATE:
+           {
+              if (!efl_gesture_touch_multi_touch_get(event))
+                {
+                   efl_gesture_touch_distance(event, 0, &dist_x, &dist_y);
+                   length = abs(dist_x) + abs(dist_y);
+                   if (length <= 50)
+                     {
+                        if (ltp->is_timeout)
+                          {
+                             ltp->is_timeout = EINA_FALSE;
+                             result = EFL_GESTURE_TRIGGER;
+                          }
+                        else
+                          {
+                             result = EFL_GESTURE_MAYBE;
+                          }
+                     }
+                   else
+                     {
+                        result = EFL_GESTURE_CANCEL;
+                     }
+                }
+              break;
+           }
+         case EFL_GESTURE_TOUCH_END:
+           {
+              if (ltp->timeout)
+                ecore_timer_del(ltp->timeout);
+              ltp->timeout = NULL;
+              if (efl_gesture_state_get(gesture) != EFL_GESTURE_NONE &&
+                  !efl_gesture_touch_multi_touch_get(event))
+                {
+                   efl_gesture_touch_distance(event, 0, &dist_x, &dist_y);
+                   length = abs(dist_x) + abs(dist_y);
+                   if (length <= 50 && ltp->is_timeout)
+                     {
+                        result = EFL_GESTURE_FINISH;
+                     }
+                   else
+                     {
+                        result = EFL_GESTURE_CANCEL;
+                     }
+                }
+              break;
+           }
+          default:
+             break;
+      }
+   return result;
+}
+
+EOLIAN static void
+_efl_gesture_recognizer_long_tap_efl_gesture_recognizer_reset(Eo *obj,
+                                                              
Efl_Gesture_Recognizer_Long_Tap_Data *pd EINA_UNUSED,
+                                                              Efl_Gesture 
*gesture)
+{
+   Efl_Gesture_Long_Tap_Data *ltp;
+   ltp = efl_data_scope_get(gesture, EFL_GESTURE_LONG_TAP_CLASS);
+   eina_vector2_set(&ltp->pos, 0, 0);
+   if (ltp->timeout)
+     ecore_timer_del(ltp->timeout);
+   ltp->timeout = NULL;
+   ltp->is_timeout = EINA_FALSE;
+   efl_gesture_recognizer_reset(efl_super(obj, MY_CLASS), gesture);
+}
+
+#include "efl_gesture_recognizer_long_tap.eo.c"
\ No newline at end of file
diff --git a/src/lib/evas/gesture/efl_gesture_recognizer_long_tap.eo 
b/src/lib/evas/gesture/efl_gesture_recognizer_long_tap.eo
new file mode 100644
index 0000000000..b54a47b944
--- /dev/null
+++ b/src/lib/evas/gesture/efl_gesture_recognizer_long_tap.eo
@@ -0,0 +1,10 @@
+class Efl.Gesture.Recognizer.Long.Tap(Efl.Gesture.Recognizer)
+{
+   implements {
+      Efl.Object.constructor;
+      Efl.Object.destructor;
+      Efl.Gesture.Recognizer.create;
+      Efl.Gesture.Recognizer.recognize;
+      Efl.Gesture.Recognizer.reset;
+   }
+}
\ No newline at end of file

-- 


Reply via email to