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(<p->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 --
