forked from enlightenment/efl
efl/gesture: use array instead of list for garbage gesture objects
this is always a full iteration so we don't actually need a list Reviewed-by: Marcel Hollerbach <mail@marcel-hollerbach.de> Differential Revision: https://phab.enlightenment.org/D11241
This commit is contained in:
parent
02b721078a
commit
5ffa495a1b
|
@ -25,7 +25,7 @@ typedef struct _Efl_Canvas_Gesture_Manager_Data
|
||||||
//Keeps track of all current object gestures.
|
//Keeps track of all current object gestures.
|
||||||
Eina_List *m_object_gestures; //(List of *object_gesture)
|
Eina_List *m_object_gestures; //(List of *object_gesture)
|
||||||
//Lazy deletion of gestures
|
//Lazy deletion of gestures
|
||||||
Eina_List *m_gestures_to_delete;
|
Eina_Array *m_gestures_to_delete;
|
||||||
//Kepps config values for gesture recognize
|
//Kepps config values for gesture recognize
|
||||||
Eina_Hash *m_config;
|
Eina_Hash *m_config;
|
||||||
Eina_Bool processing : 1;
|
Eina_Bool processing : 1;
|
||||||
|
@ -38,17 +38,14 @@ static Efl_Canvas_Gesture *
|
||||||
Efl_Canvas_Gesture_Recognizer *recognizer, const Efl_Event_Description *type);
|
Efl_Canvas_Gesture_Recognizer *recognizer, const Efl_Event_Description *type);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_cleanup_object(Eina_List *list)
|
_cleanup_object(Eina_Array *arr)
|
||||||
{
|
{
|
||||||
Eina_List *l;
|
|
||||||
Eo *obj;
|
Eo *obj;
|
||||||
|
|
||||||
if (!list) return;
|
if (!eina_array_count(arr)) return;
|
||||||
|
|
||||||
EINA_LIST_FOREACH(list, l, obj)
|
while ((obj = eina_array_pop(arr)))
|
||||||
efl_del(obj);
|
efl_del(obj);
|
||||||
|
|
||||||
eina_list_free(list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -110,7 +107,7 @@ _efl_canvas_gesture_manager_efl_object_constructor(Eo *obj, Efl_Canvas_Gesture_M
|
||||||
pd->m_gesture_contex = eina_hash_pointer_new(EINA_FREE_CB(eina_hash_free));
|
pd->m_gesture_contex = eina_hash_pointer_new(EINA_FREE_CB(eina_hash_free));
|
||||||
pd->m_object_events = eina_hash_pointer_new(EINA_FREE_CB(_hash_unref_cb));
|
pd->m_object_events = eina_hash_pointer_new(EINA_FREE_CB(_hash_unref_cb));
|
||||||
pd->m_object_gestures = NULL;
|
pd->m_object_gestures = NULL;
|
||||||
pd->m_gestures_to_delete = NULL;
|
pd->m_gestures_to_delete = eina_array_new(1);;
|
||||||
|
|
||||||
pd->m_config = eina_hash_string_superfast_new(EINA_FREE_CB(eina_value_free));
|
pd->m_config = eina_hash_string_superfast_new(EINA_FREE_CB(eina_value_free));
|
||||||
/* this needs to always be present */
|
/* this needs to always be present */
|
||||||
|
@ -163,6 +160,7 @@ _efl_canvas_gesture_manager_efl_object_destructor(Eo *obj, Efl_Canvas_Gesture_Ma
|
||||||
eina_hash_free(pd->m_gesture_contex);
|
eina_hash_free(pd->m_gesture_contex);
|
||||||
eina_hash_free(pd->m_object_events);
|
eina_hash_free(pd->m_object_events);
|
||||||
_cleanup_object(pd->m_gestures_to_delete);
|
_cleanup_object(pd->m_gestures_to_delete);
|
||||||
|
eina_array_free(pd->m_gestures_to_delete);
|
||||||
efl_destructor(efl_super(obj, MY_CLASS));
|
efl_destructor(efl_super(obj, MY_CLASS));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,7 +310,6 @@ post_event:
|
||||||
eina_hash_del(pd->m_object_events, &recognizer, NULL);
|
eina_hash_del(pd->m_object_events, &recognizer, NULL);
|
||||||
//FIXME: delete it by object not list.
|
//FIXME: delete it by object not list.
|
||||||
_cleanup_object(pd->m_gestures_to_delete);
|
_cleanup_object(pd->m_gestures_to_delete);
|
||||||
pd->m_gestures_to_delete = NULL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -411,14 +408,13 @@ _efl_canvas_gesture_manager_recognizer_unregister(Eo *obj EINA_UNUSED, Efl_Canva
|
||||||
{
|
{
|
||||||
if ((object_gesture->type == type) && (object_gesture->recognizer == recognizer))
|
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);
|
eina_array_push(pd->m_gestures_to_delete, object_gesture->gesture);
|
||||||
free(object_gesture);
|
free(object_gesture);
|
||||||
pd->m_object_gestures = eina_list_remove_list(pd->m_object_gestures, l);
|
pd->m_object_gestures = eina_list_remove_list(pd->m_object_gestures, l);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pd->processing) return;
|
if (pd->processing) return;
|
||||||
_cleanup_object(pd->m_gestures_to_delete);
|
_cleanup_object(pd->m_gestures_to_delete);
|
||||||
pd->m_gestures_to_delete = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// EOLIAN static void
|
// EOLIAN static void
|
||||||
|
@ -470,7 +466,6 @@ _get_state(Efl_Canvas_Gesture_Manager_Data *pd,
|
||||||
_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);
|
||||||
pd->m_gestures_to_delete = NULL;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return object_gesture->gesture;
|
return object_gesture->gesture;
|
||||||
|
@ -506,7 +501,7 @@ _cleanup_cached_gestures(Efl_Canvas_Gesture_Manager_Data *pd,
|
||||||
if ((object_gesture->type == type) && (target == object_gesture->object) &&
|
if ((object_gesture->type == type) && (target == object_gesture->object) &&
|
||||||
((!recognizer) || (object_gesture->recognizer == recognizer)))
|
((!recognizer) || (object_gesture->recognizer == recognizer)))
|
||||||
{
|
{
|
||||||
pd->m_gestures_to_delete = eina_list_append(pd->m_gestures_to_delete, object_gesture->gesture);
|
eina_array_push(pd->m_gestures_to_delete, object_gesture->gesture);
|
||||||
free(object_gesture);
|
free(object_gesture);
|
||||||
pd->m_object_gestures = eina_list_remove_list(pd->m_object_gestures, l);
|
pd->m_object_gestures = eina_list_remove_list(pd->m_object_gestures, l);
|
||||||
}
|
}
|
||||||
|
@ -522,7 +517,6 @@ efl_gesture_manager_gesture_clean_up(Eo *obj, Eo *target, const Efl_Event_Descri
|
||||||
_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);
|
||||||
pd->m_gestures_to_delete = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "efl_canvas_gesture_manager.eo.c"
|
#include "efl_canvas_gesture_manager.eo.c"
|
||||||
|
|
Loading…
Reference in New Issue