Mercurial > geeqie
comparison 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 |
comparison
equal
deleted
inserted
replaced
1697:219e1ba3ae30 | 1698:bfe04f01de5e |
---|---|
447 return ret; | 447 return ret; |
448 } | 448 } |
449 | 449 |
450 static void layout_image_popup_menu_destroy_cb(GtkWidget *widget, gpointer data) | 450 static void layout_image_popup_menu_destroy_cb(GtkWidget *widget, gpointer data) |
451 { | 451 { |
452 LayoutWindow *lw = data; | 452 GList *editmenu_fd_list = data; |
453 | 453 |
454 filelist_free(lw->editmenu_fd_list); | 454 filelist_free(editmenu_fd_list); |
455 lw->editmenu_fd_list = NULL; | 455 } |
456 } | |
457 | 456 |
458 static GList *layout_image_get_fd_list(LayoutWindow *lw) | 457 static GList *layout_image_get_fd_list(LayoutWindow *lw) |
459 { | 458 { |
460 GList *list = NULL; | 459 GList *list = NULL; |
461 FileData *fd = layout_image_get_fd(lw); | 460 FileData *fd = layout_image_get_fd(lw); |
471 GtkWidget *menu; | 470 GtkWidget *menu; |
472 GtkWidget *item; | 471 GtkWidget *item; |
473 GtkWidget *submenu; | 472 GtkWidget *submenu; |
474 const gchar *path; | 473 const gchar *path; |
475 gboolean fullscreen; | 474 gboolean fullscreen; |
475 GList *editmenu_fd_list; | |
476 | 476 |
477 path = layout_image_get_path(lw); | 477 path = layout_image_get_path(lw); |
478 fullscreen = layout_image_full_screen_active(lw); | 478 fullscreen = layout_image_full_screen_active(lw); |
479 | 479 |
480 menu = popup_menu_short_lived(); | 480 menu = popup_menu_short_lived(); |
481 g_signal_connect(G_OBJECT(menu), "destroy", | |
482 G_CALLBACK(layout_image_popup_menu_destroy_cb), lw); | |
483 | 481 |
484 menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(li_pop_menu_zoom_in_cb), lw); | 482 menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(li_pop_menu_zoom_in_cb), lw); |
485 menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(li_pop_menu_zoom_out_cb), lw); | 483 menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(li_pop_menu_zoom_out_cb), lw); |
486 menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(li_pop_menu_zoom_1_1_cb), lw); | 484 menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(li_pop_menu_zoom_1_1_cb), lw); |
487 menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(li_pop_menu_zoom_fit_cb), lw); | 485 menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(li_pop_menu_zoom_fit_cb), lw); |
488 menu_item_add_divider(menu); | 486 menu_item_add_divider(menu); |
489 | 487 |
490 lw->editmenu_fd_list = layout_image_get_fd_list(lw); | 488 editmenu_fd_list = layout_image_get_fd_list(lw); |
491 submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw, lw->editmenu_fd_list); | 489 g_signal_connect(G_OBJECT(menu), "destroy", |
490 G_CALLBACK(layout_image_popup_menu_destroy_cb), editmenu_fd_list); | |
491 submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw, editmenu_fd_list); | |
492 if (!path) gtk_widget_set_sensitive(item, FALSE); | 492 if (!path) gtk_widget_set_sensitive(item, FALSE); |
493 menu_item_add_divider(submenu); | 493 menu_item_add_divider(submenu); |
494 menu_item_add(submenu, _("Set as _wallpaper"), G_CALLBACK(li_pop_menu_wallpaper_cb), lw); | 494 menu_item_add(submenu, _("Set as _wallpaper"), G_CALLBACK(li_pop_menu_wallpaper_cb), lw); |
495 | 495 |
496 item = submenu_add_alter(menu, G_CALLBACK(li_pop_menu_alter_cb), lw); | 496 item = submenu_add_alter(menu, G_CALLBACK(li_pop_menu_alter_cb), lw); |