From db920723386d92218361cc68f92213975e595b3b Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Tue, 20 Mar 2018 13:18:50 -0400 Subject: [PATCH] edje: implement invalidate method and unset device callbacks here prevent crashing in dangling callbacks ref d26124a6d818f62d892e178d92098f5159a8c9e0 Signed-off-by: Mike Blumenkrantz --- src/lib/edje/edje_load.c | 26 +++++++++++++++++--------- src/lib/edje/edje_private.h | 1 + src/lib/edje/edje_smart.c | 6 ++++++ src/lib/edje/efl_canvas_layout.eo | 1 + 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c index 609b60213c..bbc8ac2a50 100644 --- a/src/lib/edje/edje_load.c +++ b/src/lib/edje/edje_load.c @@ -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); } diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index 0261581f04..b1d2345e37 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -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); diff --git a/src/lib/edje/edje_smart.c b/src/lib/edje/edje_smart.c index 6b4ed89256..fa5efe1070 100644 --- a/src/lib/edje/edje_smart.c +++ b/src/lib/edje/edje_smart.c @@ -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) { diff --git a/src/lib/edje/efl_canvas_layout.eo b/src/lib/edje/efl_canvas_layout.eo index 3d86cbb958..5bae789666 100644 --- a/src/lib/edje/efl_canvas_layout.eo +++ b/src/lib/edje/efl_canvas_layout.eo @@ -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; }