diff --git a/legacy/edje/src/lib/edje_main.c b/legacy/edje/src/lib/edje_main.c index 513999b813..60e8413522 100644 --- a/legacy/edje/src/lib/edje_main.c +++ b/legacy/edje/src/lib/edje_main.c @@ -75,6 +75,12 @@ _edje_add(Evas_Object *obj) void _edje_del(Edje *ed) { + if (ed->processing_messages) + { + ed->delete_me = 1; + return; + } + _edje_message_del(ed); _edje_file_del(ed); if (ed->path) free(ed->path); ed->path = NULL; diff --git a/legacy/edje/src/lib/edje_message_queue.c b/legacy/edje/src/lib/edje_message_queue.c index eb484c3884..ca808120c1 100644 --- a/legacy/edje/src/lib/edje_message_queue.c +++ b/legacy/edje/src/lib/edje_message_queue.c @@ -592,11 +592,19 @@ _edje_message_queue_process(void) while (tmp_msgq) { Edje_Message *em; + Edje *ed; em = tmp_msgq->data; + ed = em->edje; + ed->processing_messages++; tmp_msgq = evas_list_remove_list(tmp_msgq, tmp_msgq); _edje_message_process(em); _edje_message_free(em); + ed->processing_messages--; + if (ed->processing_messages == 0) + { + if (ed->delete_me) _edje_del(ed); + } } } diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index e35a61a8d0..db46708a47 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -473,6 +473,7 @@ struct _Edje void *data; } text_change; + int processing_messages; struct { int num; void (*func) (void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg);