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_init_count = 0;
|
||||||
|
|
||||||
|
static int _ecore_evas_idle_enter_delete(void *data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query if a particular renginering engine target has support
|
* Query if a particular renginering engine target has support
|
||||||
* @param engine The engine to check support for
|
* @param engine The engine to check support for
|
||||||
|
@ -110,31 +112,10 @@ ecore_evas_free(Ecore_Evas *ee)
|
||||||
"ecore_evas_free");
|
"ecore_evas_free");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ECORE_MAGIC_SET(ee, ECORE_MAGIC_NONE);
|
if (ee->delete_idle_enterer) return;
|
||||||
while (ee->sub_ecore_evas)
|
ee->delete_idle_enterer =
|
||||||
{
|
ecore_idle_enterer_add(_ecore_evas_idle_enter_delete, ee);
|
||||||
ecore_evas_free(ee->sub_ecore_evas->data);
|
return;
|
||||||
}
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
|
@ -1603,3 +1584,48 @@ _ecore_evas_fps_debug_rendertime_add(double t)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#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;
|
Ecore_Evas *ee;
|
||||||
|
|
||||||
ee = (Ecore_Evas *)l;
|
ee = (Ecore_Evas *)l;
|
||||||
return ee;
|
if (ee->delete_idle_enterer) continue;
|
||||||
|
else
|
||||||
|
return ee;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -404,7 +406,7 @@ _ecore_evas_fb_shutdown(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
while (ecore_evases) ecore_evas_free(ecore_evases);
|
while (ecore_evases) _ecore_evas_free(ecore_evases);
|
||||||
for (i = 0; i < 5; i++)
|
for (i = 0; i < 5; i++)
|
||||||
ecore_event_handler_del(ecore_evas_event_handlers[i]);
|
ecore_event_handler_del(ecore_evas_event_handlers[i]);
|
||||||
ecore_idle_enterer_del(ecore_evas_idle_enterer);
|
ecore_idle_enterer_del(ecore_evas_idle_enterer);
|
||||||
|
|
|
@ -139,6 +139,8 @@ struct _Ecore_Evas
|
||||||
char visible : 1;
|
char visible : 1;
|
||||||
char should_be_visible : 1;
|
char should_be_visible : 1;
|
||||||
|
|
||||||
|
Ecore_Idle_Enterer *delete_idle_enterer;
|
||||||
|
|
||||||
Evas_Hash *data;
|
Evas_Hash *data;
|
||||||
|
|
||||||
struct {
|
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_init(void);
|
||||||
void _ecore_evas_fps_debug_shutdown(void);
|
void _ecore_evas_fps_debug_shutdown(void);
|
||||||
void _ecore_evas_fps_debug_rendertime_add(double t);
|
void _ecore_evas_fps_debug_rendertime_add(double t);
|
||||||
|
void _ecore_evas_free(Ecore_Evas *ee);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -27,12 +27,14 @@ _ecore_evas_x_render(Ecore_Evas *ee)
|
||||||
Evas_List *ll;
|
Evas_List *ll;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (ee->delete_idle_enterer) return;
|
||||||
#ifdef BUILD_ECORE_EVAS_BUFFER
|
#ifdef BUILD_ECORE_EVAS_BUFFER
|
||||||
for (ll = ee->sub_ecore_evas; ll; ll = ll->next)
|
for (ll = ee->sub_ecore_evas; ll; ll = ll->next)
|
||||||
{
|
{
|
||||||
Ecore_Evas *ee2;
|
Ecore_Evas *ee2;
|
||||||
|
|
||||||
ee2 = ll->data;
|
ee2 = ll->data;
|
||||||
|
if (ee2->delete_idle_enterer) continue;
|
||||||
if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
|
if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
|
||||||
_ecore_evas_buffer_render(ee2);
|
_ecore_evas_buffer_render(ee2);
|
||||||
if (ee2->func.fn_post_render) ee2->func.fn_post_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 *
|
static Ecore_Evas *
|
||||||
_ecore_evas_x_match(Ecore_X_Window win)
|
_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
|
static void
|
||||||
|
@ -1500,7 +1506,7 @@ _ecore_evas_x_shutdown(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
while (ecore_evases) ecore_evas_free(ecore_evases);
|
while (ecore_evases) _ecore_evas_free(ecore_evases);
|
||||||
for (i = 0; i < 16; i++)
|
for (i = 0; i < 16; i++)
|
||||||
ecore_event_handler_del(ecore_evas_event_handlers[i]);
|
ecore_event_handler_del(ecore_evas_event_handlers[i]);
|
||||||
ecore_idle_enterer_del(ecore_evas_idle_enterer);
|
ecore_idle_enterer_del(ecore_evas_idle_enterer);
|
||||||
|
|
Loading…
Reference in New Issue