From d434116d779a7ddf96716ed841f965e2a0068a74 Mon Sep 17 00:00:00 2001 From: Jonathan Atton Date: Thu, 15 Oct 2009 20:48:00 +0000 Subject: [PATCH] Elm : delete some added callback. The callbacks associated to the parent by the hover was not deleted when the parent is deleted SVN revision: 43102 --- legacy/elementary/src/lib/elm_hover.c | 2 +- legacy/elementary/src/lib/elm_menu.c | 20 +++++++++++++-- legacy/elementary/src/lib/elm_notify.c | 16 ++++++++++++ legacy/elementary/src/lib/elm_toolbar.c | 34 +++++++++++++++++++------ 4 files changed, 61 insertions(+), 11 deletions(-) diff --git a/legacy/elementary/src/lib/elm_hover.c b/legacy/elementary/src/lib/elm_hover.c index 84dcaef449..7bd110eff9 100644 --- a/legacy/elementary/src/lib/elm_hover.c +++ b/legacy/elementary/src/lib/elm_hover.c @@ -238,7 +238,7 @@ _parent_del(void *data, Evas *e, Evas_Object *obj, void *event_info) { Widget_Data *wd = elm_widget_data_get(data); - wd->parent = NULL; + elm_hover_parent_set(data, NULL); _sizing_eval(data); } diff --git a/legacy/elementary/src/lib/elm_menu.c b/legacy/elementary/src/lib/elm_menu.c index 9ae6b7dbf7..65dbaee386 100644 --- a/legacy/elementary/src/lib/elm_menu.c +++ b/legacy/elementary/src/lib/elm_menu.c @@ -53,6 +53,16 @@ static void _item_sizing_eval(Elm_Menu_Item *item); static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _submenu_hide(Elm_Menu_Item *item); static void _submenu_open(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _parent_resize(void *data, Evas *e, Evas_Object *obj, void *event_info); + +static void +_del_pre_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + + evas_object_event_callback_del(wd->parent, EVAS_CALLBACK_RESIZE, _parent_resize); +} + static void _del_hook(Evas_Object *obj) @@ -71,7 +81,7 @@ _del_hook(Evas_Object *obj) ll = eina_list_append(ll, item->items); if (item->label) eina_stringshare_del(item->label); - if (item->bx) + if (item->hv) { evas_object_del(item->hv); evas_object_del(item->location); @@ -79,10 +89,15 @@ _del_hook(Evas_Object *obj) free(item); } } + if (wd->hv) + { + evas_object_del(wd->hv); + evas_object_del(wd->location); + } free(wd); } -static void + static void _theme_hook(Evas_Object *obj) { Eina_List *l, *_l, *ll = NULL; @@ -429,6 +444,7 @@ elm_menu_add(Evas_Object *parent) elm_widget_type_set(obj, "menu"); elm_widget_sub_object_add(parent, obj); elm_widget_data_set(obj, wd); + elm_widget_del_hook_set(obj, _del_pre_hook); elm_widget_del_hook_set(obj, _del_hook); elm_widget_theme_hook_set(obj, _theme_hook); diff --git a/legacy/elementary/src/lib/elm_notify.c b/legacy/elementary/src/lib/elm_notify.c index d19d8db353..9d43b40dea 100644 --- a/legacy/elementary/src/lib/elm_notify.c +++ b/legacy/elementary/src/lib/elm_notify.c @@ -31,6 +31,21 @@ static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *eve static void _sub_del(void *data, Evas_Object *obj, void *event_info); static void _calc(Evas_Object *obj); static void _content_resize(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _show(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _hide(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _resize(void *data, Evas *e, Evas_Object *obj, void *event_info); + + static void +_del_pre_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + + evas_object_event_callback_del(obj, EVAS_CALLBACK_RESIZE, _resize); + evas_object_event_callback_del(obj, EVAS_CALLBACK_MOVE, _resize); + evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _show); + evas_object_event_callback_del(obj, EVAS_CALLBACK_HIDE, _hide); +} + static void _del_hook(Evas_Object *obj) @@ -205,6 +220,7 @@ elm_notify_add(Evas_Object *parent) elm_widget_type_set(obj, "notify"); elm_widget_sub_object_add(parent, obj); elm_widget_data_set(obj, wd); + elm_widget_del_pre_hook_set(obj, _del_pre_hook); elm_widget_del_hook_set(obj, _del_hook); elm_widget_theme_hook_set(obj, _theme_hook); diff --git a/legacy/elementary/src/lib/elm_toolbar.c b/legacy/elementary/src/lib/elm_toolbar.c index 36c2087c99..08f72928c8 100644 --- a/legacy/elementary/src/lib/elm_toolbar.c +++ b/legacy/elementary/src/lib/elm_toolbar.c @@ -125,6 +125,19 @@ _item_disable(Elm_Toolbar_Item *it, Eina_Bool disabled) edje_object_signal_emit(it->base, "elm,state,enabled", "elm"); } + static void +_del_pre_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Elm_Toolbar_Item *it; + + if (!wd) return; + EINA_LIST_FREE(wd->items, it) + { + elm_toolbar_item_menu_set(it, 0); + } +} + static void _del_hook(Evas_Object *obj) { @@ -138,6 +151,7 @@ _del_hook(Evas_Object *obj) if (it->icon) evas_object_del(it->icon); evas_object_del(it->base); free(it); + elm_toolbar_item_menu_set(it, 0); } free(wd); } @@ -282,6 +296,7 @@ elm_toolbar_add(Evas_Object *parent) elm_widget_type_set(obj, "toolbar"); elm_widget_sub_object_add(parent, obj); elm_widget_data_set(obj, wd); + elm_widget_del_pre_hook_set(obj, _del_pre_hook); elm_widget_del_hook_set(obj, _del_hook); elm_widget_theme_hook_set(obj, _theme_hook); elm_widget_can_focus_set(obj, 0); @@ -539,19 +554,22 @@ elm_toolbar_item_menu_set(Elm_Toolbar_Item *item, Eina_Bool menu) if (!item) return; if (item->menu == menu) return; item->menu = menu; - + Widget_Data *wd = elm_widget_data_get(item->obj); if (!wd) return; if(menu) - { - item->o_menu = elm_menu_add(item->base); - if(wd->menu_parent) - elm_menu_parent_set(item->o_menu, wd->menu_parent); + { + item->o_menu = elm_menu_add(item->base); + if(wd->menu_parent) + elm_menu_parent_set(item->o_menu, wd->menu_parent); evas_object_event_callback_add(item->o_menu, EVAS_CALLBACK_HIDE, _menu_hide, item); - } - else - evas_object_del(item->o_menu); + } + else if(item->o_menu) + { + evas_object_event_callback_del(item->o_menu, EVAS_CALLBACK_HIDE, _menu_hide); + evas_object_del(item->o_menu); + } } EAPI Evas_Object *