Mercurial > geeqie.yaz
diff src/img-view.c @ 1675:717374fb1bbd
fixed destroying of menu data
Make sure that menu destroy functions do not access parent widget
structures that are already destroyed
There are 2 ways to achieve this:
- use g_signal_handlers_disconnect_matched() like in vf_destroy_cb()
- use separate data structure passed to *_popup_menu_destroy_cb()
like in img-view.
author | nadvornik |
---|---|
date | Tue, 21 Jul 2009 14:17:01 +0000 |
parents | ae0b1f854f22 |
children |
line wrap: on
line diff
--- a/src/img-view.c Sat Jul 18 08:16:54 2009 +0000 +++ b/src/img-view.c Tue Jul 21 14:17:01 2009 +0000 @@ -49,9 +49,6 @@ GList *list; GList *list_pointer; - - /* file list for edit menu */ - GList *editmenu_fd_list; }; @@ -1239,10 +1236,9 @@ static void view_popup_menu_destroy_cb(GtkWidget *widget, gpointer data) { - ViewWindow *vw = data; + GList *editmenu_fd_list = data; - filelist_free(vw->editmenu_fd_list); - vw->editmenu_fd_list = NULL; + filelist_free(editmenu_fd_list); } static GList *view_window_get_fd_list(ViewWindow *vw) @@ -1263,11 +1259,10 @@ { GtkWidget *menu; GtkWidget *item; + GList *editmenu_fd_list; menu = popup_menu_short_lived(); - g_signal_connect(G_OBJECT(menu), "destroy", - G_CALLBACK(view_popup_menu_destroy_cb), vw); menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(view_zoom_in_cb), vw); menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(view_zoom_out_cb), vw); @@ -1275,8 +1270,10 @@ menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(view_zoom_fit_cb), vw); menu_item_add_divider(menu); - vw->editmenu_fd_list = view_window_get_fd_list(vw); - item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw, vw->editmenu_fd_list); + editmenu_fd_list = view_window_get_fd_list(vw); + g_signal_connect(G_OBJECT(menu), "destroy", + G_CALLBACK(view_popup_menu_destroy_cb), editmenu_fd_list); + item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw, editmenu_fd_list); menu_item_add_divider(item); menu_item_add(item, _("Set as _wallpaper"), G_CALLBACK(view_wallpaper_cb), vw);