From 26344fb5332c252071027612b6134677d0c7e942 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Thu, 25 May 2023 17:59:27 +0200 Subject: [PATCH] clutter/actor: Don't store a second stage-views list for the stage The stage already maintains its own list of stage-views via clutter_stage_peek_stage_views(), it's a bit superfluous to copy that list around all the time into priv->stage_views of ClutterActor. Let's deal with that by returning clutter_stage_peek_stage_views() when clutter_actor_peek_stage_views() gets called for the stage. In order to make sure ClutterActor::stage-views-changed still gets emitted correctly for the stage, always emit that signal on the ClutterStage when the stage views get invalidated. This now depends on the backend only actually invalidating the views and calling clutter_stage_clear_stage_views() when things have actually changed, but that should be the case. This needs a change in one of the stage-views tests, namely the one which tests stage-view-changed emission on the stage: Here we now see an emission of stage-views-changed, but that signal emission actually seems correct. Part-of: --- clutter/clutter/clutter-actor.c | 18 ++++++++++-------- src/tests/stage-view-tests.c | 5 ++++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c index 9a04787ab..1ed3d57c9 100644 --- a/clutter/clutter/clutter-actor.c +++ b/clutter/clutter/clutter-actor.c @@ -5715,11 +5715,10 @@ static float clutter_actor_real_calculate_resource_scale (ClutterActor *self, int phase) { - ClutterActorPrivate *priv = self->priv; GList *l; float new_resource_scale = -1.f; - for (l = priv->stage_views; l; l = l->next) + for (l = clutter_actor_peek_stage_views (self); l; l = l->next) { ClutterStageView *view = l->data; @@ -15290,7 +15289,7 @@ clear_stage_views_cb (ClutterActor *actor, old_stage_views = g_steal_pointer (&actor->priv->stage_views); - if (old_stage_views) + if (old_stage_views || CLUTTER_ACTOR_IS_TOPLEVEL (actor)) actor->priv->clear_stage_views_needs_stage_views_changed = TRUE; return CLUTTER_ACTOR_TRAVERSE_VISIT_CONTINUE; @@ -15495,6 +15494,9 @@ update_stage_views (ClutterActor *self) ClutterStage *stage; graphene_rect_t bounding_rect; + if (CLUTTER_ACTOR_IS_TOPLEVEL (self)) + return; + stage = CLUTTER_STAGE (_clutter_actor_get_stage_internal (self)); g_return_if_fail (stage); @@ -15642,7 +15644,9 @@ clutter_actor_peek_stage_views (ClutterActor *self) { g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE); - return self->priv->stage_views; + return CLUTTER_ACTOR_IS_TOPLEVEL (self) + ? clutter_stage_peek_stage_views (CLUTTER_STAGE (self)) + : self->priv->stage_views; } gboolean @@ -15657,7 +15661,7 @@ clutter_actor_is_effectively_on_stage_view (ClutterActor *self, !clutter_actor_has_mapped_clones (self)) return FALSE; - if (g_list_find (self->priv->stage_views, view)) + if (g_list_find (clutter_actor_peek_stage_views (self), view)) return TRUE; for (actor = self; actor; actor = actor->priv->parent) @@ -15714,9 +15718,7 @@ clutter_actor_pick_frame_clock (ClutterActor *self, ClutterStageView *best_view = NULL; GList *l; - stage_views_list = CLUTTER_IS_STAGE (self) - ? clutter_stage_peek_stage_views (CLUTTER_STAGE (self)) - : priv->stage_views; + stage_views_list = clutter_actor_peek_stage_views (self); if (!stage_views_list) { diff --git a/src/tests/stage-view-tests.c b/src/tests/stage-view-tests.c index 221e933ef..6a659ef31 100644 --- a/src/tests/stage-view-tests.c +++ b/src/tests/stage-view-tests.c @@ -1241,6 +1241,9 @@ meta_test_timeline_actor_destroyed (void) G_CALLBACK (on_stage_views_changed), &did_stage_views_changed); + stage_views = clutter_stage_peek_stage_views (CLUTTER_STAGE (stage)); + g_assert_cmpint (g_list_length (stage_views), ==, 0); + clutter_actor_destroy (actor); g_object_unref (timeline); @@ -1249,7 +1252,7 @@ meta_test_timeline_actor_destroyed (void) stage_views = clutter_stage_peek_stage_views (CLUTTER_STAGE (stage)); g_assert_cmpint (g_list_length (stage_views), ==, 1); - g_assert_false (did_stage_views_changed); + g_assert_true (did_stage_views_changed); clutter_actor_queue_redraw (persistent_actor); clutter_stage_schedule_update (CLUTTER_STAGE (stage)); wait_for_paint (stage);