comparison 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
comparison
equal deleted inserted replaced
1697:219e1ba3ae30 1698:bfe04f01de5e
188 FileData *click_fd; 188 FileData *click_fd;
189 189
190 ThumbLoader *thumb_loader; 190 ThumbLoader *thumb_loader;
191 gboolean thumb_enable; 191 gboolean thumb_enable;
192 FileData *thumb_fd; 192 FileData *thumb_fd;
193
194 /* file list for edit menu */
195 GList *editmenu_fd_list;
196
197 }; 193 };
198 194
199 typedef struct _MatchFileData MatchFileData; 195 typedef struct _MatchFileData MatchFileData;
200 struct _MatchFileData 196 struct _MatchFileData
201 { 197 {
982 search_result_clear(sd); 978 search_result_clear(sd);
983 } 979 }
984 980
985 static void search_result_menu_destroy_cb(GtkWidget *widget, gpointer data) 981 static void search_result_menu_destroy_cb(GtkWidget *widget, gpointer data)
986 { 982 {
987 SearchData *sd = data; 983 GList *editmenu_fd_list = data;
988 984
989 filelist_free(sd->editmenu_fd_list); 985 filelist_free(editmenu_fd_list);
990 sd->editmenu_fd_list = NULL;
991 } 986 }
992 987
993 static GtkWidget *search_result_menu(SearchData *sd, gboolean on_row, gboolean empty) 988 static GtkWidget *search_result_menu(SearchData *sd, gboolean on_row, gboolean empty)
994 { 989 {
995 GtkWidget *menu; 990 GtkWidget *menu;
996 GtkWidget *item; 991 GtkWidget *item;
992 GList *editmenu_fd_list;
997 993
998 menu = popup_menu_short_lived(); 994 menu = popup_menu_short_lived();
999 g_signal_connect(G_OBJECT(menu), "destroy",
1000 G_CALLBACK(search_result_menu_destroy_cb), sd);
1001 995
1002 menu_item_add_sensitive(menu, _("_View"), on_row, 996 menu_item_add_sensitive(menu, _("_View"), on_row,
1003 G_CALLBACK(sr_menu_view_cb), sd); 997 G_CALLBACK(sr_menu_view_cb), sd);
1004 menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, on_row, 998 menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, on_row,
1005 G_CALLBACK(sr_menu_viewnew_cb), sd); 999 G_CALLBACK(sr_menu_viewnew_cb), sd);
1008 G_CALLBACK(sr_menu_select_all_cb), sd); 1002 G_CALLBACK(sr_menu_select_all_cb), sd);
1009 menu_item_add_sensitive(menu, _("Select none"), !empty, 1003 menu_item_add_sensitive(menu, _("Select none"), !empty,
1010 G_CALLBACK(sr_menu_select_none_cb), sd); 1004 G_CALLBACK(sr_menu_select_none_cb), sd);
1011 menu_item_add_divider(menu); 1005 menu_item_add_divider(menu);
1012 1006
1013 sd->editmenu_fd_list = search_result_selection_list(sd); 1007 editmenu_fd_list = search_result_selection_list(sd);
1014 submenu_add_edit(menu, &item, G_CALLBACK(sr_menu_edit_cb), sd, sd->editmenu_fd_list); 1008 g_signal_connect(G_OBJECT(menu), "destroy",
1009 G_CALLBACK(search_result_menu_destroy_cb), editmenu_fd_list);
1010 submenu_add_edit(menu, &item, G_CALLBACK(sr_menu_edit_cb), sd, editmenu_fd_list);
1015 if (!on_row) gtk_widget_set_sensitive(item, FALSE); 1011 if (!on_row) gtk_widget_set_sensitive(item, FALSE);
1016 menu_item_add_stock_sensitive(menu, _("Add to new collection"), GTK_STOCK_INDEX, on_row, 1012 menu_item_add_stock_sensitive(menu, _("Add to new collection"), GTK_STOCK_INDEX, on_row,
1017 G_CALLBACK(sr_menu_collection_cb), sd); 1013 G_CALLBACK(sr_menu_collection_cb), sd);
1018 menu_item_add_stock_sensitive(menu, _("Print..."), GTK_STOCK_PRINT, on_row, 1014 menu_item_add_stock_sensitive(menu, _("Print..."), GTK_STOCK_PRINT, on_row,
1019 G_CALLBACK(sr_menu_print_cb), sd); 1015 G_CALLBACK(sr_menu_print_cb), sd);