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