From 2791f5b466efbb165e5a69cb64b205f8779b306b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Tue, 5 May 2020 16:19:46 +0200 Subject: [PATCH] clutter/actor: Make has_mapped_clones() factor in parent actors All existing users of clutter_actor_has_mapped_clones() actually want to know whether the actor is being cloned by a visible clone, it doesn't matter to them if that clone is attached to an actor somewhere else in the tree or to the actor itself. So make clutter_actor_has_mapped_clones() a bit more convenient to use and also check the clones of the parent-actors in that function. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1235 --- clutter/clutter/clutter-actor.c | 47 ++++++++++++++++------------- src/compositor/meta-surface-actor.c | 12 ++------ 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c index e60e87f71..05d901962 100644 --- a/clutter/clutter/clutter-actor.c +++ b/clutter/clutter/clutter-actor.c @@ -8847,25 +8847,21 @@ _clutter_actor_queue_redraw_full (ClutterActor *self, if (CLUTTER_ACTOR_IN_DESTRUCTION (self)) return; - /* we can ignore unmapped actors, unless they have at least one - * mapped clone or they are inside a cloned branch of the scene - * graph, as unmapped actors will simply be left unpainted. + /* we can ignore unmapped actors, unless they are inside a cloned branch + * of the scene graph, as unmapped actors will simply be left unpainted. * * this allows us to ignore redraws queued on leaf nodes when one * of their parents has been hidden */ if (!CLUTTER_ACTOR_IS_MAPPED (self) && - self->priv->in_cloned_branch == 0 && !clutter_actor_has_mapped_clones (self)) { CLUTTER_NOTE (PAINT, "Skipping queue_redraw('%s'): mapped=%s, " - "mapped_clones=%s, " - "in_cloned_branch=%s", + "has_mapped_clones=%s", _clutter_actor_get_debug_name (self), CLUTTER_ACTOR_IS_MAPPED (self) ? "yes" : "no", - clutter_actor_has_mapped_clones (self) ? "yes" : "no", - self->priv->in_cloned_branch != 0 ? "yes" : "no"); + clutter_actor_has_mapped_clones (self) ? "yes" : "no"); return; } @@ -19084,7 +19080,6 @@ should_skip_implicit_transition (ClutterActor *self, * when those transitions happen */ if (!CLUTTER_ACTOR_IS_MAPPED (self) && - priv->in_cloned_branch == 0 && !clutter_actor_has_mapped_clones (self)) return TRUE; @@ -20704,31 +20699,41 @@ _clutter_actor_queue_relayout_on_clones (ClutterActor *self) * clutter_actor_has_mapped_clones: * @self: a #ClutterActor * - * Returns whether a #ClutterActor has any mapped clones. + * Returns whether a #ClutterActor or any parent actors have mapped clones + * that are clone-painting @self. * - * Return: %TRUE if the actor has mapped clones, and %FALSE otherwise - * - * Since: 1.16 + * Returns: %TRUE if the actor has mapped clones, %FALSE otherwise */ gboolean clutter_actor_has_mapped_clones (ClutterActor *self) { - ClutterActorPrivate *priv; + ClutterActor *actor; GHashTableIter iter; gpointer key; g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE); - priv = self->priv; - - if (priv->clones == NULL) + if (self->priv->in_cloned_branch == 0) return FALSE; - g_hash_table_iter_init (&iter, priv->clones); - while (g_hash_table_iter_next (&iter, &key, NULL)) + for (actor = self; actor; actor = actor->priv->parent) { - if (CLUTTER_ACTOR_IS_MAPPED (key)) - return TRUE; + if (actor->priv->clones) + { + g_hash_table_iter_init (&iter, actor->priv->clones); + while (g_hash_table_iter_next (&iter, &key, NULL)) + { + if (CLUTTER_ACTOR_IS_MAPPED (key)) + return TRUE; + } + } + + /* Clones will force-show their own source actor but not children of + * it, so if we're hidden and an actor up the hierarchy has a clone, + * we won't be visisble. + */ + if (!CLUTTER_ACTOR_IS_VISIBLE (actor)) + return FALSE; } return FALSE; diff --git a/src/compositor/meta-surface-actor.c b/src/compositor/meta-surface-actor.c index c328fab73..e4639beb0 100644 --- a/src/compositor/meta-surface-actor.c +++ b/src/compositor/meta-surface-actor.c @@ -63,17 +63,11 @@ effective_unobscured_region (MetaSurfaceActor *surface_actor) { MetaSurfaceActorPrivate *priv = meta_surface_actor_get_instance_private (surface_actor); - ClutterActor *actor; + ClutterActor *actor = CLUTTER_ACTOR (surface_actor); /* Fail if we have any mapped clones. */ - actor = CLUTTER_ACTOR (surface_actor); - do - { - if (clutter_actor_has_mapped_clones (actor)) - return NULL; - actor = clutter_actor_get_parent (actor); - } - while (actor != NULL); + if (clutter_actor_has_mapped_clones (actor)) + return NULL; return priv->unobscured_region; }