fix segv where menus are not actually popped down on deletion of gcc.

SVN revision: 79669
This commit is contained in:
Carsten Haitzler 2012-11-26 06:38:43 +00:00
parent 108b985e87
commit 7277ce21b1
1 changed files with 18 additions and 2 deletions

View File

@ -1590,6 +1590,7 @@ _e_gadcon_client_unpopulate(E_Gadcon_Client *gcc)
{
if (gcc->gadcon->shelf && (gcc->menu == gcc->gadcon->shelf->menu)) gcc->gadcon->shelf->menu = NULL;
e_menu_post_deactivate_callback_set(gcc->menu, NULL, NULL);
e_menu_deactivate(gcc->menu);
e_object_del(E_OBJECT(gcc->menu));
gcc->menu = NULL;
}
@ -1645,8 +1646,10 @@ _e_gadcon_gadget_move_to_pre_cb(void *data, E_Menu *m)
E_Gadcon_Client *gcc;
int n = 0;
e_menu_pre_activate_callback_set(m, NULL, NULL);
gcc = data;
printf("gcc = %p, magic = %x\n", gcc, gcc->e_obj_inherit.magic);
e_menu_pre_activate_callback_set(m, NULL, NULL);
printf("gcc = %p, magic = %x\n", gcc, gcc->e_obj_inherit.magic);
if (!gcc->client_class->func.is_site || gcc->client_class->func.is_site(E_GADCON_SITE_SHELF))
_e_gadcon_add_locations_menu_for_site(m, gcc, E_GADCON_SITE_SHELF, &n);
@ -1659,6 +1662,8 @@ _e_gadcon_gadget_move_to_pre_cb(void *data, E_Menu *m)
_e_gadcon_add_locations_menu_for_site(m, gcc, E_GADCON_SITE_UNKNOWN, &n);
}
extern void *eobj_watch;
EAPI void
e_gadcon_client_add_location_menu(E_Gadcon_Client *gcc, E_Menu *menu)
{
@ -1675,8 +1680,11 @@ e_gadcon_client_add_location_menu(E_Gadcon_Client *gcc, E_Menu *menu)
e_menu_item_label_set(mi, _("Move to"));
e_util_menu_item_theme_icon_set(mi, "preferences-look");
e_menu_item_submenu_set(mi, mn);
e_object_unref(E_OBJECT(mn));
printf("add menu gcc = %p, magic = %x\n", gcc, gcc->e_obj_inherit.magic);
eobj_watch = gcc;
e_menu_pre_activate_callback_set(mn, _e_gadcon_gadget_move_to_pre_cb, gcc);
e_object_unref(E_OBJECT(mn));
printf("add menu gcc = %p, magic = %x\n", gcc, gcc->e_obj_inherit.magic);
}
}
@ -1715,6 +1723,7 @@ e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu_gadget
e_menu_post_deactivate_callback_set(menu_main, _e_gadcon_client_cb_menu_post, gcc);
gcc->menu = menu_main;
printf("new menu = %p\n", gcc->menu);
if ((gcc->gadcon->shelf) || (gcc->gadcon->toolbar))
{
if (e_menu_item_nth(menu_gadget, 0))
@ -2059,6 +2068,7 @@ _e_gadcon_client_delfn(void *d __UNUSED__, void *o)
{
if (gcc->gadcon->shelf && (gcc->menu == gcc->gadcon->shelf->menu)) gcc->gadcon->shelf->menu = NULL;
e_menu_post_deactivate_callback_set(gcc->menu, NULL, NULL);
e_menu_deactivate(gcc->menu);
e_object_del(E_OBJECT(gcc->menu));
gcc->menu = NULL;
}
@ -2083,6 +2093,12 @@ _e_gadcon_client_free(E_Gadcon_Client *gcc)
if (gcc->o_frame) evas_object_del(gcc->o_frame);
eina_stringshare_del(gcc->name);
eina_stringshare_del(gcc->style);
if (gcc->menu)
{
printf("free active menu %p\n", gcc->menu);
e_menu_deactivate(gcc->menu);
e_object_del(E_OBJECT(gcc->menu));
}
free(gcc);
}