From 5af499b01b6448cd669d35330e6981e8a87ed43c Mon Sep 17 00:00:00 2001 From: smohanty Date: Mon, 25 Sep 2017 15:25:42 +0900 Subject: [PATCH] evas/gesture: Added gesture and tap gesture implementation. --- src/Makefile_Evas.am | 2 + src/lib/evas/gesture/efl_gesture.c | 36 ++++++++++ src/lib/evas/gesture/efl_gesture_recognizer_tap.c | 84 +++++++++++++++++++++++ src/lib/evas/gesture/efl_gesture_tap.c | 31 +++++++++ 4 files changed, 153 insertions(+) create mode 100644 src/lib/evas/gesture/efl_gesture.c create mode 100644 src/lib/evas/gesture/efl_gesture_recognizer_tap.c create mode 100644 src/lib/evas/gesture/efl_gesture_tap.c diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am index f88d177..7ef134e 100644 --- a/src/Makefile_Evas.am +++ b/src/Makefile_Evas.am @@ -266,6 +266,8 @@ lib/evas/canvas/efl_animation_object_group.c \ lib/evas/canvas/efl_animation_object_group_parallel.c \ 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 \ $(NULL) EXTRA_DIST2 += \ diff --git a/src/lib/evas/gesture/efl_gesture.c b/src/lib/evas/gesture/efl_gesture.c new file mode 100644 index 0000000..1ea9993 --- /dev/null +++ b/src/lib/evas/gesture/efl_gesture.c @@ -0,0 +1,36 @@ +#include "efl_gesture_private.h" + +#define MY_CLASS EFL_GESTURE_CLASS + +EOLIAN static const Efl_Event_Description * + _efl_gesture_type_get(Eo *obj EINA_UNUSED, Efl_Gesture_Data *pd) +{ + return pd->type; +} + +EOLIAN static Efl_Gesture_State +_efl_gesture_state_get(Eo *obj EINA_UNUSED, Efl_Gesture_Data *pd) +{ + return pd->state; +} + +EOLIAN static void +_efl_gesture_state_set(Eo *obj EINA_UNUSED, Efl_Gesture_Data *pd, Efl_Gesture_State state) +{ + pd->state = state; +} + +EOLIAN static void +_efl_gesture_hotspot_set(Eo *obj EINA_UNUSED, Efl_Gesture_Data *pd, Eina_Vector2 hotspot) +{ + pd->hotspot = hotspot; +} + + +EOLIAN static Eina_Vector2 +_efl_gesture_hotspot_get(Eo *obj EINA_UNUSED, Efl_Gesture_Data *pd) +{ + return pd->hotspot; +} + +#include "efl_gesture.eo.c" \ No newline at end of file diff --git a/src/lib/evas/gesture/efl_gesture_recognizer_tap.c b/src/lib/evas/gesture/efl_gesture_recognizer_tap.c new file mode 100644 index 0000000..e89106c --- /dev/null +++ b/src/lib/evas/gesture/efl_gesture_recognizer_tap.c @@ -0,0 +1,84 @@ +#include "efl_gesture_private.h" + +#define MY_CLASS EFL_GESTURE_RECOGNIZER_TAP_CLASS + +typedef struct _Efl_Gesture_Recognizer_Tap_Data +{ + +} Efl_Gesture_Recognizer_Tap_Data; + +EOLIAN static Efl_Object * +_efl_gesture_recognizer_tap_efl_object_constructor(Eo *obj, Efl_Gesture_Recognizer_Tap_Data *pd EINA_UNUSED) +{ + obj = efl_constructor(efl_super(obj, MY_CLASS)); + return obj; +} + +EOLIAN static void +_efl_gesture_recognizer_tap_efl_object_destructor(Eo *obj EINA_UNUSED, Efl_Gesture_Recognizer_Tap_Data *pd EINA_UNUSED) +{ + efl_destructor(efl_super(obj, MY_CLASS)); +} + +EOLIAN static Efl_Gesture * +_efl_gesture_recognizer_tap_efl_gesture_recognizer_create(Eo *obj EINA_UNUSED, Efl_Gesture_Recognizer_Tap_Data *pd EINA_UNUSED, + Efl_Object *target EINA_UNUSED) +{ + return efl_add(EFL_GESTURE_TAP_CLASS, NULL); +} + +EOLIAN static Efl_Gesture_Recognizer_Result +_efl_gesture_recognizer_tap_efl_gesture_recognizer_recognize(Eo *obj EINA_UNUSED, + Efl_Gesture_Recognizer_Tap_Data *pd EINA_UNUSED, + Efl_Gesture *gesture, Efl_Object *watched EINA_UNUSED, + Efl_Gesture_Touch *event EINA_UNUSED) +{ + double dist_x, dist_y, length, x, y; + Efl_Gesture_Recognizer_Result result = EFL_GESTURE_CANCEL; + + switch (efl_gesture_touch_state_get(event)) + { + case EFL_GESTURE_TOUCH_BEGIN: + { + efl_gesture_touch_start_point(event, &x, &y); + efl_gesture_tap_position_set(gesture, EINA_POSITION2D(x, y)); + efl_gesture_hotspot_set(gesture, EINA_POSITION2D(x, y)); + result = EFL_GESTURE_TRIGGER; + break; + } + case EFL_GESTURE_TOUCH_UPDATE: + case EFL_GESTURE_TOUCH_END: + { + 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) + { + if (efl_gesture_touch_state_get(event) == EFL_GESTURE_TOUCH_END) + result = EFL_GESTURE_FINISH; + else + result = EFL_GESTURE_TRIGGER; + } + } + break; + } + default: + break; + } + return result; +} + +EOLIAN static void +_efl_gesture_recognizer_tap_efl_gesture_recognizer_reset(Eo *obj, + Efl_Gesture_Recognizer_Tap_Data *pd EINA_UNUSED, + Efl_Gesture *gesture) +{ + Efl_Gesture_Tap_Data *tap; + tap = efl_data_scope_get(gesture, EFL_GESTURE_TAP_CLASS); + tap->pos = EINA_POSITION2D(0, 0); + efl_gesture_recognizer_reset(efl_super(obj, MY_CLASS), gesture); +} + +#include "efl_gesture_recognizer_tap.eo.c" \ No newline at end of file diff --git a/src/lib/evas/gesture/efl_gesture_tap.c b/src/lib/evas/gesture/efl_gesture_tap.c new file mode 100644 index 0000000..50dbcf3 --- /dev/null +++ b/src/lib/evas/gesture/efl_gesture_tap.c @@ -0,0 +1,31 @@ +#include "efl_gesture_private.h" + +#define MY_CLASS EFL_GESTURE_TAP_CLASS + + +EOLIAN static void +_efl_gesture_tap_position_set(Eo *obj EINA_UNUSED, Efl_Gesture_Tap_Data *pd, Eina_Vector2 pos) +{ + pd->pos = pos; +} + +EOLIAN static Eina_Vector2 +_efl_gesture_tap_position_get(Eo *obj EINA_UNUSED, Efl_Gesture_Tap_Data *pd) +{ + return pd->pos; +} + +EOLIAN static Efl_Object * +_efl_gesture_tap_efl_object_constructor(Eo *obj, Efl_Gesture_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_TAP; + + return obj; +} + +#include "efl_gesture_tap.eo.c" \ No newline at end of file -- 2.7.4