]> Pileus Git - ~andy/gtk/commitdiff
Watch "shell shows menu" settings for changes
authorRyan Lortie <desrt@desrt.ca>
Sat, 3 Dec 2011 19:55:03 +0000 (14:55 -0500)
committerRyan Lortie <desrt@desrt.ca>
Mon, 19 Dec 2011 17:51:10 +0000 (12:51 -0500)
Correctly monitor the GtkSettings for changes to the
"gtk-shell-shows-app-menu" and "gtk-shell-shows-menubar" properties.

gtk/gtkapplicationwindow.c

index f68a0a2fb8c9e2482fc490de53a570e2e639df39..b3ad18cc028448c96191b85f7f088397fce5c491 100644 (file)
@@ -114,11 +114,12 @@ gtk_application_window_update_menubar (GtkApplicationWindow *window)
 }
 
 static void
-gtk_application_window_update_shell_shows_app_menu (GtkApplicationWindow *window)
+gtk_application_window_update_shell_shows_app_menu (GtkApplicationWindow *window,
+                                                    GtkSettings          *settings)
 {
   gboolean shown_by_shell;
 
-  g_object_get (gtk_widget_get_settings (GTK_WIDGET (window)), "gtk-shell-shows-app-menu", &shown_by_shell, NULL);
+  g_object_get (settings, "gtk-shell-shows-app-menu", &shown_by_shell, NULL);
 
   if (shown_by_shell)
     {
@@ -142,11 +143,12 @@ gtk_application_window_update_shell_shows_app_menu (GtkApplicationWindow *window
 }
 
 static void
-gtk_application_window_update_shell_shows_menubar (GtkApplicationWindow *window)
+gtk_application_window_update_shell_shows_menubar (GtkApplicationWindow *window,
+                                                   GtkSettings          *settings)
 {
   gboolean shown_by_shell;
 
-  g_object_get (gtk_widget_get_settings (GTK_WIDGET (window)), "gtk-shell-shows-menubar", &shown_by_shell, NULL);
+  g_object_get (settings, "gtk-shell-shows-menubar", &shown_by_shell, NULL);
 
   if (shown_by_shell)
     {
@@ -176,7 +178,7 @@ gtk_application_window_shell_shows_app_menu_changed (GObject    *object,
 {
   GtkApplicationWindow *window = user_data;
 
-  gtk_application_window_update_shell_shows_app_menu (window);
+  gtk_application_window_update_shell_shows_app_menu (window, GTK_SETTINGS (object));
   gtk_application_window_update_menubar (window);
 }
 
@@ -187,7 +189,7 @@ gtk_application_window_shell_shows_menubar_changed (GObject    *object,
 {
   GtkApplicationWindow *window = user_data;
 
-  gtk_application_window_update_shell_shows_menubar (window);
+  gtk_application_window_update_shell_shows_menubar (window, GTK_SETTINGS (object));
   gtk_application_window_update_menubar (window);
 }
 
@@ -415,15 +417,37 @@ static void
 gtk_application_window_real_realize (GtkWidget *widget)
 {
   GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget);
+  GtkSettings *settings;
 
-  gtk_application_window_update_shell_shows_app_menu (window);
-  gtk_application_window_update_shell_shows_menubar (window);
+  settings = gtk_widget_get_settings (widget);
+
+  g_signal_connect (settings, "notify::gtk-shell-shows-app-menu",
+                    G_CALLBACK (gtk_application_window_shell_shows_app_menu_changed), window);
+  g_signal_connect (settings, "notify::gtk-shell-shows-menubar",
+                    G_CALLBACK (gtk_application_window_shell_shows_menubar_changed), window);
+
+  gtk_application_window_update_shell_shows_app_menu (window, settings);
+  gtk_application_window_update_shell_shows_menubar (window, settings);
   gtk_application_window_update_menubar (window);
 
   GTK_WIDGET_CLASS (gtk_application_window_parent_class)
     ->realize (widget);
 }
 
+static void
+gtk_application_window_real_unrealize (GtkWidget *widget)
+{
+  GtkSettings *settings;
+
+  settings = gtk_widget_get_settings (widget);
+
+  g_signal_handlers_disconnect_by_func (settings, gtk_application_window_shell_shows_app_menu_changed, widget);
+  g_signal_handlers_disconnect_by_func (settings, gtk_application_window_shell_shows_menubar_changed, widget);
+
+  GTK_WIDGET_CLASS (gtk_application_window_parent_class)
+    ->unrealize (widget);
+}
+
 static void
 gtk_application_window_real_map (GtkWidget *widget)
 {
@@ -546,6 +570,7 @@ gtk_application_window_class_init (GtkApplicationWindowClass *class)
   widget_class->get_preferred_width_for_height = gtk_application_window_real_get_preferred_width_for_height;
   widget_class->size_allocate = gtk_application_window_real_size_allocate;
   widget_class->realize = gtk_application_window_real_realize;
+  widget_class->unrealize = gtk_application_window_real_unrealize;
   widget_class->map = gtk_application_window_real_map;
   object_class->get_property = gtk_application_window_get_property;
   object_class->set_property = gtk_application_window_set_property;