forked from enlightenment/efl
efl_ui: fix not to call _on_child_del() after container is deleted
If efl_ref() is called to child, then child may not be deleted when container is deleted. This causes _on_child_del() is called after container is deleted and it causes crash if container data is accessed in _on_child_del(). To resolve the above issue, all callbacks of child are deleted not to call _on_child_del() after container is deleted.
This commit is contained in:
parent
25aec3ba7b
commit
f3b9f7f0d8
|
@ -180,6 +180,19 @@ _efl_ui_box_efl_object_constructor(Eo *obj, Efl_Ui_Box_Data *pd)
|
|||
return obj;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_box_efl_object_invalidate(Eo *obj, Efl_Ui_Box_Data *pd)
|
||||
{
|
||||
Eo *child;
|
||||
|
||||
efl_invalidate(efl_super(obj, MY_CLASS));
|
||||
|
||||
EINA_LIST_FREE(pd->children, child)
|
||||
{
|
||||
efl_event_callback_array_del(child, efl_ui_box_callbacks(), obj);
|
||||
}
|
||||
}
|
||||
|
||||
/* CLEAN API BELOW */
|
||||
|
||||
EOLIAN static int
|
||||
|
|
|
@ -29,6 +29,7 @@ class @beta Efl.Ui.Box extends Efl.Ui.Widget implements Efl.Pack_Linear, Efl.Pac
|
|||
}
|
||||
implements {
|
||||
Efl.Object.constructor;
|
||||
Efl.Object.invalidate;
|
||||
Efl.Canvas.Group.group_calculate;
|
||||
Efl.Gfx.Entity.position { set; }
|
||||
Efl.Gfx.Entity.size { set; }
|
||||
|
|
|
@ -555,6 +555,19 @@ _efl_ui_relative_layout_efl_object_constructor(Eo *obj, Efl_Ui_Relative_Layout_D
|
|||
return obj;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_relative_layout_efl_object_invalidate(Eo *obj, Efl_Ui_Relative_Layout_Data *pd)
|
||||
{
|
||||
Eo *child;
|
||||
|
||||
efl_invalidate(efl_super(obj, MY_CLASS));
|
||||
|
||||
EINA_LIST_FREE(pd->children, child)
|
||||
{
|
||||
efl_event_callback_array_del(child, efl_ui_relative_layout_callbacks(), pd);
|
||||
}
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_relative_layout_efl_object_destructor(Eo *obj, Efl_Ui_Relative_Layout_Data *pd)
|
||||
{
|
||||
|
|
|
@ -69,6 +69,7 @@ class @beta Efl.Ui.Relative_Layout extends Efl.Ui.Widget implements Efl.Pack_Lay
|
|||
}
|
||||
implements {
|
||||
Efl.Object.constructor;
|
||||
Efl.Object.invalidate;
|
||||
Efl.Object.destructor;
|
||||
Efl.Canvas.Group.group_calculate;
|
||||
Efl.Gfx.Entity.position { set; }
|
||||
|
|
|
@ -234,6 +234,19 @@ _efl_ui_table_efl_object_constructor(Eo *obj, Efl_Ui_Table_Data *pd)
|
|||
return obj;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_table_efl_object_invalidate(Eo *obj, Efl_Ui_Table_Data *pd)
|
||||
{
|
||||
Table_Item *gi;
|
||||
|
||||
efl_invalidate(efl_super(obj, MY_CLASS));
|
||||
|
||||
EINA_INLIST_FREE(EINA_INLIST_GET(pd->items), gi)
|
||||
{
|
||||
efl_event_callback_array_del(gi->object, efl_ui_table_callbacks(), obj);
|
||||
}
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_efl_ui_table_efl_pack_pack_padding_set(Eo *obj, Efl_Ui_Table_Data *pd, double h, double v, Eina_Bool scalable)
|
||||
{
|
||||
|
|
|
@ -19,6 +19,7 @@ class @beta Efl.Ui.Table extends Efl.Ui.Widget implements Efl.Pack_Table, Efl.Pa
|
|||
}
|
||||
implements {
|
||||
Efl.Object.constructor;
|
||||
Efl.Object.invalidate;
|
||||
Efl.Canvas.Group.group_calculate;
|
||||
Efl.Gfx.Entity.position { set; }
|
||||
Efl.Gfx.Entity.size { set; }
|
||||
|
|
Loading…
Reference in New Issue