defer evas destruction until idle time :)

SVN revision: 15933
This commit is contained in:
Carsten Haitzler 2005-07-28 14:09:09 +00:00
parent 3c16cf0327
commit a17ebe021d
4 changed files with 66 additions and 29 deletions

View File

@ -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(Ecore_Evas *ee)
"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 @@ _ecore_evas_fps_debug_rendertime_add(double t)
}
}
#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;
}

View File

@ -64,7 +64,9 @@ _ecore_evas_fb_match(void)
Ecore_Evas *ee;
ee = (Ecore_Evas *)l;
return ee;
if (ee->delete_idle_enterer) continue;
else
return ee;
}
return NULL;
}
@ -404,7 +406,7 @@ _ecore_evas_fb_shutdown(void)
{
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);

View File

@ -139,6 +139,8 @@ struct _Ecore_Evas
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_buffer_render(Ecore_Evas *ee);
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

View File

@ -27,12 +27,14 @@ _ecore_evas_x_render(Ecore_Evas *ee)
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 @@ _ecore_evas_x_winid_str_get(Ecore_X_Window win)
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 @@ _ecore_evas_x_shutdown(void)
{
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);