efl/gesture: rework gesture_recognizer::add to be a 'type' property

this simplifies (and optimizes) a bunch of code by letting gesture recognizers
return directly the type of gesture they recognize for use internally

ref T8503

Reviewed-by: Marcel Hollerbach <mail@marcel-hollerbach.de>
Differential Revision: https://phab.enlightenment.org/D11267
This commit is contained in:
Mike Blumenkrantz 2020-01-31 10:44:23 -05:00 committed by Marcel Hollerbach
parent 23f772b434
commit 28b7ea6f0c
22 changed files with 100 additions and 73 deletions

View File

@ -36,6 +36,63 @@ static Efl_Canvas_Gesture *
_get_state(Efl_Canvas_Gesture_Manager_Data *pd, Eo *target, _get_state(Efl_Canvas_Gesture_Manager_Data *pd, Eo *target,
Efl_Canvas_Gesture_Recognizer *recognizer, const Efl_Event_Description *type); Efl_Canvas_Gesture_Recognizer *recognizer, const Efl_Event_Description *type);
static const Efl_Event_Description *
_gesture_recognizer_event_type_get(const Efl_Canvas_Gesture_Recognizer *recognizer)
{
Efl_Canvas_Gesture_Recognizer_Type type = efl_gesture_recognizer_type_get(recognizer);
switch (type)
{
case EFL_GESTURE_RECOGNIZER_TYPE_TAP:
return EFL_EVENT_GESTURE_TAP;
case EFL_GESTURE_RECOGNIZER_TYPE_DOUBLETAP:
return EFL_EVENT_GESTURE_DOUBLE_TAP;
case EFL_GESTURE_RECOGNIZER_TYPE_TRIPLETAP:
return EFL_EVENT_GESTURE_TRIPLE_TAP;
case EFL_GESTURE_RECOGNIZER_TYPE_LONGTAP:
return EFL_EVENT_GESTURE_LONG_TAP;
case EFL_GESTURE_RECOGNIZER_TYPE_MOMENTUM:
return EFL_EVENT_GESTURE_MOMENTUM;
case EFL_GESTURE_RECOGNIZER_TYPE_FLICK:
return EFL_EVENT_GESTURE_FLICK;
case EFL_GESTURE_RECOGNIZER_TYPE_ZOOM:
return EFL_EVENT_GESTURE_ZOOM;
case EFL_GESTURE_RECOGNIZER_TYPE_CUSTOM:
return EFL_EVENT_GESTURE_CUSTOM;
default: break;
}
return NULL;
}
static const Efl_Class *
_gesture_recognizer_class_type_get(const Efl_Canvas_Gesture_Recognizer *recognizer)
{
Efl_Canvas_Gesture_Recognizer_Type type = efl_gesture_recognizer_type_get(recognizer);
switch (type)
{
case EFL_GESTURE_RECOGNIZER_TYPE_TAP:
return EFL_CANVAS_GESTURE_TAP_CLASS;
case EFL_GESTURE_RECOGNIZER_TYPE_DOUBLETAP:
return EFL_CANVAS_GESTURE_DOUBLE_TAP_CLASS;
case EFL_GESTURE_RECOGNIZER_TYPE_TRIPLETAP:
return EFL_CANVAS_GESTURE_TRIPLE_TAP_CLASS;
case EFL_GESTURE_RECOGNIZER_TYPE_LONGTAP:
return EFL_CANVAS_GESTURE_LONG_TAP_CLASS;
case EFL_GESTURE_RECOGNIZER_TYPE_MOMENTUM:
return EFL_CANVAS_GESTURE_MOMENTUM_CLASS;
case EFL_GESTURE_RECOGNIZER_TYPE_FLICK:
return EFL_CANVAS_GESTURE_FLICK_CLASS;
case EFL_GESTURE_RECOGNIZER_TYPE_ZOOM:
return EFL_CANVAS_GESTURE_ZOOM_CLASS;
case EFL_GESTURE_RECOGNIZER_TYPE_CUSTOM:
return EFL_CANVAS_GESTURE_CUSTOM_CLASS;
default: break;
}
return NULL;
}
static void static void
_cleanup_object(Eina_Array *arr) _cleanup_object(Eina_Array *arr)
{ {
@ -335,13 +392,7 @@ EOLIAN static void
_efl_canvas_gesture_manager_recognizer_register(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Manager_Data *pd, _efl_canvas_gesture_manager_recognizer_register(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Manager_Data *pd,
Efl_Canvas_Gesture_Recognizer *recognizer) Efl_Canvas_Gesture_Recognizer *recognizer)
{ {
Efl_Canvas_Gesture *dummy = efl_gesture_recognizer_add(recognizer, NULL); const Efl_Event_Description *type = _gesture_recognizer_event_type_get(recognizer);
if (!dummy)
return;
const Efl_Event_Description *type = _efl_gesture_type_get(dummy);
efl_del(dummy);
//Add the recognizer to the m_recognizers //Add the recognizer to the m_recognizers
if (type == EFL_EVENT_GESTURE_CUSTOM) if (type == EFL_EVENT_GESTURE_CUSTOM)
{ {
@ -363,16 +414,11 @@ _efl_canvas_gesture_manager_recognizer_unregister(Eo *obj EINA_UNUSED, Efl_Canva
Eina_List *l, *l_next; Eina_List *l, *l_next;
Object_Gesture *object_gesture; Object_Gesture *object_gesture;
const Efl_Event_Description *type; const Efl_Event_Description *type;
Efl_Canvas_Gesture *dummy;
if (!recognizer) return; if (!recognizer) return;
//Find the type of the recognizer //Find the type of the recognizer
dummy = efl_gesture_recognizer_add(recognizer, 0); type = _gesture_recognizer_event_type_get(recognizer);
if (!dummy) return;
type = _efl_gesture_type_get(dummy);
efl_del(dummy);
//Check if its already registered //Check if its already registered
if (type == EFL_EVENT_GESTURE_CUSTOM) if (type == EFL_EVENT_GESTURE_CUSTOM)
{ {
@ -457,7 +503,7 @@ _get_state(Efl_Canvas_Gesture_Manager_Data *pd,
} }
} }
gesture = efl_gesture_recognizer_add(recognizer, target); gesture = efl_add(_gesture_recognizer_class_type_get(recognizer), recognizer);
if (!gesture) if (!gesture)
return 0; return 0;
@ -497,16 +543,11 @@ EOLIAN static void
_efl_canvas_gesture_manager_recognizer_cleanup(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Manager_Data *pd, const Efl_Canvas_Gesture_Recognizer *recognizer, const Eo *target) _efl_canvas_gesture_manager_recognizer_cleanup(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Manager_Data *pd, const Efl_Canvas_Gesture_Recognizer *recognizer, const Eo *target)
{ {
const Efl_Event_Description *type; const Efl_Event_Description *type;
Efl_Canvas_Gesture *dummy;
EINA_SAFETY_ON_NULL_RETURN(recognizer); EINA_SAFETY_ON_NULL_RETURN(recognizer);
//Find the type of the recognizer //Find the type of the recognizer
dummy = efl_gesture_recognizer_add((void*)recognizer, 0); type = _gesture_recognizer_event_type_get(recognizer);
EINA_SAFETY_ON_NULL_RETURN(dummy);
type = _efl_gesture_type_get(dummy);
efl_del(dummy);
_cleanup_cached_gestures(pd, target, type, recognizer); _cleanup_cached_gestures(pd, target, type, recognizer);
eina_hash_del(pd->m_object_events, &recognizer, NULL); eina_hash_del(pd->m_object_events, &recognizer, NULL);
_cleanup_object(pd->m_gestures_to_delete); _cleanup_object(pd->m_gestures_to_delete);

View File

@ -13,12 +13,12 @@ abstract @beta Efl.Canvas.Gesture_Recognizer extends Efl.Object
]] ]]
c_prefix: efl_gesture_recognizer; c_prefix: efl_gesture_recognizer;
methods { methods {
add @pure_virtual { @property type @pure_virtual {
[[This function is called to create a new @Efl.Canvas.Gesture object for the given target.]] [[This property returns the type of gesture recognized by this recognizer.]]
params { get {}
@in target: Efl.Object; [[The target canvas object.]] values {
type: Efl.Canvas.Gesture_Recognizer_Type; [[The gesture type to recognize.]]
} }
return: Efl.Canvas.Gesture; [[Returns the gesture object that will be used to track this gesture.]]
} }
recognize @pure_virtual { recognize @pure_virtual {
[[Analyzes the given $event and the current state of the $gesture object to see if the state [[Analyzes the given $event and the current state of the $gesture object to see if the state

View File

@ -2,6 +2,11 @@
#define MY_CLASS EFL_CANVAS_GESTURE_RECOGNIZER_CUSTOM_CLASS #define MY_CLASS EFL_CANVAS_GESTURE_RECOGNIZER_CUSTOM_CLASS
EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_custom_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Custom_Data *pd EINA_UNUSED)
{
return EFL_GESTURE_RECOGNIZER_TYPE_CUSTOM;
}
EOLIAN static Eo * EOLIAN static Eo *
_efl_canvas_gesture_recognizer_custom_efl_object_finalize(Eo *obj, Efl_Canvas_Gesture_Recognizer_Custom_Data *pd) _efl_canvas_gesture_recognizer_custom_efl_object_finalize(Eo *obj, Efl_Canvas_Gesture_Recognizer_Custom_Data *pd)

View File

@ -19,5 +19,6 @@ abstract @beta Efl.Canvas.Gesture_Recognizer_Custom extends Efl.Canvas.Gesture_R
implements { implements {
Efl.Object.destructor; Efl.Object.destructor;
Efl.Object.finalize; Efl.Object.finalize;
Efl.Canvas.Gesture_Recognizer.type { get; }
} }
} }

View File

@ -4,10 +4,10 @@
#define TAP_TIME_OUT 0.33 #define TAP_TIME_OUT 0.33
EOLIAN static Efl_Canvas_Gesture * EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_double_tap_efl_canvas_gesture_recognizer_add(Eo *obj, Efl_Canvas_Gesture_Recognizer_Double_Tap_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED) _efl_canvas_gesture_recognizer_double_tap_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Double_Tap_Data *pd EINA_UNUSED)
{ {
return efl_add(EFL_CANVAS_GESTURE_DOUBLE_TAP_CLASS, obj); return EFL_GESTURE_RECOGNIZER_TYPE_DOUBLETAP;
} }
EOLIAN static void EOLIAN static void

View File

@ -19,7 +19,7 @@ class @beta Efl.Canvas.Gesture_Recognizer_Double_Tap extends Efl.Canvas.Gesture_
} }
implements { implements {
Efl.Object.destructor; Efl.Object.destructor;
Efl.Canvas.Gesture_Recognizer.add; Efl.Canvas.Gesture_Recognizer.type { get; }
Efl.Canvas.Gesture_Recognizer.recognize; Efl.Canvas.Gesture_Recognizer.recognize;
} }
} }

View File

@ -22,10 +22,10 @@ _reset_recognizer(Efl_Canvas_Gesture_Recognizer_Flick_Data *pd)
pd->touched = EINA_FALSE; pd->touched = EINA_FALSE;
} }
EOLIAN static Efl_Canvas_Gesture * EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_flick_efl_canvas_gesture_recognizer_add(Eo *obj, Efl_Canvas_Gesture_Recognizer_Flick_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED) _efl_canvas_gesture_recognizer_flick_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Flick_Data *pd EINA_UNUSED)
{ {
return efl_add(EFL_CANVAS_GESTURE_FLICK_CLASS, obj); return EFL_GESTURE_RECOGNIZER_TYPE_FLICK;
} }
static void static void

View File

@ -6,7 +6,7 @@ class @beta Efl.Canvas.Gesture_Recognizer_Flick extends Efl.Canvas.Gesture_Recog
]] ]]
c_prefix: efl_gesture_recognizer_flick; c_prefix: efl_gesture_recognizer_flick;
implements { implements {
Efl.Canvas.Gesture_Recognizer.add; Efl.Canvas.Gesture_Recognizer.type { get; }
Efl.Canvas.Gesture_Recognizer.recognize; Efl.Canvas.Gesture_Recognizer.recognize;
} }
} }

View File

@ -4,12 +4,10 @@
#define EFL_GESTURE_LONG_TAP_TIME_OUT 1.2 #define EFL_GESTURE_LONG_TAP_TIME_OUT 1.2
EOLIAN static Efl_Canvas_Gesture * EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_long_tap_efl_canvas_gesture_recognizer_add(Eo *obj, _efl_canvas_gesture_recognizer_long_tap_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Long_Tap_Data *pd EINA_UNUSED)
Efl_Canvas_Gesture_Recognizer_Long_Tap_Data *pd EINA_UNUSED,
Efl_Object *target EINA_UNUSED)
{ {
return efl_add(EFL_CANVAS_GESTURE_LONG_TAP_CLASS, obj); return EFL_GESTURE_RECOGNIZER_TYPE_LONGTAP;
} }
EOLIAN static void EOLIAN static void

View File

@ -19,7 +19,7 @@ class @beta Efl.Canvas.Gesture_Recognizer_Long_Tap extends Efl.Canvas.Gesture_Re
} }
implements { implements {
Efl.Object.destructor; Efl.Object.destructor;
Efl.Canvas.Gesture_Recognizer.add; Efl.Canvas.Gesture_Recognizer.type { get; }
Efl.Canvas.Gesture_Recognizer.recognize; Efl.Canvas.Gesture_Recognizer.recognize;
Efl.Canvas.Gesture_Recognizer.reset; Efl.Canvas.Gesture_Recognizer.reset;
} }

