bu5hm4n pushed a commit to branch master.

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

commit ca2cc5915da861bbad97636a61d4e78c70a0365d
Author: Mike Blumenkrantz <[email protected]>
Date:   Tue Jan 28 13:52:23 2020 -0500

    efl/gesture: implement custom gesture recognizer framework
    
    this adds support for creating custom (out of tree) gesture recognizers by
    adding an abstract recognizer class that can be inherited and reused
    
    docs TBA
    
    Reviewed-by: woochan lee <[email protected]>
    Differential Revision: https://phab.enlightenment.org/D11223
---
 src/lib/evas/Efl_Canvas.h                          |   2 +
 src/lib/evas/Evas_Eo.h                             |   2 +
 src/lib/evas/gesture/efl_canvas_gesture_custom.c   |  38 ++++++
 src/lib/evas/gesture/efl_canvas_gesture_custom.eo  |  28 +++++
 src/lib/evas/gesture/efl_canvas_gesture_events.eo  |   4 +
 src/lib/evas/gesture/efl_canvas_gesture_manager.c  | 128 ++++++++++++++-------
 src/lib/evas/gesture/efl_canvas_gesture_private.h  |  14 ++-
 .../gesture/efl_canvas_gesture_recognizer_custom.c |  32 ++++++
 .../efl_canvas_gesture_recognizer_custom.eo        |  23 ++++
 .../efl_canvas_gesture_recognizer_double_tap.c     |   2 +-
 .../gesture/efl_canvas_gesture_recognizer_flick.c  |   2 +-
 .../efl_canvas_gesture_recognizer_triple_tap.c     |   2 +-
 .../gesture/efl_canvas_gesture_recognizer_zoom.c   |   2 +-
 src/lib/evas/gesture/efl_canvas_gesture_types.eot  |   1 +
 src/lib/evas/gesture/meson.build                   |   4 +
 15 files changed, 238 insertions(+), 46 deletions(-)

