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