diff src/search.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 349ebc02b8e2
children 9a351e8f3b97
line wrap: on
line diff
--- a/src/search.c	Sat Jul 18 08:16:54 2009 +0000
+++ b/src/search.c	Tue Jul 21 14:17:01 2009 +0000
@@ -190,10 +190,6 @@
 	ThumbLoader *thumb_loader;
 	gboolean thumb_enable;
 	FileData *thumb_fd;
-
-	/* file list for edit menu */
-	GList *editmenu_fd_list;
-
 };
 
 typedef struct _MatchFileData MatchFileData;
@@ -984,20 +980,18 @@
 
 static void search_result_menu_destroy_cb(GtkWidget *widget, gpointer data)
 {
-	SearchData *sd = data;
-
-	filelist_free(sd->editmenu_fd_list);
-	sd->editmenu_fd_list = NULL;
+	GList *editmenu_fd_list = data;
+
+	filelist_free(editmenu_fd_list);
 }
 
 static GtkWidget *search_result_menu(SearchData *sd, gboolean on_row, gboolean empty)
 {
 	GtkWidget *menu;
 	GtkWidget *item;
+	GList *editmenu_fd_list;
 
 	menu = popup_menu_short_lived();
-	g_signal_connect(G_OBJECT(menu), "destroy",
-			 G_CALLBACK(search_result_menu_destroy_cb), sd);
 
 	menu_item_add_sensitive(menu, _("_View"), on_row,
 				G_CALLBACK(sr_menu_view_cb), sd);
@@ -1010,8 +1004,10 @@
 				G_CALLBACK(sr_menu_select_none_cb), sd);
 	menu_item_add_divider(menu);
 
-	sd->editmenu_fd_list = search_result_selection_list(sd);
-	submenu_add_edit(menu, &item, G_CALLBACK(sr_menu_edit_cb), sd, sd->editmenu_fd_list);
+	editmenu_fd_list = search_result_selection_list(sd);
+	g_signal_connect(G_OBJECT(menu), "destroy",
+			 G_CALLBACK(search_result_menu_destroy_cb), editmenu_fd_list);
+	submenu_add_edit(menu, &item, G_CALLBACK(sr_menu_edit_cb), sd, editmenu_fd_list);
 	if (!on_row) gtk_widget_set_sensitive(item, FALSE);
 	menu_item_add_stock_sensitive(menu, _("Add to new collection"), GTK_STOCK_INDEX, on_row,
 				      G_CALLBACK(sr_menu_collection_cb), sd);