diff src/layout_image.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 71b29f70d08c
children 2309e6150e8c
line wrap: on
line diff
--- a/src/layout_image.c	Sat Jul 18 08:16:54 2009 +0000
+++ b/src/layout_image.c	Tue Jul 21 14:17:01 2009 +0000
@@ -449,11 +449,10 @@
 
 static void layout_image_popup_menu_destroy_cb(GtkWidget *widget, gpointer data)
 {
-	LayoutWindow *lw = data;
+	GList *editmenu_fd_list = data;
 
-	filelist_free(lw->editmenu_fd_list);
-	lw->editmenu_fd_list = NULL;
-}	
+	filelist_free(editmenu_fd_list);
+}
 
 static GList *layout_image_get_fd_list(LayoutWindow *lw)
 {
@@ -473,13 +472,12 @@
 	GtkWidget *submenu;
 	const gchar *path;
 	gboolean fullscreen;
+	GList *editmenu_fd_list;
 
 	path = layout_image_get_path(lw);
 	fullscreen = layout_image_full_screen_active(lw);
 
 	menu = popup_menu_short_lived();
-	g_signal_connect(G_OBJECT(menu), "destroy",
-			 G_CALLBACK(layout_image_popup_menu_destroy_cb), lw);
 
 	menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(li_pop_menu_zoom_in_cb), lw);
 	menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(li_pop_menu_zoom_out_cb), lw);
@@ -487,8 +485,10 @@
 	menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(li_pop_menu_zoom_fit_cb), lw);
 	menu_item_add_divider(menu);
 
-	lw->editmenu_fd_list = layout_image_get_fd_list(lw);
-	submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw, lw->editmenu_fd_list);
+	editmenu_fd_list = layout_image_get_fd_list(lw);
+	g_signal_connect(G_OBJECT(menu), "destroy",
+			 G_CALLBACK(layout_image_popup_menu_destroy_cb), editmenu_fd_list);
+	submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw, editmenu_fd_list);
 	if (!path) gtk_widget_set_sensitive(item, FALSE);
 	menu_item_add_divider(submenu);
 	menu_item_add(submenu, _("Set as _wallpaper"), G_CALLBACK(li_pop_menu_wallpaper_cb), lw);