From cbe4f410c858d6d1dafe2eeab836750641792c0d Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 14 Apr 2015 17:05:34 -0400 Subject: [PATCH] Fix window button updates in split headers We were only updating window buttons when the headerbar was a direct child of the window. That is not the case in more complicated situations, such as the split headers in gedit or polari. To fix such cases, make the headerbar itself listen for state changes on its toplevel. https://bugzilla.gnome.org/show_bug.cgi?id=747805 --- gtk/gtkheaderbar.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/gtk/gtkheaderbar.c b/gtk/gtkheaderbar.c index 2dd8deeaf6..7c7283262d 100644 --- a/gtk/gtkheaderbar.c +++ b/gtk/gtkheaderbar.c @@ -1761,6 +1761,36 @@ gtk_header_bar_unrealize (GtkWidget *widget) GTK_WIDGET_CLASS (gtk_header_bar_parent_class)->unrealize (widget); } +static gboolean +window_state_changed (GtkWidget *window, + GdkEventWindowState *event, + gpointer data) +{ + GtkHeaderBar *bar = GTK_HEADER_BAR (data); + + if (event->changed_mask & (GDK_WINDOW_STATE_FULLSCREEN | GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_TILED)) + _gtk_header_bar_update_window_buttons (bar); + + return FALSE; +} + +static void +gtk_header_bar_hierarchy_changed (GtkWidget *widget, + GtkWidget *previous_toplevel) +{ + GtkWidget *toplevel; + + toplevel = gtk_widget_get_toplevel (widget); + + if (previous_toplevel) + g_signal_handlers_disconnect_by_func (previous_toplevel, + window_state_changed, widget); + + if (toplevel) + g_signal_connect_after (toplevel, "window-state-event", + G_CALLBACK (window_state_changed), widget); +} + static void gtk_header_bar_class_init (GtkHeaderBarClass *class) { @@ -1780,6 +1810,7 @@ gtk_header_bar_class_init (GtkHeaderBarClass *class) widget_class->draw = gtk_header_bar_draw; widget_class->realize = gtk_header_bar_realize; widget_class->unrealize = gtk_header_bar_unrealize; + widget_class->hierarchy_changed = gtk_header_bar_hierarchy_changed; container_class->add = gtk_header_bar_add; container_class->remove = gtk_header_bar_remove;