clutter/actor: Use different view list when picking frame clock of stage

Apparently it can happen that a timeline tries to pick a frame clock
from an actor that's on a stage, but the actor still doesn't find a
frame clock and returns NULL.

This probably is the case when starting a timeline right after attaching
an actor to a newly created stage, so before the first stage-update
cycle. In this case clutter_actor_update_stage_views() will not have run
and the stage-actor will have priv->stage_views set to NULL even though
there are stage views.

To prevent this from happening, use the complete list of stage views
maintained by the backend when picking a frame clock for the stage.

This doesn't fix any issue appearing on master, but is correct
nonetheless.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1631>
This commit is contained in:
Jonas Dreßler 2020-12-11 21:02:56 +01:00 committed by Marge Bot
parent fbe1a16a6b
commit 9693462f32

View File

@ -15897,11 +15897,16 @@ clutter_actor_pick_frame_clock (ClutterActor *self,
ClutterActor **out_actor)
{
ClutterActorPrivate *priv = self->priv;
GList *stage_views_list;
float max_refresh_rate = 0.0;
ClutterStageView *best_view = NULL;
GList *l;
if (!priv->stage_views)
stage_views_list = CLUTTER_IS_STAGE (self)
? clutter_stage_peek_stage_views (CLUTTER_STAGE (self))
: priv->stage_views;
if (!stage_views_list)
{
if (priv->parent)
return clutter_actor_pick_frame_clock (priv->parent, out_actor);
@ -15909,7 +15914,7 @@ clutter_actor_pick_frame_clock (ClutterActor *self,
return NULL;
}
for (l = priv->stage_views; l; l = l->next)
for (l = stage_views_list; l; l = l->next)
{
ClutterStageView *view = l->data;
float refresh_rate;