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