From 7277ce21b1459ae09ff529c9870fff2f4b5f301e Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 26 Nov 2012 06:38:43 +0000 Subject: [PATCH] fix segv where menus are not actually popped down on deletion of gcc. SVN revision: 79669 --- src/bin/e_gadcon.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/bin/e_gadcon.c b/src/bin/e_gadcon.c index 6cc483ef5..ad78617a1 100644 --- a/src/bin/e_gadcon.c +++ b/src/bin/e_gadcon.c @@ -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); }