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



commit cbe4f410c858d6d1dafe2eeab836750641792c0d
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 2dd8dee..7c72832 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;


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