View File

@ -7,10 +7,10 @@
#define THUMBSCROLL_MOMENTUM_THRESHOLD 100.0 #define THUMBSCROLL_MOMENTUM_THRESHOLD 100.0
#define EFL_GESTURE_MINIMUM_MOMENTUM 0.001 #define EFL_GESTURE_MINIMUM_MOMENTUM 0.001
EOLIAN static Efl_Canvas_Gesture * EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_momentum_efl_canvas_gesture_recognizer_add(Eo *obj, Efl_Canvas_Gesture_Recognizer_Momentum_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED) _efl_canvas_gesture_recognizer_momentum_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Momentum_Data *pd EINA_UNUSED)
{ {
return efl_add(EFL_CANVAS_GESTURE_MOMENTUM_CLASS, obj); return EFL_GESTURE_RECOGNIZER_TYPE_MOMENTUM;
} }
static void static void

View File

@ -6,7 +6,7 @@ class @beta Efl.Canvas.Gesture_Recognizer_Momentum extends Efl.Canvas.Gesture_Re
]] ]]
c_prefix: efl_gesture_recognizer_momentum; c_prefix: efl_gesture_recognizer_momentum;
implements { implements {
Efl.Canvas.Gesture_Recognizer.add; Efl.Canvas.Gesture_Recognizer.type { get; }
Efl.Canvas.Gesture_Recognizer.recognize; Efl.Canvas.Gesture_Recognizer.recognize;
} }
} }

