forked from enlightenment/efl
defer evas destruction until idle time :)
SVN revision: 15933
This commit is contained in:
parent
3c16cf0327
commit
a17ebe021d
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue