[gtk+] container: Don't keep our own variable trying to track need for resize



commit cd20ae8fe118f08a48075f1b00f415d63a248395
Author: Benjamin Otte <otte redhat com>
Date:   Thu Oct 8 13:41:50 2015 +0200

    container: Don't keep our own variable trying to track need for resize
    
    Insteaad, introduce gtk_widget_needs_allocate() and use that.

 gtk/gtkcontainer.c     |   18 ++++++++----------
 gtk/gtkwidget.c        |   20 +++++++++++++++++---
 gtk/gtkwidgetprivate.h |    1 +
 3 files changed, 26 insertions(+), 13 deletions(-)
---
diff --git a/gtk/gtkcontainer.c b/gtk/gtkcontainer.c
index f10c57a..87f22c6 100644
--- a/gtk/gtkcontainer.c
+++ b/gtk/gtkcontainer.c
@@ -264,7 +264,6 @@ struct _GtkContainerPrivate
 
   guint has_focus_chain    : 1;
   guint reallocate_redraws : 1;
-  guint resize_pending     : 1;
   guint restyle_pending    : 1;
   guint resize_mode        : 2;
   guint request_mode       : 2;
@@ -2008,13 +2007,12 @@ gtk_container_idle_sizer (GdkFrameClock *clock,
    * than trying to explicitly work around them with some extra flags,
    * since it doesn't cause any actual harm.
    */
-  if (container->priv->resize_pending)
+  if (gtk_widget_needs_allocate (GTK_WIDGET (container)))
     {
-      container->priv->resize_pending = FALSE;
       gtk_container_check_resize (container);
     }
 
-  if (!container->priv->restyle_pending && !container->priv->resize_pending)
+  if (!container->priv->restyle_pending && !gtk_widget_needs_allocate (GTK_WIDGET (container)))
     {
       _gtk_container_stop_idle_sizer (container);
     }
@@ -2074,11 +2072,8 @@ gtk_container_queue_resize_handler (GtkContainer *container)
       switch (container->priv->resize_mode)
         {
         case GTK_RESIZE_QUEUE:
-          if (!container->priv->resize_pending)
-            {
-              container->priv->resize_pending = TRUE;
-              gtk_container_start_idle_sizer (container);
-            }
+          if (gtk_widget_needs_allocate (widget))
+            gtk_container_start_idle_sizer (container);
           break;
 
         case GTK_RESIZE_IMMEDIATE:
@@ -2112,7 +2107,10 @@ _gtk_container_queue_restyle (GtkContainer *container)
 void
 _gtk_container_maybe_start_idle_sizer (GtkContainer *container)
 {
-  if (container->priv->restyle_pending || container->priv->resize_pending)
+  if (!GTK_IS_RESIZE_CONTAINER (container))
+    return;
+
+  if (container->priv->restyle_pending || gtk_widget_needs_allocate (GTK_WIDGET (container)))
     gtk_container_start_idle_sizer (container);
 }
 
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 12c15cb..764df90 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -16255,16 +16255,30 @@ G_GNUC_END_IGNORE_DEPRECATIONS;
   while (TRUE);
 }
 
+gboolean
+gtk_widget_needs_allocate (GtkWidget *widget)
+{
+  GtkWidgetPrivate *priv = widget->priv;
+
+  if (!priv->visible || !priv->child_visible)
+    return FALSE;
+
+  if (priv->resize_needed || priv->alloc_needed || priv->alloc_needed_on_child)
+    return TRUE;
+
+  return FALSE;
+}
+
 void
 gtk_widget_ensure_allocate (GtkWidget *widget)
 {
   GtkWidgetPrivate *priv = widget->priv;
 
-  gtk_widget_ensure_resize (widget);
-
-  if (!priv->visible || !priv->child_visible)
+  if (!gtk_widget_needs_allocate (widget))
     return;
 
+  gtk_widget_ensure_resize (widget);
+
   /*  This code assumes that we only reach here if the previous
    *  allocation is still valid (ie no resize was queued).
    *  If that wasn't true, the parent would have taken care of
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index 856fc73..484c1f3 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -167,6 +167,7 @@ gboolean     _gtk_widget_get_shadowed       (GtkWidget *widget);
 void         _gtk_widget_set_shadowed       (GtkWidget *widget,
                                              gboolean   shadowed);
 gboolean     _gtk_widget_get_alloc_needed   (GtkWidget *widget);
+gboolean     gtk_widget_needs_allocate      (GtkWidget *widget);
 void         gtk_widget_queue_resize_on_widget (GtkWidget *widget);
 void         gtk_widget_ensure_resize       (GtkWidget *widget);
 void         gtk_widget_ensure_allocate     (GtkWidget *widget);


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