From 36e246b8161f78e91e84b8ad19d7aec1726dbfcc Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Thu, 10 Mar 2011 06:35:33 +0000 Subject: [PATCH] fix shutdown+init cycle with deferred win free SVN revision: 57654 --- legacy/elementary/src/lib/elm_main.c | 2 ++ legacy/elementary/src/lib/elm_priv.h | 1 + legacy/elementary/src/lib/elm_win.c | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/legacy/elementary/src/lib/elm_main.c b/legacy/elementary/src/lib/elm_main.c index c8ca6b945c..c1ab941173 100644 --- a/legacy/elementary/src/lib/elm_main.c +++ b/legacy/elementary/src/lib/elm_main.c @@ -360,6 +360,8 @@ elm_shutdown(void) { _elm_init_count--; if (_elm_init_count > 0) return _elm_init_count; + _elm_win_shutdown(); + while (_elm_win_deferred_free) ecore_main_loop_iterate(); elm_quicklaunch_sub_shutdown(); elm_quicklaunch_shutdown(); return _elm_init_count; diff --git a/legacy/elementary/src/lib/elm_priv.h b/legacy/elementary/src/lib/elm_priv.h index b808f86dd3..6932fda6ae 100644 --- a/legacy/elementary/src/lib/elm_priv.h +++ b/legacy/elementary/src/lib/elm_priv.h @@ -207,5 +207,6 @@ extern const char *_elm_data_dir; extern const char *_elm_lib_dir; extern int _elm_log_dom; extern Eina_List *_elm_win_list; +extern int _elm_win_deferred_free; #endif diff --git a/legacy/elementary/src/lib/elm_win.c b/legacy/elementary/src/lib/elm_win.c index ac287d1dbc..fa16fd8964 100644 --- a/legacy/elementary/src/lib/elm_win.c +++ b/legacy/elementary/src/lib/elm_win.c @@ -73,6 +73,7 @@ static void _elm_win_focus_highlight_anim_end(void *data, Evas_Object *obj, cons static void _elm_win_focus_highlight_reconfigure(Elm_Win *win); Eina_List *_elm_win_list = NULL; +int _elm_win_deferred_free = 0; static void _elm_win_move(Ecore_Evas *ee) @@ -198,6 +199,7 @@ static void _deferred_ecore_evas_free(void *data) { ecore_evas_free(data); + _elm_win_deferred_free--; } static void @@ -246,7 +248,9 @@ _elm_win_obj_callback_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void // evas_font_cache_flush(win->evas); // FIXME: we are in the del handler for the object and delete the canvas // that lives under it from the handler... nasty. deferring doesn't help either + ecore_job_add(_deferred_ecore_evas_free, win->ee); + _elm_win_deferred_free++; // ecore_evas_free(win->ee); _elm_win_focus_highlight_shutdown(win);