diff src/pan-view.c @ 1698:bfe04f01de5e

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 2a96ff43ab3e
children decb3b64ae74
line wrap: on
line diff
--- a/src/pan-view.c	Sat Jul 18 08:16:54 2009 +0000
+++ b/src/pan-view.c	Tue Jul 21 14:17:01 2009 +0000
@@ -2778,10 +2778,9 @@
 
 static void pan_popup_menu_destroy_cb(GtkWidget *widget, gpointer data)
 {
-	PanWindow *pw = data;
-
-	filelist_free(pw->editmenu_fd_list);
-	pw->editmenu_fd_list = NULL;
+	GList *editmenu_fd_list = data;
+
+	filelist_free(editmenu_fd_list);
 }
 
 static GList *pan_view_get_fd_list(PanWindow *pw)
@@ -2800,6 +2799,7 @@
 	GtkWidget *submenu;
 	GtkWidget *item;
 	gboolean active;
+	GList *editmenu_fd_list;
 
 	active = (pw->click_pi != NULL);
 
@@ -2815,8 +2815,11 @@
 			    G_CALLBACK(pan_zoom_1_1_cb), pw);
 	menu_item_add_divider(menu);
 
-	pw->editmenu_fd_list = pan_view_get_fd_list(pw);
-	submenu_add_edit(menu, &item, G_CALLBACK(pan_edit_cb), pw, pw->editmenu_fd_list);
+	editmenu_fd_list = pan_view_get_fd_list(pw);
+	g_signal_connect(G_OBJECT(menu), "destroy",
+			 G_CALLBACK(pan_popup_menu_destroy_cb), editmenu_fd_list);
+
+	submenu_add_edit(menu, &item, G_CALLBACK(pan_edit_cb), pw, editmenu_fd_list);
 	gtk_widget_set_sensitive(item, active);
 	
 	menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, active,