summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2012-06-12 12:03:26 -0400
committerCosimo Cecchi <cosimoc@gnome.org>2012-06-12 12:03:26 -0400
commit2ec2ff031277e85a8e3a636fedd57ddc61494026 (patch)
tree4520c63b82b5d421b59815b31a9cdd3482d3ee9b /src
parent217185b485edcd8983d44500b2a69bf20992ed78 (diff)
downloadnautilus-2ec2ff031277e85a8e3a636fedd57ddc61494026.tar.gz
window-menus: disconnect from GtkSettings notifications on finalize
Or if something (e.g. another process via xsettings) causes the GtkSettings to change the value of gtk-shell-shows-app-menu after a window is finalized, our callback will run and we'll crash trying to access freed memory. https://bugzilla.gnome.org/show_bug.cgi?id=677945
Diffstat (limited to 'src')
-rw-r--r--src/nautilus-window-menus.c13
-rw-r--r--src/nautilus-window-private.h1
2 files changed, 11 insertions, 3 deletions
diff --git a/src/nautilus-window-menus.c b/src/nautilus-window-menus.c
index 418982349..6d8b7ccae 100644
--- a/src/nautilus-window-menus.c
+++ b/src/nautilus-window-menus.c
@@ -857,9 +857,10 @@ nautilus_window_initialize_menus (NautilusWindow *window)
window);
nautilus_window_menus_set_visibility_for_app_menu (window);
- g_signal_connect_swapped (gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (window))),
- "notify::gtk-shell-shows-app-menu",
- G_CALLBACK (nautilus_window_menus_set_visibility_for_app_menu), window);
+ window->details->app_menu_visibility_id =
+ g_signal_connect_swapped (gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (window))),
+ "notify::gtk-shell-shows-app-menu",
+ G_CALLBACK (nautilus_window_menus_set_visibility_for_app_menu), window);
action = gtk_action_group_get_action (action_group, NAUTILUS_ACTION_UP);
g_object_set (action, "short_label", _("_Up"), NULL);
@@ -929,6 +930,12 @@ nautilus_window_finalize_menus (NautilusWindow *window)
g_signal_handlers_disconnect_by_func (nautilus_preferences,
show_hidden_files_preference_callback, window);
+
+ if (window->details->app_menu_visibility_id != 0) {
+ g_signal_handler_disconnect (gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (window))),
+ window->details->app_menu_visibility_id);
+ window->details->app_menu_visibility_id = 0;
+ }
}
static GList *
diff --git a/src/nautilus-window-private.h b/src/nautilus-window-private.h
index 0d7a4b3fa..42d48f097 100644
--- a/src/nautilus-window-private.h
+++ b/src/nautilus-window-private.h
@@ -97,6 +97,7 @@ struct NautilusWindowDetails
gboolean disable_chrome;
guint sidebar_width_handler_id;
+ guint app_menu_visibility_id;
};
/* window geometry */