From e65f18ef3ec51e2a3e68ea913b5bdb15d4e5435d Mon Sep 17 00:00:00 2001 From: smohanty Date: Tue, 19 Sep 2017 16:55:45 +0900 Subject: [PATCH] evas/gesture: Added touch accumulator class implementation. --- src/Makefile_Evas.am | 3 +- src/lib/evas/gesture/efl_gesture_touch.c | 166 +++++++++++++++++++++++ 2 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 src/lib/evas/gesture/efl_gesture_touch.c diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am index e1adbcc807..f88d17788e 100644 --- a/src/Makefile_Evas.am +++ b/src/Makefile_Evas.am @@ -84,7 +84,7 @@ evas_eolian_priv_files = \ evas_eolian_type_files = \ lib/evas/canvas/evas_canvas3d_types.eot \ - lib/evas/canvas/efl_animation_types.eot + lib/evas/canvas/efl_animation_types.eot \ lib/evas/gesture/efl_gesture_types.eot @@ -265,6 +265,7 @@ lib/evas/canvas/efl_animation_object_translate.c \ 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 \ $(NULL) EXTRA_DIST2 += \ diff --git a/src/lib/evas/gesture/efl_gesture_touch.c b/src/lib/evas/gesture/efl_gesture_touch.c new file mode 100644 index 0000000000..57c2705bb1 --- /dev/null +++ b/src/lib/evas/gesture/efl_gesture_touch.c @@ -0,0 +1,166 @@ +#include "efl_gesture_private.h" + +#define MY_CLASS EFL_GESTURE_TOUCH_CLASS + +typedef struct _Pointer_Data +{ + struct + { + double x; + double y; + double timestamp; + } start, prev, cur ; + Efl_Pointer_Action action; +}Pointer_Data; + +typedef struct _Efl_Gesture_Touch_Data +{ + Efl_Gesture_Touch_State type; + Eina_Hash *touch_points; + Eina_List *finger_list; + Eina_Bool multi_touch; + Eo *target; +} Efl_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 + +static void _hash_free_cb(Pointer_Data *point) +{ + free(point); +} + +EOLIAN static Efl_Object * +_efl_gesture_touch_efl_object_constructor(Eo *obj, Efl_Gesture_Touch_Data *pd) +{ + obj = efl_constructor(efl_super(obj, MY_CLASS)); + pd->touch_points = eina_hash_int32_new(EINA_FREE_CB(_hash_free_cb)); + + return obj; +} + +EOLIAN static void +_efl_gesture_touch_efl_object_destructor(Eo *obj, Efl_Gesture_Touch_Data *pd) +{ + eina_hash_free(pd->touch_points); + efl_destructor(efl_super(obj, MY_CLASS)); +} + +EOLIAN static Efl_Gesture_Touch_State +_efl_gesture_touch_state_get(Eo *obj EINA_UNUSED, Efl_Gesture_Touch_Data *pd) +{ + return pd->type; +} + +EOLIAN static void +_efl_gesture_touch_point_record(Eo *obj EINA_UNUSED, Efl_Gesture_Touch_Data *pd, + int id, double x, double y, double timestamp, Efl_Pointer_Action action) +{ + Pointer_Data *point = eina_hash_find(pd->touch_points, &id); + if (point) + { + // the point already exists. update the cur and prev point + point->prev.x = point->cur.x; + point->prev.y = point->cur.y; + point->prev.timestamp = point->cur.timestamp; + point->cur.x = x; + point->cur.y = y; + point->cur.timestamp = timestamp; + } + else + { + // new finger + if (!id && (action != EFL_POINTER_ACTION_DOWN)) + { + // discard any other event + return; + } + point = calloc(1, sizeof(Pointer_Data)); + point->start.x = point->prev.x = point->cur.x = x; + point->start.y = point->prev.y = point->cur.y = y; + point->start.timestamp = point->prev.timestamp = point->cur.timestamp = timestamp; + + // add to the hash + eina_hash_add(pd->touch_points, &id, point); + pd->finger_list = eina_list_append(pd->finger_list, &id); + if (id) + pd->multi_touch = EINA_TRUE; + } + point->action = action; + + if (!id && (action == EFL_POINTER_ACTION_DOWN)) + { + pd->type = EFL_GESTURE_TOUCH_BEGIN; + } + else if ((action == EFL_POINTER_ACTION_UP) && (eina_list_count(pd->finger_list) == 1)) + { + pd->type = EFL_GESTURE_TOUCH_END; + } + else + { + pd->type = EFL_GESTURE_TOUCH_UPDATE; + } + +} + +EOLIAN static Eina_Bool +_efl_gesture_touch_multi_touch_get(Eo *obj EINA_UNUSED, Efl_Gesture_Touch_Data *pd) +{ + return pd->multi_touch; +} + +EOLIAN static void +_efl_gesture_touch_start_point(Eo *obj EINA_UNUSED, Efl_Gesture_Touch_Data *pd, double *x, double *y) +{ + int tool = 0; + Pointer_Data *point = eina_hash_find(pd->touch_points, &tool); + + *x = 0; + *y = 0; + + if (point) + { + *x = point->start.x; + *y = point->start.y; + } +} + +EOLIAN static void +_efl_gesture_touch_delta(Eo *obj EINA_UNUSED, Efl_Gesture_Touch_Data *pd, int tool, double *x, double *y) +{ + Pointer_Data *point = eina_hash_find(pd->touch_points, &tool); + + *x = 0; + *y = 0; + + if (point) + { + *x = point->cur.x - point->prev.x; + *y = point->cur.y - point->prev.y; + } +} + +EOLIAN static void +_efl_gesture_touch_distance(Eo *obj EINA_UNUSED, Efl_Gesture_Touch_Data *pd, int tool, double *x, double *y) +{ + Pointer_Data *point = eina_hash_find(pd->touch_points, &tool); + + *x = 0; + *y = 0; + + if (point) + { + *x = point->cur.x - point->start.x; + *y = point->cur.y - point->start.y; + } +} + +EOLIAN static const Eina_List * +_efl_gesture_touch_finger_list_get(Eo *obj EINA_UNUSED, Efl_Gesture_Touch_Data *pd) +{ + return pd->finger_list; +} + +#include "efl_gesture_touch.eo.c" \ No newline at end of file