Mercurial > geeqie
comparison src/dupe.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 |
---|---|
2205 dupe_window_close(dw); | 2205 dupe_window_close(dw); |
2206 } | 2206 } |
2207 | 2207 |
2208 static void dupe_menu_popup_destroy_cb(GtkWidget *widget, gpointer data) | 2208 static void dupe_menu_popup_destroy_cb(GtkWidget *widget, gpointer data) |
2209 { | 2209 { |
2210 DupeWindow *dw = data; | 2210 GList *editmenu_fd_list = data; |
2211 | 2211 |
2212 filelist_free(dw->editmenu_fd_list); | 2212 filelist_free(editmenu_fd_list); |
2213 dw->editmenu_fd_list = NULL; | |
2214 } | 2213 } |
2215 | 2214 |
2216 static GList *dupe_window_get_fd_list(DupeWindow *dw) | 2215 static GList *dupe_window_get_fd_list(DupeWindow *dw) |
2217 { | 2216 { |
2218 GList *list; | 2217 GList *list; |
2232 static GtkWidget *dupe_menu_popup_main(DupeWindow *dw, DupeItem *di) | 2231 static GtkWidget *dupe_menu_popup_main(DupeWindow *dw, DupeItem *di) |
2233 { | 2232 { |
2234 GtkWidget *menu; | 2233 GtkWidget *menu; |
2235 GtkWidget *item; | 2234 GtkWidget *item; |
2236 gint on_row; | 2235 gint on_row; |
2236 GList *editmenu_fd_list; | |
2237 | 2237 |
2238 on_row = (di != NULL); | 2238 on_row = (di != NULL); |
2239 | 2239 |
2240 menu = popup_menu_short_lived(); | 2240 menu = popup_menu_short_lived(); |
2241 g_signal_connect(G_OBJECT(menu), "destroy", | |
2242 G_CALLBACK(dupe_menu_popup_destroy_cb), dw); | |
2243 | 2241 |
2244 menu_item_add_sensitive(menu, _("_View"), on_row, | 2242 menu_item_add_sensitive(menu, _("_View"), on_row, |
2245 G_CALLBACK(dupe_menu_view_cb), dw); | 2243 G_CALLBACK(dupe_menu_view_cb), dw); |
2246 menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, on_row, | 2244 menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, on_row, |
2247 G_CALLBACK(dupe_menu_viewnew_cb), dw); | 2245 G_CALLBACK(dupe_menu_viewnew_cb), dw); |
2254 G_CALLBACK(dupe_menu_select_dupes_set1_cb), dw); | 2252 G_CALLBACK(dupe_menu_select_dupes_set1_cb), dw); |
2255 menu_item_add_sensitive(menu, _("Select group _2 duplicates"), (dw->dupes != NULL), | 2253 menu_item_add_sensitive(menu, _("Select group _2 duplicates"), (dw->dupes != NULL), |
2256 G_CALLBACK(dupe_menu_select_dupes_set2_cb), dw); | 2254 G_CALLBACK(dupe_menu_select_dupes_set2_cb), dw); |
2257 menu_item_add_divider(menu); | 2255 menu_item_add_divider(menu); |
2258 | 2256 |
2259 dw->editmenu_fd_list = dupe_window_get_fd_list(dw); | 2257 editmenu_fd_list = dupe_window_get_fd_list(dw); |
2260 submenu_add_edit(menu, &item, G_CALLBACK(dupe_menu_edit_cb), dw, dw->editmenu_fd_list); | 2258 g_signal_connect(G_OBJECT(menu), "destroy", |
2259 G_CALLBACK(dupe_menu_popup_destroy_cb), editmenu_fd_list); | |
2260 submenu_add_edit(menu, &item, G_CALLBACK(dupe_menu_edit_cb), dw, editmenu_fd_list); | |
2261 if (!on_row) gtk_widget_set_sensitive(item, FALSE); | 2261 if (!on_row) gtk_widget_set_sensitive(item, FALSE); |
2262 menu_item_add_stock_sensitive(menu, _("Add to new collection"), GTK_STOCK_INDEX, on_row, | 2262 menu_item_add_stock_sensitive(menu, _("Add to new collection"), GTK_STOCK_INDEX, on_row, |
2263 G_CALLBACK(dupe_menu_collection_cb), dw); | 2263 G_CALLBACK(dupe_menu_collection_cb), dw); |
2264 menu_item_add_stock_sensitive(menu, _("Print..."), GTK_STOCK_PRINT, on_row, | 2264 menu_item_add_stock_sensitive(menu, _("Print..."), GTK_STOCK_PRINT, on_row, |
2265 G_CALLBACK(dupe_menu_print_cb), dw); | 2265 G_CALLBACK(dupe_menu_print_cb), dw); |