View File

@ -6,12 +6,10 @@
// may using dobule tap timeout value? // may using dobule tap timeout value?
#define EFL_GESTURE_RECOGNIZER_TYPE_TAP_TIME_OUT 0.33 #define EFL_GESTURE_RECOGNIZER_TYPE_TAP_TIME_OUT 0.33
EOLIAN static Efl_Canvas_Gesture * EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_tap_efl_canvas_gesture_recognizer_add(Eo *obj, _efl_canvas_gesture_recognizer_tap_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Tap_Data *pd EINA_UNUSED)
Efl_Canvas_Gesture_Recognizer_Tap_Data *pd EINA_UNUSED,
Efl_Object *target EINA_UNUSED)
{ {
return efl_add(EFL_CANVAS_GESTURE_TAP_CLASS, obj); return EFL_GESTURE_RECOGNIZER_TYPE_TAP;
} }
static Eina_Bool static Eina_Bool

View File

@ -6,7 +6,7 @@ class @beta Efl.Canvas.Gesture_Recognizer_Tap extends Efl.Canvas.Gesture_Recogni
]] ]]
c_prefix: efl_gesture_recognizer_tap; c_prefix: efl_gesture_recognizer_tap;
implements { implements {
Efl.Canvas.Gesture_Recognizer.add; Efl.Canvas.Gesture_Recognizer.type { get; }
Efl.Canvas.Gesture_Recognizer.recognize; Efl.Canvas.Gesture_Recognizer.recognize;
} }
} }

