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