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