From e8735068aca1717b19b3379d58ab592d8e34dd0e Mon Sep 17 00:00:00 2001 From: JinYong Park Date: Mon, 18 Dec 2017 14:08:08 +0900 Subject: [PATCH] Efl.Ui.Popup.Anchor: remove event callback when popup is deleted Summary: When popup is deleted, popup didn't remove event callback which its parent and anchor object. So before popup destruction, detach anchor. Test Plan: elementary_test -to efl.ui.popup.anchor Reviewers: Jaehyun_Cho, herb, woohyun, jpeg, cedric Reviewed By: Jaehyun_Cho Differential Revision: https://phab.enlightenment.org/D5667 --- src/lib/elementary/efl_ui_popup_anchor.c | 46 +++++++---------------- src/lib/elementary/efl_ui_popup_anchor.eo | 1 + 2 files changed, 15 insertions(+), 32 deletions(-) diff --git a/src/lib/elementary/efl_ui_popup_anchor.c b/src/lib/elementary/efl_ui_popup_anchor.c index c1bf965b8b..9112a0cc5b 100644 --- a/src/lib/elementary/efl_ui_popup_anchor.c +++ b/src/lib/elementary/efl_ui_popup_anchor.c @@ -23,16 +23,9 @@ _anchor_calc(Eo *obj) Eina_Position2D pos = {0, 0}; - Eo *parent = efl_provider_find(obj, EFL_UI_WIN_CLASS); - if (!parent) - { - ERR("Cannot find window parent"); - return; - } - Eina_Rect a_geom = efl_gfx_geometry_get(pd->anchor); Eina_Rect o_geom = efl_gfx_geometry_get(obj); - Eina_Rect p_geom = efl_gfx_geometry_get(parent); + Eina_Rect p_geom = efl_gfx_geometry_get(ppd->win_parent); pd->used_align = EFL_UI_POPUP_ALIGN_NONE; @@ -214,14 +207,7 @@ _anchor_del_cb(void *data, const Efl_Event *ev EINA_UNUSED) EFL_UI_POPUP_DATA_GET_OR_RETURN(data, ppd); EFL_UI_POPUP_ANCHOR_DATA_GET(data, pd); - Eo *parent = efl_provider_find(data, EFL_UI_WIN_CLASS); - if (!parent) - { - ERR("Cannot find window parent"); - return; - } - - efl_event_callback_del(parent, EFL_GFX_EVENT_RESIZE, _anchor_geom_cb, data); + efl_event_callback_del(ppd->win_parent, EFL_GFX_EVENT_RESIZE, _anchor_geom_cb, data); pd->anchor = NULL; //Add align calc only @@ -233,18 +219,12 @@ _anchor_del_cb(void *data, const Efl_Event *ev EINA_UNUSED) static void _anchor_detach(Eo *obj) { + EFL_UI_POPUP_DATA_GET_OR_RETURN(obj, ppd); EFL_UI_POPUP_ANCHOR_DATA_GET(obj, pd); if (!pd->anchor) return; - Eo *parent = efl_provider_find(obj, EFL_UI_WIN_CLASS); - if (!parent) - { - ERR("Cannot find window parent"); - return; - } - - efl_event_callback_del(parent, EFL_GFX_EVENT_RESIZE, _anchor_geom_cb, obj); + efl_event_callback_del(ppd->win_parent, EFL_GFX_EVENT_RESIZE, _anchor_geom_cb, obj); efl_event_callback_del(pd->anchor, EFL_GFX_EVENT_RESIZE, _anchor_geom_cb, obj); efl_event_callback_del(pd->anchor, EFL_GFX_EVENT_MOVE, _anchor_geom_cb, obj); efl_event_callback_del(pd->anchor, EFL_EVENT_DEL, _anchor_del_cb, obj); @@ -260,14 +240,7 @@ _efl_ui_popup_anchor_anchor_set(Eo *obj, Efl_Ui_Popup_Anchor_Data *pd, Eo *ancho if (anchor) { - Eo *parent = efl_provider_find(obj, EFL_UI_WIN_CLASS); - if (!parent) - { - ERR("Cannot find window parent"); - return; - } - - efl_event_callback_add(parent, EFL_GFX_EVENT_RESIZE, _anchor_geom_cb, obj); + efl_event_callback_add(ppd->win_parent, EFL_GFX_EVENT_RESIZE, _anchor_geom_cb, obj); efl_event_callback_add(anchor, EFL_GFX_EVENT_RESIZE, _anchor_geom_cb, obj); efl_event_callback_add(anchor, EFL_GFX_EVENT_MOVE, _anchor_geom_cb, obj); efl_event_callback_add(anchor, EFL_EVENT_DEL, _anchor_del_cb, obj); @@ -369,4 +342,13 @@ _efl_ui_popup_anchor_efl_object_constructor(Eo *obj, return obj; } +EOLIAN static void +_efl_ui_popup_anchor_efl_object_destructor(Eo *obj, + Efl_Ui_Popup_Anchor_Data *pd EINA_UNUSED) +{ + _anchor_detach(obj); + + efl_destructor(efl_super(obj, MY_CLASS)); +} + #include "efl_ui_popup_anchor.eo.c" diff --git a/src/lib/elementary/efl_ui_popup_anchor.eo b/src/lib/elementary/efl_ui_popup_anchor.eo index 1bdd8684e6..9490e491ce 100644 --- a/src/lib/elementary/efl_ui_popup_anchor.eo +++ b/src/lib/elementary/efl_ui_popup_anchor.eo @@ -35,6 +35,7 @@ class Efl.Ui.Popup_Anchor(Efl.Ui.Popup) } implements { Efl.Object.constructor; + Efl.Object.destructor; Efl.Canvas.Group.group_calculate; Efl.Gfx.position { set; } }