Fix stage update scheduling race condition
From the main commit:
stage: Clear update_scheduled
field when update discarded
clutter_stage_schedule_update() sets the field update_scheduled
to
TRUE
as an optimization to make redundant updates a no-op. This failed
if there was a pending event and if the stage was not yet mapped.
What happened is:
- clutter_stage_schedule_update() is called
- ClutterStage::update_scheduled is set to TRUE
- frame clock scheduled
- frame clock dispatches
- frame is discarded early, no actual stage update happens
- device is created (e.g. virtual device from remote desktop session)
-
device-added
event reaches ClutterStage::event_queue - stage is shown
- clutter_stage_schedule_update() is called
- ClutterStage::update_scheduled is TRUE
- ClutterStage::event_queue has events in it
- These two conditions means clutter_schedule_update() becomes a no-op
At this point, no more updates will happen from clutter_stage_schedule_update().
Fix this by resetting ClutterStage::update_scheduled
to FALSE
even
if the frame was discarded due to the stage not yet being mapped.
A test case is added that replicates the above descibed events.
Closes: #3804 (closed)