comparison src/img-view.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 ae0b1f854f22
children
comparison
equal deleted inserted replaced
1674:d5c921f9bb4c 1675:717374fb1bbd
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
1237 view_window_close(vw); 1234 view_window_close(vw);
1238 } 1235 }
1239 1236
1240 static void view_popup_menu_destroy_cb(GtkWidget *widget, gpointer data) 1237 static void view_popup_menu_destroy_cb(GtkWidget *widget, gpointer data)
1241 { 1238 {
1242 ViewWindow *vw = data; 1239 GList *editmenu_fd_list = data;
1243 1240
1244 filelist_free(vw->editmenu_fd_list); 1241 filelist_free(editmenu_fd_list);
1245 vw->editmenu_fd_list = NULL;
1246 } 1242 }
1247 1243
1248 static GList *view_window_get_fd_list(ViewWindow *vw) 1244 static GList *view_window_get_fd_list(ViewWindow *vw)
1249 { 1245 {
1250 GList *list = NULL; 1246 GList *list = NULL;
1261 1257
1262 static GtkWidget *view_popup_menu(ViewWindow *vw) 1258 static GtkWidget *view_popup_menu(ViewWindow *vw)
1263 { 1259 {
1264 GtkWidget *menu; 1260 GtkWidget *menu;
1265 GtkWidget *item; 1261 GtkWidget *item;
1262 GList *editmenu_fd_list;
1266 1263
1267 menu = popup_menu_short_lived(); 1264 menu = popup_menu_short_lived();
1268 1265
1269 g_signal_connect(G_OBJECT(menu), "destroy",
1270 G_CALLBACK(view_popup_menu_destroy_cb), vw);
1271 1266
1272 menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(view_zoom_in_cb), vw); 1267 menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(view_zoom_in_cb), vw);
1273 menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(view_zoom_out_cb), vw); 1268 menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(view_zoom_out_cb), vw);
1274 menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(view_zoom_1_1_cb), vw); 1269 menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(view_zoom_1_1_cb), vw);
1275 menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(view_zoom_fit_cb), vw); 1270 menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(view_zoom_fit_cb), vw);
1276 menu_item_add_divider(menu); 1271 menu_item_add_divider(menu);
1277 1272
1278 vw->editmenu_fd_list = view_window_get_fd_list(vw); 1273 editmenu_fd_list = view_window_get_fd_list(vw);
1279 item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw, vw->editmenu_fd_list); 1274 g_signal_connect(G_OBJECT(menu), "destroy",
1275 G_CALLBACK(view_popup_menu_destroy_cb), editmenu_fd_list);
1276 item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw, editmenu_fd_list);
1280 menu_item_add_divider(item); 1277 menu_item_add_divider(item);
1281 menu_item_add(item, _("Set as _wallpaper"), G_CALLBACK(view_wallpaper_cb), vw); 1278 menu_item_add(item, _("Set as _wallpaper"), G_CALLBACK(view_wallpaper_cb), vw);
1282 1279
1283 submenu_add_alter(menu, G_CALLBACK(view_alter_cb), vw); 1280 submenu_add_alter(menu, G_CALLBACK(view_alter_cb), vw);
1284 1281