Skip to content
  • Jonas Ådahl's avatar
    stage: Clear `update_scheduled` field when update discarded · 24083e1e
    Jonas Ådahl authored and Marge Bot's avatar Marge Bot committed
    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
    Part-of: <!4152>
    24083e1e
Loading