View File

@ -4,10 +4,10 @@
#define TAP_TIME_OUT 0.33 #define TAP_TIME_OUT 0.33
EOLIAN static Efl_Canvas_Gesture * EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_triple_tap_efl_canvas_gesture_recognizer_add(Eo *obj, Efl_Canvas_Gesture_Recognizer_Triple_Tap_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED) _efl_canvas_gesture_recognizer_triple_tap_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Triple_Tap_Data *pd EINA_UNUSED)
{ {
return efl_add(EFL_CANVAS_GESTURE_TRIPLE_TAP_CLASS, obj); return EFL_GESTURE_RECOGNIZER_TYPE_TRIPLETAP;
} }
EOLIAN static void EOLIAN static void

View File

@ -19,7 +19,7 @@ class @beta Efl.Canvas.Gesture_Recognizer_Triple_Tap extends Efl.Canvas.Gesture_
} }
implements { implements {
Efl.Object.destructor; Efl.Object.destructor;
Efl.Canvas.Gesture_Recognizer.add; Efl.Canvas.Gesture_Recognizer.type { get; }
Efl.Canvas.Gesture_Recognizer.recognize; Efl.Canvas.Gesture_Recognizer.recognize;
} }
} }

View File

@ -125,12 +125,10 @@ _zoom_compute(Efl_Canvas_Gesture_Recognizer_Zoom_Data *pd,
return rt; return rt;
} }
EOLIAN static Efl_Canvas_Gesture * EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_zoom_efl_canvas_gesture_recognizer_add(Eo *obj, _efl_canvas_gesture_recognizer_zoom_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Zoom_Data *pd EINA_UNUSED)
Efl_Canvas_Gesture_Recognizer_Zoom_Data *pd EINA_UNUSED,
Efl_Object *target EINA_UNUSED)
{ {
return efl_add(EFL_CANVAS_GESTURE_ZOOM_CLASS, obj); return EFL_GESTURE_RECOGNIZER_TYPE_ZOOM;
} }
EOLIAN static Efl_Canvas_Gesture_Recognizer_Result EOLIAN static Efl_Canvas_Gesture_Recognizer_Result

View File

@ -6,7 +6,7 @@ class @beta Efl.Canvas.Gesture_Recognizer_Zoom extends Efl.Canvas.Gesture_Recogn
]] ]]
c_prefix: efl_gesture_recognizer_zoom; c_prefix: efl_gesture_recognizer_zoom;
implements { implements {
Efl.Canvas.Gesture_Recognizer.add; Efl.Canvas.Gesture_Recognizer.type { get; }
Efl.Canvas.Gesture_Recognizer.recognize; Efl.Canvas.Gesture_Recognizer.recognize;
} }
} }

View File

@ -14,12 +14,6 @@ _custom_recognizer_efl_object_finalize(Eo *obj, Custom_Recognizer_Data *pd EINA_
return efl_finalize(efl_super(obj, MY_CLASS)); return efl_finalize(efl_super(obj, MY_CLASS));
} }
EOLIAN static Efl_Canvas_Gesture *
_custom_recognizer_efl_canvas_gesture_recognizer_add(Eo *obj, Custom_Recognizer_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED)
{
return efl_add(EFL_CANVAS_GESTURE_CUSTOM_CLASS, obj);
}
EOLIAN static Efl_Canvas_Gesture_Recognizer_Result EOLIAN static Efl_Canvas_Gesture_Recognizer_Result
_custom_recognizer_efl_canvas_gesture_recognizer_recognize(Eo *obj EINA_UNUSED, Custom_Recognizer_Data *pd EINA_UNUSED, _custom_recognizer_efl_canvas_gesture_recognizer_recognize(Eo *obj EINA_UNUSED, Custom_Recognizer_Data *pd EINA_UNUSED,
Efl_Canvas_Gesture *gesture EINA_UNUSED, Efl_Object *watched EINA_UNUSED, Efl_Canvas_Gesture *gesture EINA_UNUSED, Efl_Object *watched EINA_UNUSED,

View File

@ -5,7 +5,6 @@ class @beta Custom_Recognizer extends Efl.Canvas.Gesture_Recognizer_Custom
c_prefix: custom_recognizer; c_prefix: custom_recognizer;
implements { implements {
Efl.Object.finalize; Efl.Object.finalize;
Efl.Canvas.Gesture_Recognizer.add;
Efl.Canvas.Gesture_Recognizer.recognize; Efl.Canvas.Gesture_Recognizer.recognize;
} }
} }

View File

@ -13,12 +13,6 @@ _custom_recognizer2_efl_object_finalize(Eo *obj, Custom_Recognizer2_Data *pd EIN
return efl_finalize(efl_super(obj, MY_CLASS)); return efl_finalize(efl_super(obj, MY_CLASS));
} }
EOLIAN static Efl_Canvas_Gesture *
_custom_recognizer2_efl_canvas_gesture_recognizer_add(Eo *obj, Custom_Recognizer2_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED)
{
return efl_add(EFL_CANVAS_GESTURE_CUSTOM_CLASS, obj);
}
EOLIAN static Efl_Canvas_Gesture_Recognizer_Result EOLIAN static Efl_Canvas_Gesture_Recognizer_Result
_custom_recognizer2_efl_canvas_gesture_recognizer_recognize(Eo *obj EINA_UNUSED, Custom_Recognizer2_Data *pd EINA_UNUSED, _custom_recognizer2_efl_canvas_gesture_recognizer_recognize(Eo *obj EINA_UNUSED, Custom_Recognizer2_Data *pd EINA_UNUSED,
Efl_Canvas_Gesture *gesture EINA_UNUSED, Efl_Object *watched EINA_UNUSED, Efl_Canvas_Gesture *gesture EINA_UNUSED, Efl_Object *watched EINA_UNUSED,

View File

@ -5,7 +5,6 @@ class @beta Custom_Recognizer2 extends Efl.Canvas.Gesture_Recognizer_Custom
c_prefix: custom_recognizer2; c_prefix: custom_recognizer2;
implements { implements {
Efl.Object.finalize; Efl.Object.finalize;
Efl.Canvas.Gesture_Recognizer.add;
Efl.Canvas.Gesture_Recognizer.recognize; Efl.Canvas.Gesture_Recognizer.recognize;
} }
} }