container: Request layout again depending on layout mode

Containers with RESIZE_MODE_PARENT should never request layout and those
with RESIZE_MODE_IMMEDIATE should only request it for updating CSS.

Fixes clutter embeds (like the tray icon embed in gnome-shell)
continuously requesting relayout when all they want to do is relegate
relayout to Clutter.

https://bugzilla.gnome.org/show_bug.cgi?id=758893
This commit is contained in:
Benjamin Otte 2016-02-22 21:38:03 +01:00
parent 70b9ea2c4b
commit c3dc0d80f1

View File

@ -2000,6 +2000,23 @@ gtk_container_set_reallocate_redraws (GtkContainer *container,
container->priv->reallocate_redraws = needs_redraws ? TRUE : FALSE; container->priv->reallocate_redraws = needs_redraws ? TRUE : FALSE;
} }
static gboolean
gtk_container_needs_idle_sizer (GtkContainer *container)
{
GtkContainerPrivate *priv = container->priv;
if (priv->resize_mode == GTK_RESIZE_PARENT)
return FALSE;
if (container->priv->restyle_pending)
return TRUE;
if (priv->resize_mode == GTK_RESIZE_IMMEDIATE)
return FALSE;
return gtk_widget_needs_allocate (GTK_WIDGET (container));
}
static void static void
gtk_container_idle_sizer (GdkFrameClock *clock, gtk_container_idle_sizer (GdkFrameClock *clock,
GtkContainer *container) GtkContainer *container)
@ -2031,7 +2048,7 @@ gtk_container_idle_sizer (GdkFrameClock *clock,
gtk_container_check_resize (container); gtk_container_check_resize (container);
} }
if (!container->priv->restyle_pending && !gtk_widget_needs_allocate (GTK_WIDGET (container))) if (!gtk_container_needs_idle_sizer (container))
{ {
_gtk_container_stop_idle_sizer (container); _gtk_container_stop_idle_sizer (container);
} }
@ -2126,12 +2143,7 @@ _gtk_container_queue_restyle (GtkContainer *container)
void void
_gtk_container_maybe_start_idle_sizer (GtkContainer *container) _gtk_container_maybe_start_idle_sizer (GtkContainer *container)
{ {
G_GNUC_BEGIN_IGNORE_DEPRECATIONS; if (gtk_container_needs_idle_sizer (container))
if (!GTK_IS_RESIZE_CONTAINER (container))
return;
G_GNUC_END_IGNORE_DEPRECATIONS;
if (container->priv->restyle_pending || gtk_widget_needs_allocate (GTK_WIDGET (container)))
gtk_container_start_idle_sizer (container); gtk_container_start_idle_sizer (container);
} }