diff --git a/src/lib/evas/Efl_Canvas.h b/src/lib/evas/Efl_Canvas.h
index fe18f75353..9ef46201bf 100644
--- a/src/lib/evas/Efl_Canvas.h
+++ b/src/lib/evas/Efl_Canvas.h
@@ -118,9 +118,11 @@ extern "C" {
 #include <gesture/efl_canvas_gesture_recognizer_tap.eo.h>
 #include <gesture/efl_canvas_gesture_recognizer_triple_tap.eo.h>
 #include <gesture/efl_canvas_gesture_recognizer_zoom.eo.h>
+#include <gesture/efl_canvas_gesture_recognizer_custom.eo.h>
 #include <gesture/efl_canvas_gesture_tap.eo.h>
 #include <gesture/efl_canvas_gesture_triple_tap.eo.h>
 #include <gesture/efl_canvas_gesture_zoom.eo.h>
+#include <gesture/efl_canvas_gesture_custom.eo.h>
 #include <gesture/efl_canvas_gesture_events.eo.h>
 
 
diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h
index 356a8fcc53..68b65372c3 100644
--- a/src/lib/evas/Evas_Eo.h
+++ b/src/lib/evas/Evas_Eo.h
@@ -205,6 +205,7 @@ struct _Efl_Canvas_Object_Animation_Event
 #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_custom.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"
@@ -213,6 +214,7 @@ struct _Efl_Canvas_Object_Animation_Event
 #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_recognizer_custom.eo.h"
 #include "gesture/efl_canvas_gesture_manager.eo.h"
 #include "gesture/efl_canvas_gesture_events.eo.h"
 
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_custom.c 
b/src/lib/evas/gesture/efl_canvas_gesture_custom.c
new file mode 100644
index 0000000000..105558b57e
--- /dev/null
+++ b/src/lib/evas/gesture/efl_canvas_gesture_custom.c
@@ -0,0 +1,38 @@
+#define EFL_CANVAS_GESTURE_CUSTOM_PROTECTED
+#include "efl_canvas_gesture_private.h"
+
+#define MY_CLASS EFL_CANVAS_GESTURE_CUSTOM_CLASS
+
+
+EOLIAN static void
+_efl_canvas_gesture_custom_efl_object_destructor(Eo *obj, 
Efl_Canvas_Gesture_Custom_Data *pd)
+{
+   eina_stringshare_del(pd->gesture_name);
+   efl_destructor(efl_super(obj, MY_CLASS));
+}
+
+EOLIAN static Efl_Object *
+_efl_canvas_gesture_custom_efl_object_constructor(Eo *obj, 
Efl_Canvas_Gesture_Custom_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_CUSTOM;
+
+   return obj;
+}
+
+EOLIAN static void
+_efl_canvas_gesture_custom_gesture_name_set(Eo *obj EINA_UNUSED, 
Efl_Canvas_Gesture_Custom_Data *pd, const char *name)
+{
+   eina_stringshare_replace(&pd->gesture_name, name);
+}
+
+EOLIAN static Eina_Stringshare *
+_efl_canvas_gesture_custom_gesture_name_get(const Eo *obj EINA_UNUSED, 
Efl_Canvas_Gesture_Custom_Data *pd)
+{
+   return pd->gesture_name;
+}
+#include "efl_canvas_gesture_custom.eo.c"
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_custom.eo 
b/src/lib/evas/gesture/efl_canvas_gesture_custom.eo
new file mode 100644
index 0000000000..6792d1ba8f
--- /dev/null
+++ b/src/lib/evas/gesture/efl_canvas_gesture_custom.eo
@@ -0,0 +1,28 @@
+import eina_types;
+
+class @beta Efl.Canvas.Gesture_Custom extends Efl.Canvas.Gesture
+{
+   [[Custom gesture class holding state information.
+     See @Efl.Canvas.Gesture to see what this state is and
+     @[Efl.Canvas.Gesture_Events.gesture,custom] for a description of the 
Custom gesture.
+
+     Application developers receive these objects inside a gesture event and 
do not typically need to create their own.
+   ]]
+   c_prefix: efl_gesture_custom;
+   methods {
+      @property gesture_name {
+         [[This is the name of the custom gesture.]]
+         get {
+         }
+         set @protected {
+         }
+         values {
+            gesture_name: string; [[The name of the custom gesture.]]
+         }
+      }
+   }
+   implements {
+      Efl.Object.constructor;
+      Efl.Object.destructor;
+   }
+}
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_events.eo 
b/src/lib/evas/gesture/efl_canvas_gesture_events.eo
index 9344d71edb..bbf9ef68fd 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_events.eo
+++ b/src/lib/evas/gesture/efl_canvas_gesture_events.eo
@@ -43,5 +43,9 @@ interface @beta Efl.Canvas.Gesture_Events
         getting closer ("zoom out" or "pinch").
         This gesture cannot be performed with a mouse as it requires more than 
one pointer.
       ]]
+      gesture,custom: Efl.Canvas.Gesture_Custom; [[Emitted when a Custom 
gesture has been detected.
+        A Custom gesture is one which is custom-written for use in an 
application or toolkit and
+        is not shipped with EFL.
+      ]]
    }
 }
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_manager.c 
b/src/lib/evas/gesture/efl_canvas_gesture_manager.c
index c78682c7c3..180cddb2be 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_manager.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_manager.c
@@ -1,4 +1,5 @@
 #define EFL_CANVAS_GESTURE_PROTECTED
+#define EFL_CANVAS_GESTURE_CUSTOM_PROTECTED
 #include "efl_canvas_gesture_private.h"
 
 #define MY_CLASS EFL_CANVAS_GESTURE_MANAGER_CLASS
@@ -17,9 +18,10 @@ typedef struct _Efl_Canvas_Gesture_Manager_Data
    //Keeps track of all the gesture request for a particular target
    Eina_Hash *m_gesture_contex;     // (*target, Eina_Hash(type, int))
    //Keeps all the event directed to this particular object from touch_begin 
