comparison src/img-view.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 1e3bbaa772b9
children 956aab097ea7
comparison
equal deleted inserted replaced
1697:219e1ba3ae30 1698:bfe04f01de5e
47 FullScreenData *fs; 47 FullScreenData *fs;
48 SlideShowData *ss; 48 SlideShowData *ss;
49 49
50 GList *list; 50 GList *list;
51 GList *list_pointer; 51 GList *list_pointer;
52
53 /* file list for edit menu */
54 GList *editmenu_fd_list;
55 }; 52 };
56 53
57 54
58 static GList *view_window_list = NULL; 55 static GList *view_window_list = NULL;
59 56
1236 view_window_close(vw); 1233 view_window_close(vw);
1237 } 1234 }
1238 1235
1239 static void view_popup_menu_destroy_cb(GtkWidget *widget, gpointer data) 1236 static void view_popup_menu_destroy_cb(GtkWidget *widget, gpointer data)
1240 { 1237 {
1241 ViewWindow *vw = data; 1238 GList *editmenu_fd_list = data;
1242 1239
1243 filelist_free(vw->editmenu_fd_list); 1240 filelist_free(editmenu_fd_list);
1244 vw->editmenu_fd_list = NULL;
1245 } 1241 }
1246 1242
1247 static GList *view_window_get_fd_list(ViewWindow *vw) 1243 static GList *view_window_get_fd_list(ViewWindow *vw)
1248 { 1244 {
1249 GList *list = NULL; 1245 GList *list = NULL;
1260 1256
1261 static GtkWidget *view_popup_menu(ViewWindow *vw) 1257 static GtkWidget *view_popup_menu(ViewWindow *vw)
1262 { 1258 {
1263 GtkWidget *menu; 1259 GtkWidget *menu;
1264 GtkWidget *item; 1260 GtkWidget *item;
1261 GList *editmenu_fd_list;
1265 1262
1266 menu = popup_menu_short_lived(); 1263 menu = popup_menu_short_lived();
1267 1264
1268 g_signal_connect(G_OBJECT(menu), "destroy",
1269 G_CALLBACK(view_popup_menu_destroy_cb), vw);
1270 1265
1271 menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(view_zoom_in_cb), vw); 1266 menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(view_zoom_in_cb), vw);
1272 menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(view_zoom_out_cb), vw); 1267 menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(view_zoom_out_cb), vw);
1273 menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(view_zoom_1_1_cb), vw); 1268 menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(view_zoom_1_1_cb), vw);
1274 menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(view_zoom_fit_cb), vw); 1269 menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(view_zoom_fit_cb), vw);
1275 menu_item_add_divider(menu); 1270 menu_item_add_divider(menu);
1276 1271
1277 vw->editmenu_fd_list = view_window_get_fd_list(vw); 1272 editmenu_fd_list = view_window_get_fd_list(vw);
1278 item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw, vw->editmenu_fd_list); 1273 g_signal_connect(G_OBJECT(menu), "destroy",
1274 G_CALLBACK(view_popup_menu_destroy_cb), editmenu_fd_list);
1275 item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw, editmenu_fd_list);
1279 menu_item_add_divider(item); 1276 menu_item_add_divider(item);
1280 menu_item_add(item, _("Set as _wallpaper"), G_CALLBACK(view_wallpaper_cb), vw); 1277 menu_item_add(item, _("Set as _wallpaper"), G_CALLBACK(view_wallpaper_cb), vw);
1281 1278
1282 submenu_add_alter(menu, G_CALLBACK(view_alter_cb), vw); 1279 submenu_add_alter(menu, G_CALLBACK(view_alter_cb), vw);
1283 1280