[gtk+/wip/otte/queue-resize: 30/31] widget: Track if a child needs an allocation



commit 6eb82ea8c8b3490a4da1b8df57e7e3a67449d978
Author: Benjamin Otte <otte redhat com>
Date:   Tue Sep 29 21:04:07 2015 +0200

    widget: Track if a child needs an allocation
    
    This is not used so far.

 gtk/gtkwidget.c        |   31 ++++++++++++++++++++++++++++++-
 gtk/gtkwidgetprivate.h |    3 ++-
 2 files changed, 32 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 79a31ea..fff6e03 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -4327,6 +4327,7 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
   priv->double_buffered = TRUE;
   priv->redraw_on_alloc = TRUE;
   priv->alloc_needed = TRUE;
+  priv->alloc_needed_on_child = TRUE;
  
   switch (_gtk_widget_get_direction (widget))
     {
@@ -6040,6 +6041,7 @@ gtk_widget_size_allocate_with_baseline (GtkWidget     *widget,
 #endif
   gtk_widget_ensure_resize (widget);
   priv->alloc_needed = FALSE;
+  priv->alloc_needed_on_child = FALSE;
 
   size_changed |= (old_clip.width != priv->clip.width ||
                    old_clip.height != priv->clip.height);
@@ -7168,6 +7170,7 @@ gtk_widget_draw (GtkWidget *widget,
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (!widget->priv->alloc_needed);
+  g_return_if_fail (!widget->priv->alloc_needed_on_child);
   g_return_if_fail (cr != NULL);
 
   _gtk_widget_draw (widget, cr);
@@ -16217,13 +16220,39 @@ _gtk_widget_get_alloc_needed (GtkWidget *widget)
   return widget->priv->alloc_needed;
 }
 
+static void
+gtk_widget_set_alloc_needed (GtkWidget *widget)
+{
+  GtkWidgetPrivate *priv = widget->priv;
+
+  priv->alloc_needed = TRUE;
+
+  do
+    {
+      if (priv->alloc_needed_on_child)
+        break;
+
+      priv->alloc_needed_on_child = TRUE;
+
+      if (!priv->visible)
+        break;
+
+      widget = priv->parent;
+      if (widget == NULL)
+        break;
+
+      priv = widget->priv;
+    }
+  while (TRUE);
+}
+
 void
 gtk_widget_queue_resize_on_widget (GtkWidget *widget)
 {
   GtkWidgetPrivate *priv = widget->priv;
 
   priv->resize_needed = TRUE;
-  priv->alloc_needed = TRUE;
+  gtk_widget_set_alloc_needed (widget);
 }
 
 void
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index a3b463d..5bf498a 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -73,7 +73,8 @@ struct _GtkWidgetPrivate
 
   /* Queue-resize related flags */
   guint resize_needed         : 1; /* queue_resize() has been called but no get_preferred_size() yet */
-  guint alloc_needed          : 1;
+  guint alloc_needed          : 1; /* this widget needs a size_allocate() call */
+  guint alloc_needed_on_child : 1; /* 0 or more children - or this widget - need a size_allocate() call */
 
   /* Expand-related flags */
   guint need_compute_expand   : 1; /* Need to recompute computed_[hv]_expand */


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