[gtk+] gtkheaderbar: update the window buttons on ::hierarchy-changed instead of ::realize



commit bb34db6d351862e3fb03377f60b9a884f1104683
Author: Christoph Reiter <creiter src gnome org>
Date:   Wed Nov 18 21:21:57 2015 +0100

    gtkheaderbar: update the window buttons on ::hierarchy-changed instead of ::realize
    
    The window button setup depends on properties of the toplevel window.
    Instead of updating the setup on realize, do it when the toplevel
    changes.
    
    This makes sure that when a GtkHeaderBar is added to a window
    all the widgets are present and get_preferred_height() will return
    the height the widget will have when finally shown. This allows
    the logic in gtkwindow to select the right window size so that
    the content size will match the requested default size.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=756618

 gtk/gtkheaderbar.c |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtkheaderbar.c b/gtk/gtkheaderbar.c
index a1f0606..4b9882e 100644
--- a/gtk/gtkheaderbar.c
+++ b/gtk/gtkheaderbar.c
@@ -280,7 +280,7 @@ void
 _gtk_header_bar_update_window_buttons (GtkHeaderBar *bar)
 {
   GtkHeaderBarPrivate *priv = gtk_header_bar_get_instance_private (bar);
-  GtkWidget *widget = GTK_WIDGET (bar);
+  GtkWidget *widget = GTK_WIDGET (bar), *toplevel;
   GtkWindow *window;
   GtkTextDirection direction;
   gchar *layout_desc;
@@ -290,7 +290,8 @@ _gtk_header_bar_update_window_buttons (GtkHeaderBar *bar)
   gboolean shown_by_shell;
   GdkWindowTypeHint type_hint;
 
-  if (!gtk_widget_get_realized (widget))
+  toplevel = gtk_widget_get_toplevel (widget);
+  if (!gtk_widget_is_toplevel (toplevel))
     return;
 
   if (priv->titlebar_start_box)
@@ -324,7 +325,7 @@ _gtk_header_bar_update_window_buttons (GtkHeaderBar *bar)
       layout_desc = g_strdup (priv->decoration_layout);
     }
 
-  window = GTK_WINDOW (gtk_widget_get_toplevel (widget));
+  window = GTK_WINDOW (toplevel);
 
   if (!shown_by_shell && gtk_window_get_application (window))
     menu = gtk_application_get_app_menu (gtk_window_get_application (window));
@@ -1774,7 +1775,6 @@ gtk_header_bar_realize (GtkWidget *widget)
                             G_CALLBACK (_gtk_header_bar_update_window_buttons), widget);
   g_signal_connect_swapped (settings, "notify::gtk-decoration-layout",
                             G_CALLBACK (_gtk_header_bar_update_window_buttons), widget);
-  _gtk_header_bar_update_window_buttons (GTK_HEADER_BAR (widget));
 }
 
 static void
@@ -1807,6 +1807,7 @@ gtk_header_bar_hierarchy_changed (GtkWidget *widget,
                                   GtkWidget *previous_toplevel)
 {
   GtkWidget *toplevel;
+  GtkHeaderBar *bar = GTK_HEADER_BAR (widget);
 
   toplevel = gtk_widget_get_toplevel (widget);
 
@@ -1817,6 +1818,8 @@ gtk_header_bar_hierarchy_changed (GtkWidget *widget,
   if (toplevel)
     g_signal_connect_after (toplevel, "window-state-event",
                             G_CALLBACK (window_state_changed), widget);
+
+  _gtk_header_bar_update_window_buttons (bar);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]