edje: implement invalidate method and unset device callbacks here

prevent crashing in dangling callbacks

ref d26124a6d818f62d892e178d92098f5159a8c9e0

Signed-off-by: Mike Blumenkrantz <zmike@osg.samsung.com>
This commit is contained in:
Cedric BAIL 2018-03-20 13:18:50 -04:00 committed by Cedric Bail
parent cd8952cc6c
commit db92072338
4 changed files with 25 additions and 9 deletions

View File

@ -1850,6 +1850,22 @@ _edje_object_collect(Edje *ed)
return collect;
}
void
_edje_file_callbacks_del(Edje *ed, Evas *e)
{
Evas *tev = e;
if (!tev) tev = evas_object_evas_get(ed->obj);
efl_event_callback_del(tev, EFL_EVENT_DEL, _edje_device_canvas_del, ed);
efl_event_callback_del(tev, EFL_CANVAS_EVENT_DEVICE_ADDED,
_edje_device_added_cb, ed);
efl_event_callback_del(tev, EFL_CANVAS_EVENT_DEVICE_REMOVED,
_edje_device_removed_cb, ed);
if (ed->collection && ed->collection->use_custom_seat_names)
efl_event_callback_del(tev, EFL_CANVAS_EVENT_DEVICE_CHANGED,
_edje_device_changed_cb, ed);
}
void
_edje_file_del(Edje *ed)
{
@ -1863,15 +1879,7 @@ _edje_file_del(Edje *ed)
if (tev)
{
efl_event_callback_del(tev, EFL_EVENT_DEL, _edje_device_canvas_del, ed);
efl_event_callback_del(tev, EFL_CANVAS_EVENT_DEVICE_ADDED,
_edje_device_added_cb, ed);
efl_event_callback_del(tev, EFL_CANVAS_EVENT_DEVICE_REMOVED,
_edje_device_removed_cb, ed);
if (ed->collection && ed->collection->use_custom_seat_names)
efl_event_callback_del(tev, EFL_CANVAS_EVENT_DEVICE_CHANGED,
_edje_device_changed_cb, ed);
_edje_file_callbacks_del(ed, tev);
evas_event_freeze(tev);
}

View File

@ -2497,6 +2497,7 @@ EAPI void _edje_edd_shutdown(void);
int _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const char *group, const char *parent, Eina_List *group_path, Eina_Array *nested);
void _edje_file_callbacks_del(Edje *ed, Evas *e);
void _edje_file_del(Edje *ed);
void _edje_file_free(Edje_File *edf);
void _edje_file_cache_shutdown(void);

View File

@ -47,6 +47,12 @@ _efl_canvas_layout_efl_object_constructor(Eo *obj, Edje *ed)
return obj;
}
EOLIAN static void
_efl_canvas_layout_efl_object_invalidate(Eo *obj EINA_UNUSED, Edje *ed)
{
_edje_file_callbacks_del(ed, NULL);
}
EOLIAN static void
_efl_canvas_layout_efl_object_debug_name_override(Eo *obj, Edje *ed, Eina_Strbuf *sb)
{

View File

@ -84,6 +84,7 @@ class Efl.Canvas.Layout (Efl.Canvas.Group, Efl.File, Efl.Container, Efl.Part,
Efl.Gfx.position { set; }
Efl.Gfx.size { set; }
Efl.Object.constructor;
Efl.Object.invalidate;
Efl.Object.debug_name_override;
Efl.Canvas.Object.no_render { set; }
Efl.Canvas.Object.paragraph_direction { set; }