Revision: 1798
http://geeqie.svn.sourceforge.net/geeqie/?rev=1798&view=rev
Author: nadvornik
Date: 2009-07-21 14:17:01 +0000 (Tue, 21 Jul 2009)
Log Message:
-----------
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.
Modified Paths:
--------------
trunk/src/dupe.c
trunk/src/dupe.h
trunk/src/img-view.c
trunk/src/layout_image.c
trunk/src/pan-types.h
trunk/src/pan-view.c
trunk/src/search.c
trunk/src/typedefs.h
Modified: trunk/src/dupe.c
===================================================================
--- trunk/src/dupe.c 2009-07-18 08:16:54 UTC (rev 1797)
+++ trunk/src/dupe.c 2009-07-21 14:17:01 UTC (rev 1798)
@@ -2207,10 +2207,9 @@
static void dupe_menu_popup_destroy_cb(GtkWidget *widget, gpointer data)
{
- DupeWindow *dw = data;
+ GList *editmenu_fd_list = data;
- filelist_free(dw->editmenu_fd_list);
- dw->editmenu_fd_list = NULL;
+ filelist_free(editmenu_fd_list);
}
static GList *dupe_window_get_fd_list(DupeWindow *dw)
@@ -2234,12 +2233,11 @@
GtkWidget *menu;
GtkWidget *item;
gint on_row;
+ GList *editmenu_fd_list;
on_row = (di != NULL);
menu = popup_menu_short_lived();
- g_signal_connect(G_OBJECT(menu), "destroy",
- G_CALLBACK(dupe_menu_popup_destroy_cb), dw);
menu_item_add_sensitive(menu, _("_View"), on_row,
G_CALLBACK(dupe_menu_view_cb), dw);
@@ -2256,8 +2254,10 @@
G_CALLBACK(dupe_menu_select_dupes_set2_cb), dw);
menu_item_add_divider(menu);
- dw->editmenu_fd_list = dupe_window_get_fd_list(dw);
- submenu_add_edit(menu, &item, G_CALLBACK(dupe_menu_edit_cb), dw,
dw->editmenu_fd_list);
+ editmenu_fd_list = dupe_window_get_fd_list(dw);
+ g_signal_connect(G_OBJECT(menu), "destroy",
+ G_CALLBACK(dupe_menu_popup_destroy_cb),
editmenu_fd_list);
+ submenu_add_edit(menu, &item, G_CALLBACK(dupe_menu_edit_cb), dw,
editmenu_fd_list);
if (!on_row) gtk_widget_set_sensitive(item, FALSE);
menu_item_add_stock_sensitive(menu, _("Add to new collection"),
GTK_STOCK_INDEX, on_row,
G_CALLBACK(dupe_menu_collection_cb), dw);
Modified: trunk/src/dupe.h
===================================================================
--- trunk/src/dupe.h 2009-07-18 08:16:54 UTC (rev 1797)
+++ trunk/src/dupe.h 2009-07-21 14:17:01 UTC (rev 1798)
@@ -109,10 +109,6 @@
GtkWidget *second_status_label;
gboolean color_frozen;
-
- /* file list for edit menu */
- GList *editmenu_fd_list;
-
};
Modified: trunk/src/img-view.c
===================================================================
--- trunk/src/img-view.c 2009-07-18 08:16:54 UTC (rev 1797)
+++ trunk/src/img-view.c 2009-07-21 14:17:01 UTC (rev 1798)
@@ -49,9 +49,6 @@
GList *list;
GList *list_pointer;
-
- /* file list for edit menu */
- GList *editmenu_fd_list;
};
@@ -1238,10 +1235,9 @@
static void view_popup_menu_destroy_cb(GtkWidget *widget, gpointer data)
{
- ViewWindow *vw = data;
+ GList *editmenu_fd_list = data;
- filelist_free(vw->editmenu_fd_list);
- vw->editmenu_fd_list = NULL;
+ filelist_free(editmenu_fd_list);
}
static GList *view_window_get_fd_list(ViewWindow *vw)
@@ -1262,11 +1258,10 @@
{
GtkWidget *menu;
GtkWidget *item;
+ GList *editmenu_fd_list;
menu = popup_menu_short_lived();
- g_signal_connect(G_OBJECT(menu), "destroy",
- G_CALLBACK(view_popup_menu_destroy_cb), vw);
menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN,
G_CALLBACK(view_zoom_in_cb), vw);
menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT,
G_CALLBACK(view_zoom_out_cb), vw);
@@ -1274,8 +1269,10 @@
menu_item_add_stock(menu, _("Fit image to _window"),
GTK_STOCK_ZOOM_FIT, G_CALLBACK(view_zoom_fit_cb), vw);
menu_item_add_divider(menu);
- vw->editmenu_fd_list = view_window_get_fd_list(vw);
- item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw,
vw->editmenu_fd_list);
+ editmenu_fd_list = view_window_get_fd_list(vw);
+ g_signal_connect(G_OBJECT(menu), "destroy",
+ G_CALLBACK(view_popup_menu_destroy_cb),
editmenu_fd_list);
+ item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw,
editmenu_fd_list);
menu_item_add_divider(item);
menu_item_add(item, _("Set as _wallpaper"),
G_CALLBACK(view_wallpaper_cb), vw);
Modified: trunk/src/layout_image.c
===================================================================
--- trunk/src/layout_image.c 2009-07-18 08:16:54 UTC (rev 1797)
+++ trunk/src/layout_image.c 2009-07-21 14:17:01 UTC (rev 1798)
@@ -449,11 +449,10 @@
static void layout_image_popup_menu_destroy_cb(GtkWidget *widget, gpointer
data)
{
- LayoutWindow *lw = data;
+ GList *editmenu_fd_list = data;
- filelist_free(lw->editmenu_fd_list);
- lw->editmenu_fd_list = NULL;
-}
+ filelist_free(editmenu_fd_list);
+}
static GList *layout_image_get_fd_list(LayoutWindow *lw)
{
@@ -473,13 +472,12 @@
GtkWidget *submenu;
const gchar *path;
gboolean fullscreen;
+ GList *editmenu_fd_list;
path = layout_image_get_path(lw);
fullscreen = layout_image_full_screen_active(lw);
menu = popup_menu_short_lived();
- g_signal_connect(G_OBJECT(menu), "destroy",
- G_CALLBACK(layout_image_popup_menu_destroy_cb), lw);
menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN,
G_CALLBACK(li_pop_menu_zoom_in_cb), lw);
menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT,
G_CALLBACK(li_pop_menu_zoom_out_cb), lw);
@@ -487,8 +485,10 @@
menu_item_add_stock(menu, _("Fit image to _window"),
GTK_STOCK_ZOOM_FIT, G_CALLBACK(li_pop_menu_zoom_fit_cb), lw);
menu_item_add_divider(menu);
- lw->editmenu_fd_list = layout_image_get_fd_list(lw);
- submenu = submenu_add_edit(menu, &item,
G_CALLBACK(li_pop_menu_edit_cb), lw, lw->editmenu_fd_list);
+ editmenu_fd_list = layout_image_get_fd_list(lw);
+ g_signal_connect(G_OBJECT(menu), "destroy",
+ G_CALLBACK(layout_image_popup_menu_destroy_cb),
editmenu_fd_list);
+ submenu = submenu_add_edit(menu, &item,
G_CALLBACK(li_pop_menu_edit_cb), lw, editmenu_fd_list);
if (!path) gtk_widget_set_sensitive(item, FALSE);
menu_item_add_divider(submenu);
menu_item_add(submenu, _("Set as _wallpaper"),
G_CALLBACK(li_pop_menu_wallpaper_cb), lw);
Modified: trunk/src/pan-types.h
===================================================================
--- trunk/src/pan-types.h 2009-07-18 08:16:54 UTC (rev 1797)
+++ trunk/src/pan-types.h 2009-07-21 14:17:01 UTC (rev 1798)
@@ -225,9 +225,6 @@
PanItem *search_pi;
gint idle_id;
-
- /* file list for edit menu */
- GList *editmenu_fd_list;
};
typedef struct _PanGrid PanGrid;
Modified: trunk/src/pan-view.c
===================================================================
--- trunk/src/pan-view.c 2009-07-18 08:16:54 UTC (rev 1797)
+++ trunk/src/pan-view.c 2009-07-21 14:17:01 UTC (rev 1798)
@@ -2778,10 +2778,9 @@
static void pan_popup_menu_destroy_cb(GtkWidget *widget, gpointer data)
{
- PanWindow *pw = data;
+ GList *editmenu_fd_list = data;
- filelist_free(pw->editmenu_fd_list);
- pw->editmenu_fd_list = NULL;
+ filelist_free(editmenu_fd_list);
}
static GList *pan_view_get_fd_list(PanWindow *pw)
@@ -2800,6 +2799,7 @@
GtkWidget *submenu;
GtkWidget *item;
gboolean active;
+ GList *editmenu_fd_list;
active = (pw->click_pi != NULL);
@@ -2815,8 +2815,11 @@
G_CALLBACK(pan_zoom_1_1_cb), pw);
menu_item_add_divider(menu);
- pw->editmenu_fd_list = pan_view_get_fd_list(pw);
- submenu_add_edit(menu, &item, G_CALLBACK(pan_edit_cb), pw,
pw->editmenu_fd_list);
+ editmenu_fd_list = pan_view_get_fd_list(pw);
+ g_signal_connect(G_OBJECT(menu), "destroy",
+ G_CALLBACK(pan_popup_menu_destroy_cb),
editmenu_fd_list);
+
+ submenu_add_edit(menu, &item, G_CALLBACK(pan_edit_cb), pw,
editmenu_fd_list);
gtk_widget_set_sensitive(item, active);
menu_item_add_stock_sensitive(menu, _("View in _new window"),
GTK_STOCK_NEW, active,
Modified: trunk/src/search.c
===================================================================
--- trunk/src/search.c 2009-07-18 08:16:54 UTC (rev 1797)
+++ trunk/src/search.c 2009-07-21 14:17:01 UTC (rev 1798)
@@ -190,10 +190,6 @@
ThumbLoader *thumb_loader;
gboolean thumb_enable;
FileData *thumb_fd;
-
- /* file list for edit menu */
- GList *editmenu_fd_list;
-
};
typedef struct _MatchFileData MatchFileData;
@@ -984,20 +980,18 @@
static void search_result_menu_destroy_cb(GtkWidget *widget, gpointer data)
{
- SearchData *sd = data;
+ GList *editmenu_fd_list = data;
- filelist_free(sd->editmenu_fd_list);
- sd->editmenu_fd_list = NULL;
+ filelist_free(editmenu_fd_list);
}
static GtkWidget *search_result_menu(SearchData *sd, gboolean on_row, gboolean
empty)
{
GtkWidget *menu;
GtkWidget *item;
+ GList *editmenu_fd_list;
menu = popup_menu_short_lived();
- g_signal_connect(G_OBJECT(menu), "destroy",
- G_CALLBACK(search_result_menu_destroy_cb), sd);
menu_item_add_sensitive(menu, _("_View"), on_row,
G_CALLBACK(sr_menu_view_cb), sd);
@@ -1010,8 +1004,10 @@
G_CALLBACK(sr_menu_select_none_cb), sd);
menu_item_add_divider(menu);
- sd->editmenu_fd_list = search_result_selection_list(sd);
- submenu_add_edit(menu, &item, G_CALLBACK(sr_menu_edit_cb), sd,
sd->editmenu_fd_list);
+ editmenu_fd_list = search_result_selection_list(sd);
+ g_signal_connect(G_OBJECT(menu), "destroy",
+ G_CALLBACK(search_result_menu_destroy_cb),
editmenu_fd_list);
+ submenu_add_edit(menu, &item, G_CALLBACK(sr_menu_edit_cb), sd,
editmenu_fd_list);
if (!on_row) gtk_widget_set_sensitive(item, FALSE);
menu_item_add_stock_sensitive(menu, _("Add to new collection"),
GTK_STOCK_INDEX, on_row,
G_CALLBACK(sr_menu_collection_cb), sd);
Modified: trunk/src/typedefs.h
===================================================================
--- trunk/src/typedefs.h 2009-07-18 08:16:54 UTC (rev 1797)
+++ trunk/src/typedefs.h 2009-07-21 14:17:01 UTC (rev 1798)
@@ -666,9 +666,6 @@
// gint bar_width;
GtkWidget *exif_window;
-
- /* file list for edit menu */
- GList *editmenu_fd_list;
};
struct _ViewDir
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge
This is your chance to win up to $100,000 in prizes! For a limited time,
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Geeqie-svn mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geeqie-svn