Enlightenment CVS committal Author : raster Project : e17 Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore_evas Modified Files: ecore_evas.c ecore_evas_fb.c ecore_evas_private.h ecore_evas_x.c Log Message: defer evas destruction until idle time :) =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/ecore_evas.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -3 -r1.18 -r1.19 --- ecore_evas.c 8 Jan 2005 18:40:31 -0000 1.18 +++ ecore_evas.c 28 Jul 2005 14:09:08 -0000 1.19 @@ -6,6 +6,8 @@ static int _ecore_evas_init_count = 0; +static int _ecore_evas_idle_enter_delete(void *data); + /** * Query if a particular renginering engine target has support * @param engine The engine to check support for @@ -110,31 +112,10 @@ "ecore_evas_free"); return; } - ECORE_MAGIC_SET(ee, ECORE_MAGIC_NONE); - while (ee->sub_ecore_evas) - { - ecore_evas_free(ee->sub_ecore_evas->data); - } - if (ee->data) evas_hash_free(ee->data); - if (ee->driver) free(ee->driver); - if (ee->name) free(ee->name); - if (ee->prop.title) free(ee->prop.title); - if (ee->prop.name) free(ee->prop.name); - if (ee->prop.clas) free(ee->prop.clas); - if (ee->prop.cursor.file) free(ee->prop.cursor.file); - if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object); - if (ee->evas) evas_free(ee->evas); - ee->data = NULL; - ee->driver = NULL; - ee->name = NULL; - ee->prop.title = NULL; - ee->prop.name = NULL; - ee->prop.clas = NULL; - ee->prop.cursor.file = NULL; - ee->prop.cursor.object = NULL; - ee->evas = NULL; - if (ee->engine.func->fn_free) ee->engine.func->fn_free(ee); - free(ee); + if (ee->delete_idle_enterer) return; + ee->delete_idle_enterer = + ecore_idle_enterer_add(_ecore_evas_idle_enter_delete, ee); + return; } void * @@ -1603,3 +1584,48 @@ } } #endif + +void +_ecore_evas_free(Ecore_Evas *ee) +{ + ECORE_MAGIC_SET(ee, ECORE_MAGIC_NONE); + if (ee->delete_idle_enterer) + { + ecore_idle_enterer_del(ee->delete_idle_enterer); + ee->delete_idle_enterer = NULL; + } + while (ee->sub_ecore_evas) + { + ecore_evas_free(ee->sub_ecore_evas->data); + } + if (ee->data) evas_hash_free(ee->data); + if (ee->driver) free(ee->driver); + if (ee->name) free(ee->name); + if (ee->prop.title) free(ee->prop.title); + if (ee->prop.name) free(ee->prop.name); + if (ee->prop.clas) free(ee->prop.clas); + if (ee->prop.cursor.file) free(ee->prop.cursor.file); + if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object); + if (ee->evas) evas_free(ee->evas); + ee->data = NULL; + ee->driver = NULL; + ee->name = NULL; + ee->prop.title = NULL; + ee->prop.name = NULL; + ee->prop.clas = NULL; + ee->prop.cursor.file = NULL; + ee->prop.cursor.object = NULL; + ee->evas = NULL; + if (ee->engine.func->fn_free) ee->engine.func->fn_free(ee); + free(ee); +} + +static int +_ecore_evas_idle_enter_delete(void *data) +{ + Ecore_Evas *ee; + + ee = (Ecore_Evas *)data; + _ecore_evas_free(ee); + return 0; +} =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/ecore_evas_fb.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- ecore_evas_fb.c 25 Jul 2005 09:55:47 -0000 1.12 +++ ecore_evas_fb.c 28 Jul 2005 14:09:09 -0000 1.13 @@ -64,7 +64,9 @@ Ecore_Evas *ee; ee = (Ecore_Evas *)l; - return ee; + if (ee->delete_idle_enterer) continue; + else + return ee; } return NULL; } @@ -404,7 +406,7 @@ { int i; - while (ecore_evases) ecore_evas_free(ecore_evases); + while (ecore_evases) _ecore_evas_free(ecore_evases); for (i = 0; i < 5; i++) ecore_event_handler_del(ecore_evas_event_handlers[i]); ecore_idle_enterer_del(ecore_evas_idle_enterer); =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/ecore_evas_private.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- ecore_evas_private.h 25 Jun 2005 07:23:38 -0000 1.12 +++ ecore_evas_private.h 28 Jul 2005 14:09:09 -0000 1.13 @@ -139,6 +139,8 @@ char visible : 1; char should_be_visible : 1; + Ecore_Idle_Enterer *delete_idle_enterer; + Evas_Hash *data; struct { @@ -212,5 +214,6 @@ void _ecore_evas_fps_debug_init(void); void _ecore_evas_fps_debug_shutdown(void); void _ecore_evas_fps_debug_rendertime_add(double t); +void _ecore_evas_free(Ecore_Evas *ee); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/ecore_evas_x.c,v retrieving revision 1.50 retrieving revision 1.51 diff -u -3 -r1.50 -r1.51 --- ecore_evas_x.c 25 Jul 2005 09:55:47 -0000 1.50 +++ ecore_evas_x.c 28 Jul 2005 14:09:09 -0000 1.51 @@ -27,12 +27,14 @@ Evas_List *ll; #endif + if (ee->delete_idle_enterer) return; #ifdef BUILD_ECORE_EVAS_BUFFER for (ll = ee->sub_ecore_evas; ll; ll = ll->next) { Ecore_Evas *ee2; ee2 = ll->data; + if (ee2->delete_idle_enterer) continue; if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2); _ecore_evas_buffer_render(ee2); if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2); @@ -250,7 +252,11 @@ static Ecore_Evas * _ecore_evas_x_match(Ecore_X_Window win) { - return evas_hash_find(ecore_evases_hash, _ecore_evas_x_winid_str_get(win)); + Ecore_Evas *ee; + + ee = evas_hash_find(ecore_evases_hash, _ecore_evas_x_winid_str_get(win)); + if ((ee) && (ee->delete_idle_enterer)) return NULL; + return ee; } static void @@ -1500,7 +1506,7 @@ { int i; - while (ecore_evases) ecore_evas_free(ecore_evases); + while (ecore_evases) _ecore_evas_free(ecore_evases); for (i = 0; i < 16; i++) ecore_event_handler_del(ecore_evas_event_handlers[i]); ecore_idle_enterer_del(ecore_evas_idle_enterer); ------------------------------------------------------- SF.Net email is Sponsored by the Better Software Conference & EXPO September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs