[gtk/container-focus-cleanup] Move the idle size to GtkWidget



commit ab679fc79c396f06f40854b69f87cb7fab2fd455
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Apr 19 11:43:57 2020 -0400

    Move the idle size to GtkWidget
    
    This was only living in gtkcontainer.c for historic
    reasons. Move it closer to where it belongs.

 docs/reference/gtk/meson.build |   1 -
 gtk/gtkactionbar.c             |   1 -
 gtk/gtkbutton.c                |   1 -
 gtk/gtkcheckbutton.c           |   1 -
 gtk/gtkcontainer.c             | 109 --------------------------------------
 gtk/gtkcontainerprivate.h      |  38 -------------
 gtk/gtkcsswidgetnode.c         |   3 +-
 gtk/gtkdialog.c                |   1 -
 gtk/gtkexpander.c              |   1 -
 gtk/gtkfixed.c                 |   1 -
 gtk/gtkflowbox.c               |   1 -
 gtk/gtkframe.c                 |   1 -
 gtk/gtkgrid.c                  |   1 -
 gtk/gtkgridlayout.c            |   1 -
 gtk/gtkheaderbar.c             |   1 -
 gtk/gtklistbox.c               |   1 -
 gtk/gtkmodelbutton.c           |   1 -
 gtk/gtkpaned.c                 |   1 -
 gtk/gtksizegroup.c             |   1 -
 gtk/gtkstack.c                 |   1 -
 gtk/gtkwidget.c                | 117 ++++++++++++++++++++++++++++++++++++++---
 gtk/gtkwidgetprivate.h         |   9 ++++
 gtk/gtkwindow.c                |   1 -
 23 files changed, 121 insertions(+), 173 deletions(-)
