Mercurial > geeqie.yaz
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 |