hook client object unref callback to cleanup comp object internals

ensure cleanup occurs before client object is freed
This commit is contained in:
Mike Blumenkrantz 2017-06-16 14:59:42 -04:00
parent 4933569bc1
commit 9f5a07d788
1 changed files with 11 additions and 5 deletions

View File

@ -2340,9 +2340,7 @@ _e_comp_smart_hide(Evas_Object *obj)
{ {
INTERNAL_ENTRY; INTERNAL_ENTRY;
cw->visible = 0; cw->visible = 0;
cw->deleted = e_object_is_del(E_OBJECT(cw->ec)); cw->deleted |= cw->ec->delete_requested || e_object_is_del(E_OBJECT(cw->ec));
if (cw->deleted)
_e_comp_object_layers_remove(cw);
evas_object_hide(cw->clip); evas_object_hide(cw->clip);
if (cw->input_obj) evas_object_hide(cw->input_obj); if (cw->input_obj) evas_object_hide(cw->input_obj);
evas_object_hide(cw->effect_obj); evas_object_hide(cw->effect_obj);
@ -2417,6 +2415,15 @@ _e_comp_smart_show(Evas_Object *obj)
} }
} }
static void
_e_comp_object_client_del(void *d, void *obj EINA_UNUSED)
{
E_Comp_Object *cw = d;
cw->deleted = 1;
e_comp_object_render_update_del(cw->smart_obj);
_e_comp_object_layers_remove(cw);
}
static void static void
_e_comp_smart_del(Evas_Object *obj) _e_comp_smart_del(Evas_Object *obj)
{ {
@ -2425,8 +2432,6 @@ _e_comp_smart_del(Evas_Object *obj)
INTERNAL_ENTRY; INTERNAL_ENTRY;
if (!cw->deleted)
e_comp_object_render_update_del(cw->smart_obj);
E_FREE_FUNC(cw->updates, eina_tiler_free); E_FREE_FUNC(cw->updates, eina_tiler_free);
E_FREE_FUNC(cw->pending_updates, eina_tiler_free); E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
free(cw->ns); free(cw->ns);
@ -2983,6 +2988,7 @@ e_comp_object_client_add(E_Client *ec)
cw->ec = ec; cw->ec = ec;
ec->frame = o; ec->frame = o;
evas_object_data_set(o, "comp_object", (void*)1); evas_object_data_set(o, "comp_object", (void*)1);
e_object_delfn_add(E_OBJECT(ec), _e_comp_object_client_del, cw);
_e_comp_object_event_add(o); _e_comp_object_event_add(o);