e utils - delayed dia del - try avoid multiple entries

This commit is contained in:
Carsten Haitzler 2021-09-06 17:09:14 +01:00
parent 59753eab23
commit 5d3f6ad594
1 changed files with 34 additions and 15 deletions

View File

@ -727,22 +727,38 @@ e_util_dir_check(const char *dir)
static Eina_Array *_delay_del_array = NULL; static Eina_Array *_delay_del_array = NULL;
static Ecore_Idle_Enterer *_delay_del_idler = NULL; static Ecore_Idle_Enterer *_delay_del_idler = NULL;
static Eina_Bool
_e_util_del_array_contains(E_Object *obj)
{
unsigned long c, i;
if (!_delay_del_array) return EINA_FALSE;
c = eina_array_count_get(_delay_del_array);
for (i = 0; i < c; i++)
{
if (eina_array_data_get(_delay_del_array, i) == obj) return EINA_TRUE;
}
return EINA_FALSE;
}
static Eina_Bool static Eina_Bool
_e_util_cb_delayed_del(void *data EINA_UNUSED) _e_util_cb_delayed_del(void *data EINA_UNUSED)
{ {
_delay_del_idler = NULL; _delay_del_idler = NULL;
while (_delay_del_array) while (_delay_del_array)
{ {
Eina_Array *arr = _delay_del_array; Eina_Array *arr = _delay_del_array;
Eina_Iterator *itr = eina_array_iterator_new(arr); unsigned long c, i;
void *ptr;
_delay_del_array = NULL; _delay_del_array = NULL;
while (eina_iterator_next(itr, &ptr)) c = eina_array_count_get(arr);
for (i = 0; i < c; i++)
{ {
if (ptr) e_object_del(E_OBJECT(ptr)); E_Object *obj = eina_array_data_get(arr, i);
if (obj) e_object_del(obj);
} }
eina_iterator_free(itr);
eina_array_free(arr); eina_array_free(arr);
} }
return ECORE_CALLBACK_CANCEL; return ECORE_CALLBACK_CANCEL;
@ -769,6 +785,8 @@ e_util_defer_object_del(E_Object *obj)
if (stopping) if (stopping)
e_object_del(obj); e_object_del(obj);
else else
{
if (!_e_util_del_array_contains(obj))
{ {
if (!_delay_del_array) if (!_delay_del_array)
{ {
@ -784,6 +802,7 @@ e_util_defer_object_del(E_Object *obj)
} }
} }
} }
}
E_API const char * E_API const char *
e_util_winid_str_get(Ecore_X_Window win) e_util_winid_str_get(Ecore_X_Window win)