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
This commit is contained in:
Jonathan Atton 2009-10-15 20:48:00 +00:00
parent 0b8583f293
commit d434116d77
4 changed files with 61 additions and 11 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -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);

View File

@ -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 *