clutter/actor: Queue redraw on no-layout parents when unmapping

As explained in https://gitlab.gnome.org/GNOME/mutter/-/issues/1494,
with commit 29caa5bea5 we stopped queueing
a relayout for the parent of the removed actor in
clutter_actor_remove_child_internal(). This relayout was, as opposed to
the relayout in clutter_actor_real_hide()/clutter_actor_real_unmap(),
queued unconditionally without looking at the parents NO_LAYOUT flag.

Now while that relayout in clutter_actor_remove_child_internal() would
do unnecessary work if the parent had the NO_LAYOUT flag set, it did
also queue a redraw of the parent, which is necessary in any case.

So by removing that relayout in clutter_actor_remove_child_internal(),
we stopped queueing redraws for NO_LAYOUT parents when a child gets
removed from the scenegraph. This caused bugs where the texture of the
child would be left visible on the screen even though the child got
destroyed.

To fix this, make sure again that we always queue a redraw on the parent
when unmapping a child.

Fixes https://gitlab.gnome.org/GNOME/mutter/-/issues/1494
This commit is contained in:
Jonas Dreßler 2020-11-01 12:33:59 +01:00 committed by Georges Basile Stavracas Neto
parent 7785119787
commit c88615aac8

View File

@ -1648,9 +1648,13 @@ clutter_actor_real_unmap (ClutterActor *self)
_clutter_paint_volume_init_static (&priv->last_paint_volume, NULL); _clutter_paint_volume_init_static (&priv->last_paint_volume, NULL);
priv->last_paint_volume_valid = TRUE; priv->last_paint_volume_valid = TRUE;
if (priv->parent && !CLUTTER_ACTOR_IN_DESTRUCTION (priv->parent) && if (priv->parent && !CLUTTER_ACTOR_IN_DESTRUCTION (priv->parent))
(!(priv->parent->flags & CLUTTER_ACTOR_NO_LAYOUT))) {
clutter_actor_queue_relayout (priv->parent); if (G_UNLIKELY (priv->parent->flags & CLUTTER_ACTOR_NO_LAYOUT))
clutter_actor_queue_redraw (priv->parent);
else
clutter_actor_queue_relayout (priv->parent);
}
} }
/* notify on parent mapped after potentially unmapping /* notify on parent mapped after potentially unmapping