diff options
author | Benjamin Otte <otte@redhat.com> | 2015-09-29 23:19:07 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2015-10-28 19:44:28 +0100 |
commit | 6866d1c06e338002bf584b0b9529154e33b5e86a (patch) | |
tree | aebedbff9d697195f4b9b1783b60554cbe7d9455 /gtk/gtkwidget.c | |
parent | 299600a7d4853b5df28e94a3dd8c9f52a2d84202 (diff) | |
download | gtk+-6866d1c06e338002bf584b0b9529154e33b5e86a.tar.gz |
widget: Make gtk_widget_queue_allocate() not resize
This commit toggles the big switch. We now don't run size_allocate()
from the toplevel up anymore in cases where we don't need to.
Things might be broken in subtle ways as a result of this commit. We'll
have to find them and fix them.
Diffstat (limited to 'gtk/gtkwidget.c')
-rw-r--r-- | gtk/gtkwidget.c | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index fee05a7675..a1d5153cfd 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -5577,6 +5577,8 @@ gtk_widget_queue_draw (GtkWidget *widget) 0, 0, rect.width, rect.height); } +static void +gtk_widget_set_alloc_needed (GtkWidget *widget); /** * gtk_widget_queue_allocate: * @widget: a #GtkWidget @@ -5595,8 +5597,7 @@ gtk_widget_queue_allocate (GtkWidget *widget) { g_return_if_fail (GTK_IS_WIDGET (widget)); - /* for now... */ - gtk_widget_queue_resize (widget); + gtk_widget_set_alloc_needed (widget); } /** @@ -6085,6 +6086,9 @@ gtk_widget_size_allocate_with_baseline (GtkWidget *widget, } out: + if (priv->alloc_needed_on_child) + gtk_widget_ensure_allocate (widget); + gtk_widget_pop_verify_invariants (widget); } @@ -16234,6 +16238,14 @@ gtk_widget_set_alloc_needed (GtkWidget *widget) if (!priv->visible) break; +G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + if (GTK_IS_RESIZE_CONTAINER (widget)) + { + gtk_container_queue_resize_handler (GTK_CONTAINER (widget)); + break; + } +G_GNUC_END_IGNORE_DEPRECATIONS; + widget = priv->parent; if (widget == NULL) break; @@ -16244,6 +16256,40 @@ gtk_widget_set_alloc_needed (GtkWidget *widget) } void +gtk_widget_ensure_allocate (GtkWidget *widget) +{ + GtkWidgetPrivate *priv = widget->priv; + + gtk_widget_ensure_resize (widget); + + if (!priv->visible || !priv->child_visible) + return; + + /* 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 + * things. + */ + if (priv->alloc_needed) + { + GtkAllocation allocation; + int baseline; + + gtk_widget_get_allocated_size (widget, &allocation, &baseline); + gtk_widget_size_allocate_with_baseline (widget, &allocation, baseline); + } + else if (priv->alloc_needed_on_child) + { + priv->alloc_needed_on_child = FALSE; + + if (GTK_IS_CONTAINER (widget)) + gtk_container_foreach (GTK_CONTAINER (widget), + (GtkCallback) gtk_widget_ensure_allocate, + NULL); + } +} + +void gtk_widget_queue_resize_on_widget (GtkWidget *widget) { GtkWidgetPrivate *priv = widget->priv; |