From 5d3f6ad5946c52030708c9bfa4b596ed211dcc3f Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Mon, 6 Sep 2021 17:09:14 +0100 Subject: [PATCH] e utils - delayed dia del - try avoid multiple entries --- src/bin/e_utils.c | 49 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/src/bin/e_utils.c b/src/bin/e_utils.c index afb040953..f2c983dee 100644 --- a/src/bin/e_utils.c +++ b/src/bin/e_utils.c @@ -727,22 +727,38 @@ e_util_dir_check(const char *dir) static Eina_Array *_delay_del_array = 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 _e_util_cb_delayed_del(void *data EINA_UNUSED) { _delay_del_idler = NULL; + while (_delay_del_array) { Eina_Array *arr = _delay_del_array; - Eina_Iterator *itr = eina_array_iterator_new(arr); - void *ptr; + unsigned long c, i; _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); } return ECORE_CALLBACK_CANCEL; @@ -770,17 +786,20 @@ e_util_defer_object_del(E_Object *obj) e_object_del(obj); else { - if (!_delay_del_array) + if (!_e_util_del_array_contains(obj)) { - _delay_del_array = eina_array_new(8); - if (!_delay_del_idler) - _delay_del_idler = ecore_idle_enterer_before_add - (_e_util_cb_delayed_del, NULL); - } - if (_delay_del_array) - { - if (eina_array_push(_delay_del_array, obj)) - e_object_delfn_add(obj, _e_util_cb_delayed_cancel, NULL); + if (!_delay_del_array) + { + _delay_del_array = eina_array_new(8); + if (!_delay_del_idler) + _delay_del_idler = ecore_idle_enterer_before_add + (_e_util_cb_delayed_del, NULL); + } + if (_delay_del_array) + { + if (eina_array_push(_delay_del_array, obj)) + e_object_delfn_add(obj, _e_util_cb_delayed_cancel, NULL); + } } } }