comparison src/pan-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 2a96ff43ab3e
children decb3b64ae74
comparison
equal deleted inserted replaced
1697:219e1ba3ae30 1698:bfe04f01de5e
2776 pan_window_close(pw); 2776 pan_window_close(pw);
2777 } 2777 }
2778 2778
2779 static void pan_popup_menu_destroy_cb(GtkWidget *widget, gpointer data) 2779 static void pan_popup_menu_destroy_cb(GtkWidget *widget, gpointer data)
2780 { 2780 {
2781 PanWindow *pw = data; 2781 GList *editmenu_fd_list = data;
2782 2782
2783 filelist_free(pw->editmenu_fd_list); 2783 filelist_free(editmenu_fd_list);
2784 pw->editmenu_fd_list = NULL;
2785 } 2784 }
2786 2785
2787 static GList *pan_view_get_fd_list(PanWindow *pw) 2786 static GList *pan_view_get_fd_list(PanWindow *pw)
2788 { 2787 {
2789 GList *list = NULL; 2788 GList *list = NULL;
2798 { 2797 {
2799 GtkWidget *menu; 2798 GtkWidget *menu;
2800 GtkWidget *submenu; 2799 GtkWidget *submenu;
2801 GtkWidget *item; 2800 GtkWidget *item;
2802 gboolean active; 2801 gboolean active;
2802 GList *editmenu_fd_list;
2803 2803
2804 active = (pw->click_pi != NULL); 2804 active = (pw->click_pi != NULL);
2805 2805
2806 menu = popup_menu_short_lived(); 2806 menu = popup_menu_short_lived();
2807 g_signal_connect(G_OBJECT(menu), "destroy", 2807 g_signal_connect(G_OBJECT(menu), "destroy",
2813 G_CALLBACK(pan_zoom_out_cb), pw); 2813 G_CALLBACK(pan_zoom_out_cb), pw);
2814 menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, 2814 menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100,
2815 G_CALLBACK(pan_zoom_1_1_cb), pw); 2815 G_CALLBACK(pan_zoom_1_1_cb), pw);
2816 menu_item_add_divider(menu); 2816 menu_item_add_divider(menu);
2817 2817
2818 pw->editmenu_fd_list = pan_view_get_fd_list(pw); 2818 editmenu_fd_list = pan_view_get_fd_list(pw);
2819 submenu_add_edit(menu, &item, G_CALLBACK(pan_edit_cb), pw, pw->editmenu_fd_list); 2819 g_signal_connect(G_OBJECT(menu), "destroy",
2820 G_CALLBACK(pan_popup_menu_destroy_cb), editmenu_fd_list);
2821
2822 submenu_add_edit(menu, &item, G_CALLBACK(pan_edit_cb), pw, editmenu_fd_list);
2820 gtk_widget_set_sensitive(item, active); 2823 gtk_widget_set_sensitive(item, active);
2821 2824
2822 menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, active, 2825 menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, active,
2823 G_CALLBACK(pan_new_window_cb), pw); 2826 G_CALLBACK(pan_new_window_cb), pw);
2824 2827