[gtk+] widget: Queue resize on parent on show/hide



commit 4483636016ec9e30ee1247b62851a66690967637
Author: Benjamin Otte <otte redhat com>
Date:   Thu Oct 29 01:03:09 2015 +0100

    widget: Queue resize on parent on show/hide
    
    When gtk_widget_show() or gtk_widget_hide() is called, don't queue a
    resize on the widget itself but on the parent.
    
    The widget itself may already be marked as in need of a resize and
    the call would be optimized out and never reach the parent.
    The parent size will change though because a child widget just changed
    its visibility.
    
    Fixes a bunch of issues with menus appearing black, toolbas not hiding
    in widget-factory and also various reftests.

 gtk/gtkwidget.c |   31 ++++++++++++++++++-------------
 1 files changed, 18 insertions(+), 13 deletions(-)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 764df90..2c03f72 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -4707,21 +4707,23 @@ gtk_widget_show (GtkWidget *widget)
 
   if (!_gtk_widget_get_visible (widget))
     {
+      GtkWidget *parent;
+
       g_object_ref (widget);
       gtk_widget_push_verify_invariants (widget);
 
-      if (!_gtk_widget_is_toplevel (widget))
-        gtk_widget_queue_resize (widget);
-
-      /* see comment in set_parent() for why this should and can be
-       * conditional
-       */
-      if (widget->priv->need_compute_expand ||
-          widget->priv->computed_hexpand ||
-          widget->priv->computed_vexpand)
+      parent = _gtk_widget_get_parent (widget);
+      if (parent)
         {
-          if (widget->priv->parent != NULL)
-            gtk_widget_queue_compute_expand (widget->priv->parent);
+          gtk_widget_queue_resize (parent);
+
+          /* see comment in set_parent() for why this should and can be
+           * conditional
+           */
+          if (widget->priv->need_compute_expand ||
+              widget->priv->computed_hexpand ||
+              widget->priv->computed_vexpand)
+            gtk_widget_queue_compute_expand (parent);
         }
 
       gtk_css_node_set_visible (widget->priv->cssnode, TRUE);
@@ -4809,6 +4811,7 @@ gtk_widget_hide (GtkWidget *widget)
   if (_gtk_widget_get_visible (widget))
     {
       GtkWidget *toplevel = _gtk_widget_get_toplevel (widget);
+      GtkWidget *parent;
 
       g_object_ref (widget);
       gtk_widget_push_verify_invariants (widget);
@@ -4827,10 +4830,12 @@ gtk_widget_hide (GtkWidget *widget)
       gtk_css_node_set_visible (widget->priv->cssnode, FALSE);
 
       g_signal_emit (widget, widget_signals[HIDE], 0);
-      if (!_gtk_widget_is_toplevel (widget))
-       gtk_widget_queue_resize (widget);
       g_object_notify_by_pspec (G_OBJECT (widget), widget_props[PROP_VISIBLE]);
 
+      parent = gtk_widget_get_parent (widget);
+      if (parent)
+       gtk_widget_queue_resize (parent);
+
       gtk_widget_pop_verify_invariants (widget);
       g_object_unref (widget);
     }


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