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