[mutter] clutter/actor: Make has_mapped_clones() factor in parent actors
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] clutter/actor: Make has_mapped_clones() factor in parent actors
- Date: Tue, 26 May 2020 13:44:03 +0000 (UTC)
commit 2791f5b466efbb165e5a69cb64b205f8779b306b
Author: Jonas Dreßler <verdre v0yd nl>
Date: Tue May 5 16:19:46 2020 +0200
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;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]