From dcf0717d7d90ff525c4f87cf633353caabf0eeeb Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Fri, 10 Aug 2018 21:30:58 +0200 Subject: [PATCH 2/2] clutter: Avoid relayouts when raising/lowering children These calls don't actually affect the layout, but the paint order. It seems safe to skip the full relayout/repaint of the parent actor, and redraw only the area occupied by the affected child. --- clutter/clutter/clutter-actor.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c index 6954f0396..7a9da7257 100644 --- a/clutter/clutter/clutter-actor.c +++ b/clutter/clutter/clutter-actor.c @@ -1713,6 +1713,22 @@ set_show_on_set_parent (ClutterActor *self, } } +static void +clutter_actor_queue_redraw_on_parent (ClutterActor *self) +{ + const ClutterPaintVolume *pv; + + if (!self->priv->parent) + return; + + /* A relayout/redraw is underway */ + if (self->priv->needs_allocation) + return; + + pv = clutter_actor_get_transformed_paint_volume (self, self->priv->parent); + _clutter_actor_queue_redraw_with_clip (self->priv->parent, 0, pv); +} + /** * clutter_actor_show: * @self: A #ClutterActor @@ -13618,7 +13634,7 @@ clutter_actor_set_child_above_sibling (ClutterActor *self, sibling); g_object_unref(child); - clutter_actor_queue_relayout (self); + clutter_actor_queue_redraw_on_parent (child); } /** @@ -13665,7 +13681,7 @@ clutter_actor_set_child_below_sibling (ClutterActor *self, sibling); g_object_unref(child); - clutter_actor_queue_relayout (self); + clutter_actor_queue_redraw_on_parent (child); } /** -- 2.21.0