---
diff --git a/docs/reference/gtk/meson.build b/docs/reference/gtk/meson.build
index 91bab44088..8b66214e20 100644
--- a/docs/reference/gtk/meson.build
+++ b/docs/reference/gtk/meson.build
@@ -23,7 +23,6 @@ private_headers = [
   'gtkcolorscaleprivate.h',
   'gtkcolorswatchprivate.h',
   'gtkcomboboxprivate.h',
-  'gtkcontainerprivate.h',
   'gtkconstraintexpressionprivate.h',
   'gtkconstraintguideprivate.h',
   'gtkconstraintlayoutprivate.h',
diff --git a/gtk/gtkactionbar.c b/gtk/gtkactionbar.c
index ad468a0705..3705e46d9f 100644
--- a/gtk/gtkactionbar.c
+++ b/gtk/gtkactionbar.c
@@ -27,7 +27,6 @@
 #include "gtkbox.h"
 #include "gtkrevealer.h"
 #include "gtkwidgetprivate.h"
-#include "gtkcontainerprivate.h"
 #include "gtkprivate.h"
 #include "gtkcenterbox.h"
 #include "gtkbinlayout.h"
diff --git a/gtk/gtkbutton.c b/gtk/gtkbutton.c
index b1be03fa9f..969ba09257 100644
--- a/gtk/gtkbutton.c
+++ b/gtk/gtkbutton.c
@@ -57,7 +57,6 @@
 
 #include "gtkactionhelperprivate.h"
 #include "gtkcheckbutton.h"
-#include "gtkcontainerprivate.h"
 #include "gtkgestureclick.h"
 #include "gtkeventcontrollerkey.h"
 #include "gtkimage.h"
diff --git a/gtk/gtkcheckbutton.c b/gtk/gtkcheckbutton.c
index 795e41c2de..5411ef5d9c 100644
--- a/gtk/gtkcheckbutton.c
+++ b/gtk/gtkcheckbutton.c
@@ -33,7 +33,6 @@
 #include "gtkprivate.h"
 #include "gtkwidgetprivate.h"
 #include "gtkcssnodeprivate.h"
-#include "gtkcontainerprivate.h"
 #include "gtkstylecontextprivate.h"
 #include "gtkcssnumbervalueprivate.h"
 #include "gtkradiobutton.h"
diff --git a/gtk/gtkcontainer.c b/gtk/gtkcontainer.c
index a2cbd1b8b9..f3e681f3ca 100644
--- a/gtk/gtkcontainer.c
+++ b/gtk/gtkcontainer.c
@@ -24,8 +24,6 @@
 
 #include "config.h"
 
-#include "gtkcontainerprivate.h"
-
 #include "gtkadjustment.h"
 #include "gtkbuildable.h"
 #include "gtkbuilderprivate.h"
@@ -324,113 +322,6 @@ gtk_container_remove (GtkContainer *container,
   g_object_unref (container);
 }
 
-static gboolean
-gtk_container_needs_idle_sizer (GtkContainer *container)
-{
-  GtkContainerPrivate *priv = gtk_container_get_instance_private (container);
-
-  if (priv->restyle_pending)
-    return TRUE;
-
-  return gtk_widget_needs_allocate (GTK_WIDGET (container));
-}
-
-static void
-gtk_container_idle_sizer (GdkFrameClock *clock,
-                         GtkContainer  *container)
-{
-  GtkContainerPrivate *priv = gtk_container_get_instance_private (container);
-
-  /* We validate the style contexts in a single loop before even trying
-   * to handle resizes instead of doing validations inline.
-   * This is mostly necessary for compatibility reasons with old code,
-   * because both css_changed and size_allocate functions often change
-   * styles and so could cause infinite loops in this function.
-   *
-   * It's important to note that even an invalid style context returns
-   * sane values. So the result of an invalid style context will never be
-   * a program crash, but only a wrong layout or rendering.
-   */
-  if (priv->restyle_pending)
-    {
-      priv->restyle_pending = FALSE;
-      gtk_css_node_validate (gtk_widget_get_css_node (GTK_WIDGET (container)));
-    }
-
-  /* we may be invoked with a container_resize_queue of NULL, because
-   * queue_resize could have been adding an extra idle function while
-   * the queue still got processed. we better just ignore such case
-   * than trying to explicitly work around them with some extra flags,
-   * since it doesn't cause any actual harm.
-   */
-  if (gtk_widget_needs_allocate (GTK_WIDGET (container)))
-    {
-      if (GTK_IS_ROOT (container))
-        gtk_native_check_resize (GTK_NATIVE (container));
-      else
-        g_warning ("gtk_container_idle_sizer() called on a non-native non-window");
-    }
-
-  if (!gtk_container_needs_idle_sizer (container))
-    {
-      gtk_container_stop_idle_sizer (container);
-    }
-  else
-    {
-      gdk_frame_clock_request_phase (clock,
-                                     GDK_FRAME_CLOCK_PHASE_LAYOUT);
-    }
-}
-
-void
-gtk_container_start_idle_sizer (GtkContainer *container)
-{
-  GtkContainerPrivate *priv = gtk_container_get_instance_private (container);
-  GdkFrameClock *clock;
-
-  if (priv->resize_handler != 0)
-    return;
-
-  if (!gtk_container_needs_idle_sizer (container))
-    return;
-
-  clock = gtk_widget_get_frame_clock (GTK_WIDGET (container));
-  if (clock == NULL)
-    return;
-
-  priv->resize_handler = g_signal_connect (clock, "layout",
-                                           G_CALLBACK (gtk_container_idle_sizer), container);
-  gdk_frame_clock_request_phase (clock,
-                                 GDK_FRAME_CLOCK_PHASE_LAYOUT);
-}
-
-void
-gtk_container_stop_idle_sizer (GtkContainer *container)
-{
-  GtkContainerPrivate *priv = gtk_container_get_instance_private (container);
-
-  if (priv->resize_handler == 0)
-    return;
-
-  g_signal_handler_disconnect (gtk_widget_get_frame_clock (GTK_WIDGET (container)),
-                               priv->resize_handler);
-  priv->resize_handler = 0;
-}
-
-void
-_gtk_container_queue_restyle (GtkContainer *container)
-{
-  GtkContainerPrivate *priv = gtk_container_get_instance_private (container);
-
-  g_return_if_fail (GTK_CONTAINER (container));
-
-  if (priv->restyle_pending)
-    return;
-
-  priv->restyle_pending = TRUE;
-  gtk_container_start_idle_sizer (container);
-}
-
 static GtkSizeRequestMode 
 gtk_container_get_request_mode (GtkWidget *widget)
 {
diff --git a/gtk/gtkcsswidgetnode.c b/gtk/gtkcsswidgetnode.c
index 7a3a37ffc1..f32bdc8453 100644
--- a/gtk/gtkcsswidgetnode.c
+++ b/gtk/gtkcsswidgetnode.c
@@ -19,7 +19,6 @@
 
 #include "gtkcsswidgetnodeprivate.h"
 
-#include "gtkcontainerprivate.h"
 #include "gtkcssanimatedstyleprivate.h"
 #include "gtkprivate.h"
 #include "gtksettingsprivate.h"
@@ -46,7 +45,7 @@ gtk_css_widget_node_queue_callback (GtkWidget     *widget,
   GtkCssNode *node = user_data;
 
   gtk_css_node_invalidate_frame_clock (node, TRUE);
-  _gtk_container_queue_restyle (GTK_CONTAINER (widget));
+  gtk_widget_queue_restyle (widget);
 
   return G_SOURCE_CONTINUE;
 }
diff --git a/gtk/gtkdialog.c b/gtk/gtkdialog.c
index a2cc9e15ef..f0c73d67f9 100644
--- a/gtk/gtkdialog.c
+++ b/gtk/gtkdialog.c
@@ -35,7 +35,6 @@
 #include "gtklabel.h"
 #include "gtkmarshalers.h"
 #include "gtkbox.h"
-#include "gtkcontainerprivate.h"
 #include "gtkmain.h"
 #include "gtkintl.h"
 #include "gtkprivate.h"
diff --git a/gtk/gtkexpander.c b/gtk/gtkexpander.c
index d7d4f89ec3..0cd753fe01 100644
--- a/gtk/gtkexpander.c
+++ b/gtk/gtkexpander.c
@@ -114,7 +114,6 @@
 
 #include "gtkbox.h"
 #include "gtkbuildable.h"
-#include "gtkcontainerprivate.h"
 #include "gtkdropcontrollermotion.h"
 #include "gtkbuiltiniconprivate.h"
 #include "gtkgestureclick.h"
diff --git a/gtk/gtkfixed.c b/gtk/gtkfixed.c
index 8049b70e43..3d35f0a24b 100644
--- a/gtk/gtkfixed.c
+++ b/gtk/gtkfixed.c
@@ -71,7 +71,6 @@
 
 #include "gtkfixed.h"
 
-#include "gtkcontainerprivate.h"
 #include "gtkfixedlayout.h"
 #include "gtkintl.h"
 #include "gtkprivate.h"
diff --git a/gtk/gtkflowbox.c b/gtk/gtkflowbox.c
index 7fb0a58857..e0f0a61317 100644
--- a/gtk/gtkflowbox.c
+++ b/gtk/gtkflowbox.c
@@ -79,7 +79,6 @@
 #include "gtkflowboxprivate.h"
 
 #include "gtkadjustment.h"
-#include "gtkcontainerprivate.h"
 #include "gtkcsscolorvalueprivate.h"
 #include "gtkcssnodeprivate.h"
 #include "gtkgesturedrag.h"
diff --git a/gtk/gtkframe.c b/gtk/gtkframe.c
index 00d7333c55..26880beb20 100644
--- a/gtk/gtkframe.c
+++ b/gtk/gtkframe.c
@@ -32,7 +32,6 @@
 #include "gtkbuildable.h"
 #include "gtkcssnodeprivate.h"
 #include "gtkwidgetprivate.h"
-#include "gtkcontainerprivate.h"
 #include "gtkstylecontextprivate.h"
 #include "gtkcssstylepropertyprivate.h"
 #include "gtklabel.h"
diff --git a/gtk/gtkgrid.c b/gtk/gtkgrid.c
index a0c3ac107e..89af6bc311 100644
--- a/gtk/gtkgrid.c
+++ b/gtk/gtkgrid.c
@@ -22,7 +22,6 @@
 
 #include "gtkgrid.h"
 
-#include "gtkcontainerprivate.h"
 #include "gtkcsspositionvalueprivate.h"
 #include "gtkgridlayout.h"
 #include "gtkorientableprivate.h"
diff --git a/gtk/gtkgridlayout.c b/gtk/gtkgridlayout.c
index f913490741..b77169e76f 100644
--- a/gtk/gtkgridlayout.c
+++ b/gtk/gtkgridlayout.c
@@ -44,7 +44,6 @@
 
 #include "gtkgridlayout.h"
 
-#include "gtkcontainerprivate.h"
 #include "gtkcsspositionvalueprivate.h"
 #include "gtkdebug.h"
 #include "gtkintl.h"
diff --git a/gtk/gtkheaderbar.c b/gtk/gtkheaderbar.c
index eb5bca55a4..b9a1495233 100644
--- a/gtk/gtkheaderbar.c
+++ b/gtk/gtkheaderbar.c
@@ -25,7 +25,6 @@
 #include "gtkbutton.h"
 #include "gtkbuildable.h"
 #include "gtkcenterlayout.h"
-#include "gtkcontainerprivate.h"
 #include "gtkcssnodeprivate.h"
 #include "gtkimage.h"
 #include "gtkintl.h"
diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c
index 2ca063710e..28f7299023 100644
--- a/gtk/gtklistbox.c
+++ b/gtk/gtklistbox.c
@@ -22,7 +22,6 @@
 #include "gtkactionhelperprivate.h"
 #include "gtkadjustmentprivate.h"
 #include "gtkbuildable.h"
-#include "gtkcontainerprivate.h"
 #include "gtkcssnodeprivate.h"
 #include "gtkgestureclick.h"
 #include "gtkintl.h"
diff --git a/gtk/gtkmodelbutton.c b/gtk/gtkmodelbutton.c
index a6501c1dd5..61b9e3a955 100644
--- a/gtk/gtkmodelbutton.c
+++ b/gtk/gtkmodelbutton.c
@@ -37,7 +37,6 @@
 #include "gtkcssnodeprivate.h"
 #include "gtkcsstypesprivate.h"
 #include "gtkstylecontextprivate.h"
-#include "gtkcontainerprivate.h"
 #include "gtkbuiltiniconprivate.h"
 #include "gtksizegroup.h"
 #include "gtkaccellabelprivate.h"
diff --git a/gtk/gtkpaned.c b/gtk/gtkpaned.c
index a4f0a5bd24..b39d5bd56a 100644
--- a/gtk/gtkpaned.c
+++ b/gtk/gtkpaned.c
@@ -26,7 +26,6 @@
 
 #include "gtkpaned.h"
 
-#include "gtkcontainerprivate.h"
 #include "gtkcssnodeprivate.h"
 #include "gtkcssstylepropertyprivate.h"
 #include "gtkeventcontrollermotion.h"
diff --git a/gtk/gtksizegroup.c b/gtk/gtksizegroup.c
index 2be53f5214..047ac24e16 100644
--- a/gtk/gtksizegroup.c
+++ b/gtk/gtksizegroup.c
@@ -27,7 +27,6 @@
 #include "gtkprivate.h"
 #include "gtksizegroup-private.h"
 #include "gtkwidgetprivate.h"
-#include "gtkcontainerprivate.h"
 
 
 /**
diff --git a/gtk/gtkstack.c b/gtk/gtkstack.c
index 887c9cf6c9..2efdd2be06 100644
--- a/gtk/gtkstack.c
+++ b/gtk/gtkstack.c
@@ -25,7 +25,6 @@
 #include "gtkstack.h"
 #include "gtkprivate.h"
 #include "gtkintl.h"
-#include "gtkcontainerprivate.h"
 #include "gtkprogresstrackerprivate.h"
 #include "gtksettingsprivate.h"
 #include "gtksnapshot.h"
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index cb184f2bd9..dc8540fa63 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -31,7 +31,6 @@
 #include "gtkapplicationprivate.h"
 #include "gtkbuildable.h"
 #include "gtkbuilderprivate.h"
-#include "gtkcontainerprivate.h"
 #include "gtkcssboxesprivate.h"
 #include "gtkcssfiltervalueprivate.h"
 #include "gtkcsstransformvalueprivate.h"
@@ -2885,6 +2884,112 @@ gtk_widget_unmap (GtkWidget *widget)
     }
 }
 
+static gboolean
+gtk_widget_needs_idle_sizer (GtkWidget *widget)
+{
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
+  if (priv->restyle_pending)
+    return TRUE;
+
+  return gtk_widget_needs_allocate (widget);
+}
+
+static void
+gtk_widget_idle_sizer (GdkFrameClock *clock,
+                       GtkWidget     *widget)
+{
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
+  /* We validate the style contexts in a single loop before even trying
+   * to handle resizes instead of doing validations inline.
+   * This is mostly necessary for compatibility reasons with old code,
+   * because both css_changed and size_allocate functions often change
+   * styles and so could cause infinite loops in this function.
+   *
+   * It's important to note that even an invalid style context returns
+   * sane values. So the result of an invalid style context will never be
+   * a program crash, but only a wrong layout or rendering.
+   */
+  if (priv->restyle_pending)
+    {
+      priv->restyle_pending = FALSE;
+      gtk_css_node_validate (gtk_widget_get_css_node (widget));
+    }
+
+  /* we may be invoked with a container_resize_queue of NULL, because
+   * queue_resize could have been adding an extra idle function while
+   * the queue still got processed. we better just ignore such case
+   * than trying to explicitly work around them with some extra flags,
+   * since it doesn't cause any actual harm.
+   */
+  if (gtk_widget_needs_allocate (widget))
+    {
+      if (GTK_IS_ROOT (widget))
+        gtk_native_check_resize (GTK_NATIVE (widget));
+      else
+        g_warning ("gtk_widget_idle_sizer() called on a non-native non-window");
+    }
+
+  if (!gtk_widget_needs_idle_sizer (widget))
+    {
+      gtk_widget_stop_idle_sizer (widget);
+    }
+  else
+    {
+      gdk_frame_clock_request_phase (clock,
+                                     GDK_FRAME_CLOCK_PHASE_LAYOUT);
+    }
+}
+
+void
+gtk_widget_start_idle_sizer (GtkWidget *widget)
+{
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+  GdkFrameClock *clock;
+
+  if (priv->resize_handler != 0)
+    return;
+
+  if (!gtk_widget_needs_idle_sizer (widget))
+    return;
+
+  clock = gtk_widget_get_frame_clock (widget);
+  if (clock == NULL)
+    return;
+  
+  priv->resize_handler = g_signal_connect (clock, "layout",
+                                           G_CALLBACK (gtk_widget_idle_sizer), widget);
+  gdk_frame_clock_request_phase (clock,
+                                 GDK_FRAME_CLOCK_PHASE_LAYOUT);
+}
+
+void
+gtk_widget_stop_idle_sizer (GtkWidget *widget)
+{
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
+  if (priv->resize_handler == 0)
+    return;
+
+  g_signal_handler_disconnect (gtk_widget_get_frame_clock (widget),
+                               priv->resize_handler);
+  priv->resize_handler = 0;
+}
+
+void
+gtk_widget_queue_restyle (GtkWidget *widget)
+{
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
+  if (priv->restyle_pending)
+    return;
+
+  priv->restyle_pending = TRUE;
+  gtk_widget_start_idle_sizer (widget);
+}
+
+
 typedef struct _GtkTickCallbackInfo GtkTickCallbackInfo;
 
 struct _GtkTickCallbackInfo
@@ -3104,8 +3209,8 @@ gtk_widget_connect_frame_clock (GtkWidget *widget)
   GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
   GdkFrameClock *frame_clock;
 
-  if (GTK_IS_CONTAINER (widget) && GTK_IS_ROOT (widget))
-    gtk_container_start_idle_sizer (GTK_CONTAINER (widget));
+  if (GTK_IS_ROOT (widget))
+    gtk_widget_start_idle_sizer (widget);
 
   frame_clock = gtk_widget_get_frame_clock (widget);
 
@@ -3125,8 +3230,8 @@ gtk_widget_disconnect_frame_clock (GtkWidget *widget)
 {
   GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
 
-  if (GTK_IS_CONTAINER (widget) && GTK_IS_ROOT (widget))
-    gtk_container_stop_idle_sizer (GTK_CONTAINER (widget));
+  if (GTK_IS_ROOT (widget))
+    gtk_widget_stop_idle_sizer (widget);
 
   gtk_css_node_invalidate_frame_clock (priv->cssnode, FALSE);
 
@@ -10446,7 +10551,7 @@ gtk_widget_set_alloc_needed (GtkWidget *widget)
 
       if (GTK_IS_ROOT (widget))
         {
-          gtk_container_start_idle_sizer (GTK_CONTAINER (widget));
+          gtk_widget_start_idle_sizer (widget);
           break;
         }
 
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index db969f4cb2..9133db9edb 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -111,6 +111,8 @@ struct _GtkWidgetPrivate
   guint   halign              : 4;
   guint   valign              : 4;
 
+  guint   restyle_pending     : 1;
+
   GtkOverflow overflow;
   guint8 alpha;
   guint8 user_alpha;
@@ -128,6 +130,8 @@ struct _GtkWidgetPrivate
   guint clock_tick_id;
   GList *tick_callbacks;
 
+  guint resize_handler;
+
   /* Surface relative transform updates callbacks */
   GtkWidgetSurfaceTransformData *surface_transform_data;
 
@@ -361,6 +365,11 @@ guint             gtk_widget_add_surface_transform_changed_callback (GtkWidget
 void              gtk_widget_remove_surface_transform_changed_callback (GtkWidget *widget,
                                                                         guint      id);
 
+/* resize machinery */
+void     gtk_widget_queue_restyle    (GtkWidget        *widget);
+void     gtk_widget_stop_idle_sizer  (GtkWidget        *widget);
+void     gtk_widget_start_idle_sizer (GtkWidget        *widget);
+
 /* focus vfuncs for non-focusable non-containers */
 gboolean gtk_widget_grab_focus_none  (GtkWidget        *widget);
 gboolean gtk_widget_focus_none       (GtkWidget        *widget,
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index fdc0cf8f1b..0b5874931a 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -33,7 +33,6 @@
 #include "gtkbuilderprivate.h"
 #include "gtkbutton.h"
 #include "gtkcheckbutton.h"
-#include "gtkcontainerprivate.h"
 #include "gtkcsscornervalueprivate.h"
 #include "gtkcssiconthemevalueprivate.h"
 #include "gtkcsscolorvalueprivate.h"


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