[gtk/container-focus-cleanup] Move the idle size to GtkWidget
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/container-focus-cleanup] Move the idle size to GtkWidget
- Date: Sun, 19 Apr 2020 15:45:05 +0000 (UTC)
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]