[gtk+/gtk-3-16] Fix window button updates in split headers



commit c8dc2dee788dd63a38351a0297541c23e4c1617e
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Apr 14 17:05:34 2015 -0400

    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 files changed, 31 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtkheaderbar.c b/gtk/gtkheaderbar.c
index f2f2878..bf95295 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;


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