comparison src/search.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 24a12aa0cb54
children 760e8d68290c
comparison
equal deleted inserted replaced
1674:d5c921f9bb4c 1675:717374fb1bbd
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 {
986 search_result_clear(sd); 982 search_result_clear(sd);
987 } 983 }
988 984
989 static void search_result_menu_destroy_cb(GtkWidget *widget, gpointer data) 985 static void search_result_menu_destroy_cb(GtkWidget *widget, gpointer data)
990 { 986 {
991 SearchData *sd = data; 987 GList *editmenu_fd_list = data;
992 988
993 filelist_free(sd->editmenu_fd_list); 989 filelist_free(editmenu_fd_list);
994 sd->editmenu_fd_list = NULL;
995 } 990 }
996 991
997 static GtkWidget *search_result_menu(SearchData *sd, gboolean on_row, gboolean empty) 992 static GtkWidget *search_result_menu(SearchData *sd, gboolean on_row, gboolean empty)
998 { 993 {
999 GtkWidget *menu; 994 GtkWidget *menu;
1000 GtkWidget *item; 995 GtkWidget *item;
996 GList *editmenu_fd_list;
1001 997
1002 menu = popup_menu_short_lived(); 998 menu = popup_menu_short_lived();
1003 g_signal_connect(G_OBJECT(menu), "destroy",
1004 G_CALLBACK(search_result_menu_destroy_cb), sd);
1005 999
1006 menu_item_add_sensitive(menu, _("_View"), on_row, 1000 menu_item_add_sensitive(menu, _("_View"), on_row,
1007 G_CALLBACK(sr_menu_view_cb), sd); 1001 G_CALLBACK(sr_menu_view_cb), sd);
1008 menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, on_row, 1002 menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, on_row,
1009 G_CALLBACK(sr_menu_viewnew_cb), sd); 1003 G_CALLBACK(sr_menu_viewnew_cb), sd);
1012 G_CALLBACK(sr_menu_select_all_cb), sd); 1006 G_CALLBACK(sr_menu_select_all_cb), sd);
1013 menu_item_add_sensitive(menu, _("Select none"), !empty, 1007 menu_item_add_sensitive(menu, _("Select none"), !empty,
1014 G_CALLBACK(sr_menu_select_none_cb), sd); 1008 G_CALLBACK(sr_menu_select_none_cb), sd);
1015 menu_item_add_divider(menu); 1009 menu_item_add_divider(menu);
1016 1010
1017 sd->editmenu_fd_list = search_result_selection_list(sd); 1011 editmenu_fd_list = search_result_selection_list(sd);
1018 submenu_add_edit(menu, &item, G_CALLBACK(sr_menu_edit_cb), sd, sd->editmenu_fd_list); 1012 g_signal_connect(G_OBJECT(menu), "destroy",
1013 G_CALLBACK(search_result_menu_destroy_cb), editmenu_fd_list);
1014 submenu_add_edit(menu, &item, G_CALLBACK(sr_menu_edit_cb), sd, editmenu_fd_list);
1019 if (!on_row) gtk_widget_set_sensitive(item, FALSE); 1015 if (!on_row) gtk_widget_set_sensitive(item, FALSE);
1020 menu_item_add_stock_sensitive(menu, _("Add to new collection"), GTK_STOCK_INDEX, on_row, 1016 menu_item_add_stock_sensitive(menu, _("Add to new collection"), GTK_STOCK_INDEX, on_row,
1021 G_CALLBACK(sr_menu_collection_cb), sd); 1017 G_CALLBACK(sr_menu_collection_cb), sd);
1022 menu_item_add_stock_sensitive(menu, _("Print..."), GTK_STOCK_PRINT, on_row, 1018 menu_item_add_stock_sensitive(menu, _("Print..."), GTK_STOCK_PRINT, on_row,
1023 G_CALLBACK(sr_menu_print_cb), sd); 1019 G_CALLBACK(sr_menu_print_cb), sd);