till touch_end
-   Eina_Hash *m_object_events;     // (*target, *efl_gesture_touch)
+   Eina_Hash *m_object_events;     // (*recognizer, *efl_gesture_touch)
    //Keeps all the recognizer registered to gesture manager
    Eina_Hash *m_recognizers;    // (*gesture_type, *recognizer)
+   Eina_List *custom_recognizers;
    //Keeps track of all current object gestures.
    Eina_List *m_object_gestures;    //(List of *object_gesture)
    //Lazy deletion of gestures
@@ -29,7 +31,7 @@ typedef struct _Efl_Canvas_Gesture_Manager_Data
 } Efl_Canvas_Gesture_Manager_Data;
 
 static void _cleanup_cached_gestures(Efl_Canvas_Gesture_Manager_Data *pd,
-                                      Eo *target, const Efl_Event_Description 
*type);
+                                      Eo *target, const Efl_Event_Description 
*type, Efl_Canvas_Gesture_Recognizer *recognizer);
 static Efl_Canvas_Gesture *
             _get_state(Efl_Canvas_Gesture_Manager_Data *pd, Eo *target,
            Efl_Canvas_Gesture_Recognizer *recognizer, const 
Efl_Event_Description *type);
@@ -151,8 +153,12 @@ _efl_canvas_gesture_manager_config_set(Eo *obj, 
Efl_Canvas_Gesture_Manager_Data
 EOLIAN static void
 _efl_canvas_gesture_manager_efl_object_destructor(Eo *obj, 
Efl_Canvas_Gesture_Manager_Data *pd EINA_UNUSED)
 {
+   Efl_Canvas_Gesture_Recognizer *recognizer;
+
    eina_hash_free(pd->m_config);
    eina_hash_free(pd->m_recognizers);
+   EINA_LIST_FREE(pd->custom_recognizers, recognizer)
+     efl_unref(recognizer);
    eina_hash_free(pd->m_gesture_contex);
    eina_hash_free(pd->m_object_events);
    _cleanup_object(pd->m_gestures_to_delete);
@@ -172,7 +178,12 @@ _efl_canvas_gesture_manager_callback_add_hook(void *data, 
Eo *target, const Efl_
 {
    Efl_Canvas_Gesture_Manager_Data *pd = data;
    //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);
+   Efl_Canvas_Gesture_Recognizer *recognizer;
+
+   if (type == EFL_EVENT_GESTURE_CUSTOM)
+     recognizer = eina_list_data_get(pd->custom_recognizers);
+   else
+     recognizer = eina_hash_find(pd->m_recognizers, &type);
    if (recognizer)
      {
         //Add it to the gesture context.
@@ -196,7 +207,12 @@ _efl_canvas_gesture_manager_callback_del_hook(void *data, 
Eo *target, const Efl_
 {
    Efl_Canvas_Gesture_Manager_Data *pd = data;
    //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);
+   Efl_Canvas_Gesture_Recognizer *recognizer;
+
+   if (type == EFL_EVENT_GESTURE_CUSTOM)
+     recognizer = eina_list_data_get(pd->custom_recognizers);
+   else
+     recognizer = eina_hash_find(pd->m_recognizers, &type);
    if (recognizer)
      {
         Eina_Hash *thisisreallystupid = eina_hash_find(pd->m_gesture_contex, 
&target);
@@ -211,20 +227,38 @@ _efl_canvas_gesture_manager_callback_del_hook(void *data, 
Eo *target, const Efl_
         eina_hash_del_by_key(thisisreallystupid, &type);
         if (eina_hash_population(thisisreallystupid)) return;
         eina_hash_del_by_key(pd->m_gesture_contex, &target);
-        _cleanup_cached_gestures(pd, target, type);
+        _cleanup_cached_gestures(pd, target, type, NULL);
      }
 }
 
 static void
 _gesture_recognizer_process_internal(Efl_Canvas_Gesture_Manager_Data *pd, 
Efl_Canvas_Gesture_Recognizer *recognizer,
-                                     Eo *target, const Efl_Event_Description 
*gesture_type, Efl_Canvas_Gesture_Touch *touch_event)
+                                     Eo *target, const Efl_Event_Description 
*gesture_type, void *event)
 {
    Efl_Canvas_Gesture_Recognizer_Result recog_result;
    Efl_Canvas_Gesture_Recognizer_Result recog_state;
+   Efl_Canvas_Gesture_Touch *touch_event;
    //If the gesture canceled or already finished by recognizer.
    Efl_Canvas_Gesture *gesture = _get_state(pd, target, recognizer, 
gesture_type);
    if (!gesture) return;
 
+   //Check there is already created event exist or not.
+   touch_event = eina_hash_find(pd->m_object_events, &recognizer);
+
+   if (!touch_event)
+     {
+        touch_event = efl_add_ref(EFL_CANVAS_GESTURE_TOUCH_CLASS, NULL);
+        eina_hash_add(pd->m_object_events, &recognizer, touch_event);
+     }
+
+   efl_gesture_touch_point_record(touch_event, event);
+
+   //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_STATE_UNKNOWN)
+     return;
+
+
    /* this is the "default" value for the event, recognizers may modify it if 
necessary */
    efl_gesture_touch_count_set(gesture, 
efl_gesture_touch_points_count_get(touch_event));
 
@@ -273,8 +307,8 @@ post_event:
    if (((recog_state == EFL_GESTURE_RECOGNIZER_RESULT_FINISH) || (recog_state 
== EFL_GESTURE_RECOGNIZER_RESULT_CANCEL)) &&
        !rd->continues)
      {
-        _cleanup_cached_gestures(pd, target, gesture_type);
-        eina_hash_del(pd->m_object_events, &gesture_type, NULL);
+        _cleanup_cached_gestures(pd, target, gesture_type, recognizer);
+        eina_hash_del(pd->m_object_events, &recognizer, NULL);
         //FIXME: delete it by object not list.
         _cleanup_object(pd->m_gestures_to_delete);
         pd->m_gestures_to_delete = NULL;
@@ -289,7 +323,6 @@ _efl_canvas_gesture_manager_filter_event(void *data, Eo 
*target, void *event)
    Eina_Iterator *it;
    Eina_Hash_Tuple *tup;
    Efl_Canvas_Gesture_Recognizer *recognizer;
-   Efl_Canvas_Gesture_Touch *touch_event;
 
    thisisreallystupid = eina_hash_find(pd->m_gesture_contex, &target);
    if (!thisisreallystupid) return;
@@ -297,24 +330,18 @@ _efl_canvas_gesture_manager_filter_event(void *data, Eo 
*target, void *event)
    EINA_ITERATOR_FOREACH(it, tup)
      {
         const Efl_Event_Description *gesture_type = *(void**)tup->key;
-        //Check there is already created event exist or not.
-        touch_event = eina_hash_find(pd->m_object_events, &gesture_type);
 
-        if (!touch_event)
+        if (gesture_type == EFL_EVENT_GESTURE_CUSTOM)
           {
-             touch_event = efl_add_ref(EFL_CANVAS_GESTURE_TOUCH_CLASS, NULL);
-             eina_hash_add(pd->m_object_events, &gesture_type, touch_event);
+             Eina_List *l;
+             EINA_LIST_FOREACH(pd->custom_recognizers, l, recognizer)
+               _gesture_recognizer_process_internal(pd, recognizer, target, 
gesture_type, event);
+          }
+        else
+          {
+             recognizer = eina_hash_find(pd->m_recognizers, &gesture_type);
+             _gesture_recognizer_process_internal(pd, recognizer, target, 
gesture_type, event);
           }
-
-        efl_gesture_touch_point_record(touch_event, event);
-
-        //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_STATE_UNKNOWN)
-          continue;
-
-        recognizer = eina_hash_find(pd->m_recognizers, &gesture_type);
-        _gesture_recognizer_process_internal(pd, recognizer, target, 
gesture_type, touch_event);
      }
    eina_iterator_free(it);
 }
@@ -329,11 +356,19 @@ _efl_canvas_gesture_manager_recognizer_register(Eo *obj 
EINA_UNUSED, Efl_Canvas_
      return;
 
    const Efl_Event_Description *type = _efl_gesture_type_get(dummy);
-
+   efl_del(dummy);
    //Add the recognizer to the m_recognizers
-   eina_hash_add(pd->m_recognizers, &type, efl_ref(recognizer));
+   if (type == EFL_EVENT_GESTURE_CUSTOM)
+     {
+        EINA_SAFETY_ON_TRUE_RETURN(pd->custom_recognizers && 
eina_list_data_find(pd->custom_recognizers, recognizer));
+        pd->custom_recognizers = eina_list_append(pd->custom_recognizers, 
efl_ref(recognizer));
+     }
+   else
+     {
+        EINA_SAFETY_ON_TRUE_RETURN(!!eina_hash_find(pd->m_recognizers, &type));
+        eina_hash_add(pd->m_recognizers, &type, efl_ref(recognizer));
+     }
 
-   efl_del(dummy);
 }
 
 EOLIAN static void
@@ -353,24 +388,31 @@ _efl_canvas_gesture_manager_recognizer_unregister(Eo *obj 
EINA_UNUSED, Efl_Canva
 
    type = _efl_gesture_type_get(dummy);
    efl_del(dummy);
-
    //Check if its already registered
-   recognizer = eina_hash_find(pd->m_recognizers, &type);
-
-   if (!recognizer) return;
+   if (type == EFL_EVENT_GESTURE_CUSTOM)
+     {
+        EINA_SAFETY_ON_TRUE_RETURN((!pd->custom_recognizers) || 
(!eina_list_data_find(pd->custom_recognizers, recognizer)));
+        pd->custom_recognizers = eina_list_remove(pd->custom_recognizers, 
recognizer);
+        eina_hash_del_by_key(pd->m_object_events, &recognizer);
+        efl_unref(recognizer);
+     }
+   else
+     {
+        EINA_SAFETY_ON_TRUE_RETURN(!eina_hash_find(pd->m_recognizers, &type));
+        eina_hash_del_by_key(pd->m_object_events, &recognizer);
+        eina_hash_del_by_key(pd->m_recognizers, &type);
+     }
 
    //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)
+        if ((object_gesture->type == type) && (object_gesture->recognizer == 
recognizer))
           {
              pd->m_gestures_to_delete = 
eina_list_append(pd->m_gestures_to_delete, object_gesture->gesture);
              free(object_gesture);
              pd->m_object_gestures = 
eina_list_remove_list(pd->m_object_gestures, l);
           }
      }
-
-   eina_hash_del(pd->m_recognizers, &type, NULL);
 }
 
 // EOLIAN static void
@@ -419,8 +461,8 @@ _get_state(Efl_Canvas_Gesture_Manager_Data *pd,
                   (efl_gesture_state_get(object_gesture->gesture) == 
EFL_GESTURE_STATE_CANCELED)) &&
                  (!rd->continues))
                {
-                  _cleanup_cached_gestures(pd, target, type);
-                  eina_hash_del(pd->m_object_events, &type, NULL);
+                  _cleanup_cached_gestures(pd, target, type, recognizer);
+                  eina_hash_del(pd->m_object_events, &recognizer, NULL);
                   _cleanup_object(pd->m_gestures_to_delete);
                   pd->m_gestures_to_delete = NULL;
                   return NULL;
@@ -438,6 +480,8 @@ _get_state(Efl_Canvas_Gesture_Manager_Data *pd,
    object_gesture->recognizer = recognizer;
    object_gesture->type = type;
    object_gesture->gesture = gesture;
+   if (type == EFL_EVENT_GESTURE_CUSTOM)
+     efl_gesture_custom_gesture_name_set(gesture, 
efl_gesture_recognizer_custom_gesture_name_get(recognizer));
 
    pd->m_object_gestures = eina_list_append(pd->m_object_gestures, 
object_gesture);
 
@@ -446,14 +490,15 @@ _get_state(Efl_Canvas_Gesture_Manager_Data *pd,
 
 static void
 _cleanup_cached_gestures(Efl_Canvas_Gesture_Manager_Data *pd,
-                         Eo *target, const Efl_Event_Description *type)
+                         Eo *target, const Efl_Event_Description *type, 
Efl_Canvas_Gesture_Recognizer *recognizer)
 {
    Eina_List *l, *l_next;
    Object_Gesture *object_gesture;
 
    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) &&
+            ((!recognizer) || (object_gesture->recognizer == recognizer)))
           {
              pd->m_gestures_to_delete = 
eina_list_append(pd->m_gestures_to_delete, object_gesture->gesture);
              free(object_gesture);
@@ -463,12 +508,13 @@ _cleanup_cached_gestures(Efl_Canvas_Gesture_Manager_Data 
*pd,
 }
 
 void
-efl_gesture_manager_gesture_clean_up(Eo *obj, Eo *target, const 
Efl_Event_Description *type)
+efl_gesture_manager_gesture_clean_up(Eo *obj, Eo *target, const 
Efl_Event_Description *type, Efl_Canvas_Gesture_Recognizer *recognizer)
 {
    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);
+   EINA_SAFETY_ON_NULL_RETURN(recognizer);
+   _cleanup_cached_gestures(pd, target, type, recognizer);
+   eina_hash_del(pd->m_object_events, &recognizer, NULL);
    _cleanup_object(pd->m_gestures_to_delete);
    pd->m_gestures_to_delete = NULL;
 }
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_private.h 
b/src/lib/evas/gesture/efl_canvas_gesture_private.h
index 5c32703d18..dadf5c0123 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_private.h
+++ b/src/lib/evas/gesture/efl_canvas_gesture_private.h
@@ -12,7 +12,7 @@
 #define TAP_TOUCH_TIME_THRESHOLD (0.1 * 1000)
 
 const Efl_Event_Description * _efl_gesture_type_get(const Eo *obj);
-void efl_gesture_manager_gesture_clean_up(Eo *obj, Eo *target, const 
Efl_Event_Description *type);
+void efl_gesture_manager_gesture_clean_up(Eo *obj, Eo *target, const 
Efl_Event_Description *type, Efl_Canvas_Gesture_Recognizer *recognizer);
 int _direction_get(Evas_Coord xx1, Evas_Coord xx2);
 Eina_Value *_recognizer_config_get(const Eo *obj, const char *name);
 
@@ -25,10 +25,12 @@ typedef struct 
_Efl_Canvas_Gesture_Recognizer_Triple_Tap_Data  Efl_Canvas_Gestur
 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_Recognizer_Custom_Data        
Efl_Canvas_Gesture_Recognizer_Custom_Data;
 typedef struct _Efl_Canvas_Gesture_Data                        
Efl_Canvas_Gesture_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 _Efl_Canvas_Gesture_Custom_Data                 
Efl_Canvas_Gesture_Custom_Data;
 
 typedef struct _Efl_Canvas_Gesture_Touch_Data
 {
@@ -130,6 +132,11 @@ struct _Efl_Canvas_Gesture_Recognizer_Zoom_Data
    Eina_Bool                       calc_temp;
 };
 
+struct _Efl_Canvas_Gesture_Recognizer_Custom_Data
+{
+   Eina_Stringshare *name;
+};
+
 struct _Efl_Canvas_Gesture_Data
 {
    Efl_Canvas_Gesture_State        state;
@@ -158,4 +165,9 @@ struct _Efl_Canvas_Gesture_Zoom_Data
    double                          zoom;
 };
 
+struct _Efl_Canvas_Gesture_Custom_Data
+{
+   Eina_Stringshare *gesture_name;
+};
+
 #endif
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_custom.c 
b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_custom.c
new file mode 100644
index 0000000000..8900abe71a
--- /dev/null
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_custom.c
@@ -0,0 +1,32 @@
+#include "efl_canvas_gesture_private.h"
+
+#define MY_CLASS EFL_CANVAS_GESTURE_RECOGNIZER_CUSTOM_CLASS
+
+
+EOLIAN static Eo *
+_efl_canvas_gesture_recognizer_custom_efl_object_finalize(Eo *obj, 
Efl_Canvas_Gesture_Recognizer_Custom_Data *pd)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(pd->name, NULL);
+   return efl_finalize(efl_super(obj, MY_CLASS));
+}
+
+EOLIAN static void
+_efl_canvas_gesture_recognizer_custom_efl_object_destructor(Eo *obj, 
Efl_Canvas_Gesture_Recognizer_Custom_Data *pd)
+{
+   eina_stringshare_del(pd->name);
+   efl_destructor(efl_super(obj, MY_CLASS));
+}
+
+EOLIAN static void
+_efl_canvas_gesture_recognizer_custom_gesture_name_set(Eo *obj EINA_UNUSED, 
Efl_Canvas_Gesture_Recognizer_Custom_Data *pd, const char *name)
+{
+   eina_stringshare_replace(&pd->name, name);
+}
+
+EOLIAN static Eina_Stringshare *
+_efl_canvas_gesture_recognizer_custom_gesture_name_get(const Eo *obj 
EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Custom_Data *pd)
+{
+   return pd->name;
+}
+
+#include "efl_canvas_gesture_recognizer_custom.eo.c"
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_custom.eo 
b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_custom.eo
new file mode 100644
index 0000000000..f691694e8c
--- /dev/null
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_custom.eo
@@ -0,0 +1,23 @@
+abstract @beta Efl.Canvas.Gesture_Recognizer_Custom extends 
Efl.Canvas.Gesture_Recognizer
+{
+   [[This is the recognizer for Custom gestures.
+     See @Efl.Canvas.Gesture_Recognizer.
+   ]]
+   c_prefix: efl_gesture_recognizer_custom;
+   methods {
+      @property gesture_name {
+         [[This is the name of the gesture recognizer.]]
+         get {
+         }
+         set {
+         }
+         values {
+            gesture_name: string; [[The name of the gesture recognizer.]]
+         }
+      }
+   }
+   implements {
+      Efl.Object.destructor;
+      Efl.Object.finalize;
+   }
+}
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
index f6c7e0e44c..1db46da7c3 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_double_tap.c
@@ -31,7 +31,7 @@ _tap_timeout_cb(void *data)
    efl_event_callback_call(pd->target, EFL_EVENT_GESTURE_DOUBLE_TAP, 
pd->gesture);
 
    efl_gesture_manager_gesture_clean_up(efl_provider_find(data, 
EFL_CANVAS_GESTURE_MANAGER_CLASS),
-     pd->target, EFL_EVENT_GESTURE_DOUBLE_TAP);
+     pd->target, EFL_EVENT_GESTURE_DOUBLE_TAP, data);
 
    pd->timeout = NULL;
    pd->tap_count = 0;
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c 
b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c
index 3b89ebec32..de45dd762a 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_flick.c
@@ -212,7 +212,7 @@ 
_efl_canvas_gesture_recognizer_flick_efl_canvas_gesture_recognizer_recognize(Eo
    //This is to handle a case with a mouse click on the target object.
    if (efl_gesture_touch_state_get(event) == EFL_GESTURE_TOUCH_STATE_END && 
!pd->touched)
      {
-        efl_gesture_manager_gesture_clean_up(efl_provider_find(obj, 
EFL_CANVAS_GESTURE_MANAGER_CLASS), watched, EFL_EVENT_GESTURE_FLICK);
+        efl_gesture_manager_gesture_clean_up(efl_provider_find(obj, 
EFL_CANVAS_GESTURE_MANAGER_CLASS), watched, EFL_EVENT_GESTURE_FLICK, obj);
         dead = EINA_TRUE;
      }
 
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
index 9c7a70a2e4..3144aa30d1 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_triple_tap.c
@@ -30,7 +30,7 @@ _tap_timeout_cb(void *data)
    efl_gesture_state_set(pd->gesture, EFL_GESTURE_STATE_CANCELED);
    efl_event_callback_call(pd->target, EFL_EVENT_GESTURE_TRIPLE_TAP, 
pd->gesture);
 
-   efl_gesture_manager_gesture_clean_up(efl_provider_find(data, 
EFL_CANVAS_GESTURE_MANAGER_CLASS), pd->target, EFL_EVENT_GESTURE_TRIPLE_TAP);
+   efl_gesture_manager_gesture_clean_up(efl_provider_find(data, 
EFL_CANVAS_GESTURE_MANAGER_CLASS), pd->target, EFL_EVENT_GESTURE_TRIPLE_TAP, 
data);
 
    pd->timeout = NULL;
    pd->tap_count = 0;
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.c 
b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.c
index 2857dd30d2..40e638a5df 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.c
+++ b/src/lib/evas/gesture/efl_canvas_gesture_recognizer_zoom.c
@@ -267,7 +267,7 @@ 
_efl_canvas_gesture_recognizer_zoom_efl_canvas_gesture_recognizer_recognize(Eo *
               rd->continues = EINA_FALSE;
 
               _reset_recognizer(pd);
-              efl_gesture_manager_gesture_clean_up(efl_provider_find(obj, 
EFL_CANVAS_GESTURE_MANAGER_CLASS), watched, EFL_EVENT_GESTURE_ZOOM);
+              efl_gesture_manager_gesture_clean_up(efl_provider_find(obj, 
EFL_CANVAS_GESTURE_MANAGER_CLASS), watched, EFL_EVENT_GESTURE_ZOOM, obj);
 
               return EFL_GESTURE_RECOGNIZER_RESULT_IGNORE;
            }
diff --git a/src/lib/evas/gesture/efl_canvas_gesture_types.eot 
b/src/lib/evas/gesture/efl_canvas_gesture_types.eot
index ad3ebd7c64..e48c0abf3d 100644
--- a/src/lib/evas/gesture/efl_canvas_gesture_types.eot
+++ b/src/lib/evas/gesture/efl_canvas_gesture_types.eot
@@ -46,6 +46,7 @@ enum @beta Efl.Canvas.Gesture_Recognizer_Type
    momentum,
    flick,
    zoom,
+   custom,
 }
 
 struct @beta @c_name(Efl_Gesture_Touch_Point_Info) 
Efl.Canvas.Gesture_Touch_Point_Info {
diff --git a/src/lib/evas/gesture/meson.build b/src/lib/evas/gesture/meson.build
index 7838efdc9d..5daa6f6f30 100644
--- a/src/lib/evas/gesture/meson.build
+++ b/src/lib/evas/gesture/meson.build
@@ -8,6 +8,7 @@ pub_eo_files = [
   'efl_canvas_gesture_momentum.eo',
   'efl_canvas_gesture_flick.eo',
   'efl_canvas_gesture_zoom.eo',
+  'efl_canvas_gesture_custom.eo',
   'efl_canvas_gesture_recognizer.eo',
   'efl_canvas_gesture_recognizer_tap.eo',
   'efl_canvas_gesture_recognizer_double_tap.eo',
@@ -16,6 +17,7 @@ pub_eo_files = [
   'efl_canvas_gesture_recognizer_momentum.eo',
   'efl_canvas_gesture_recognizer_flick.eo',
   'efl_canvas_gesture_recognizer_zoom.eo',
+  'efl_canvas_gesture_recognizer_custom.eo',
   'efl_canvas_gesture_manager.eo',
   'efl_canvas_gesture_events.eo'
 ]
@@ -70,6 +72,7 @@ evas_src += files([
   'efl_canvas_gesture_momentum.c',
   'efl_canvas_gesture_flick.c',
   'efl_canvas_gesture_zoom.c',
+  'efl_canvas_gesture_custom.c',
   'efl_canvas_gesture_recognizer.c',
   'efl_canvas_gesture_recognizer_tap.c',
   'efl_canvas_gesture_recognizer_double_tap.c',
@@ -78,6 +81,7 @@ evas_src += files([
   'efl_canvas_gesture_recognizer_momentum.c',
   'efl_canvas_gesture_recognizer_flick.c',
   'efl_canvas_gesture_recognizer_zoom.c',
+  'efl_canvas_gesture_recognizer_custom.c',
   'efl_canvas_gesture_manager.c',
 ])
 

-- 


Reply via email to