From: Matthias Clasen Date: Tue, 14 Apr 2015 21:05:34 +0000 (-0400) Subject: Fix window button updates in split headers X-Git-Tag: archive/raspbian/4.4.1+ds1-2+rpi1^2~18^2~24^2~9894 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c8d6231c3c55dc9f357a2436cbc89bef23163d57;p=gtk4.git 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 --- diff --git a/gtk/gtkheaderbar.c b/gtk/gtkheaderbar.c index f2f287858f..bf9529530e 100644 --- a/gtk/gtkheaderbar.c +++ b/gtk/gtkheaderbar.c @@ -1812,6 +1812,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) { @@ -1831,6 +1861,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;