mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
libservo: Move animation tracking from WindowMethods
to delegates (#36400)
This changes removes animation tracking from the `WindowMethods` trait and moves it to `ServoDelegate` and `WebViewDelegate`. - Animation changes per-`WebView` are now triggered in the compositor only when the value is updated there, rather than right after ticking animations. - Both `WebView` and `Servo` now expose an `animation()` method, so tracking animation state actually becomes unecessary in many cases, such as that of desktop servoshell, which can just read the value when the event loop spins. Testing: No tests necessary as the API layer is still untested. Later, tests will be added for the `WebView` API and this can be tested then. Signed-off-by: Martin Robinson <mrobinson@igalia.com> Signed-off-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
parent
935db71183
commit
2fe57cc2a2
15 changed files with 153 additions and 125 deletions
|
@ -217,37 +217,41 @@ impl WebView {
|
|||
})
|
||||
}
|
||||
|
||||
/// Sets or unsets the animations-running flag for the given pipeline, and schedules a
|
||||
/// recomposite if necessary. Returns true if the pipeline is throttled.
|
||||
/// Sets or unsets the animations-running flag for the given pipeline. Returns true if
|
||||
/// the pipeline is throttled.
|
||||
pub(crate) fn change_running_animations_state(
|
||||
&mut self,
|
||||
pipeline_id: PipelineId,
|
||||
animation_state: AnimationState,
|
||||
) -> bool {
|
||||
let pipeline_details = self.ensure_pipeline_details(pipeline_id);
|
||||
match animation_state {
|
||||
AnimationState::AnimationsPresent => {
|
||||
pipeline_details.animations_running = true;
|
||||
},
|
||||
AnimationState::AnimationCallbacksPresent => {
|
||||
pipeline_details.animation_callbacks_running = true;
|
||||
},
|
||||
AnimationState::NoAnimationsPresent => {
|
||||
pipeline_details.animations_running = false;
|
||||
},
|
||||
AnimationState::NoAnimationCallbacksPresent => {
|
||||
pipeline_details.animation_callbacks_running = false;
|
||||
},
|
||||
}
|
||||
pipeline_details.throttled
|
||||
let throttled = {
|
||||
let pipeline_details = self.ensure_pipeline_details(pipeline_id);
|
||||
match animation_state {
|
||||
AnimationState::AnimationsPresent => {
|
||||
pipeline_details.animations_running = true;
|
||||
},
|
||||
AnimationState::AnimationCallbacksPresent => {
|
||||
pipeline_details.animation_callbacks_running = true;
|
||||
},
|
||||
AnimationState::NoAnimationsPresent => {
|
||||
pipeline_details.animations_running = false;
|
||||
},
|
||||
AnimationState::NoAnimationCallbacksPresent => {
|
||||
pipeline_details.animation_callbacks_running = false;
|
||||
},
|
||||
}
|
||||
pipeline_details.throttled
|
||||
};
|
||||
|
||||
let animating = self.pipelines.values().any(PipelineDetails::animating);
|
||||
self.renderer_webview.set_animating(animating);
|
||||
throttled
|
||||
}
|
||||
|
||||
pub(crate) fn tick_all_animations(&self, compositor: &IOCompositor) -> bool {
|
||||
let mut ticked_any = false;
|
||||
pub(crate) fn tick_all_animations(&self, compositor: &IOCompositor) {
|
||||
for pipeline_details in self.pipelines.values() {
|
||||
ticked_any = pipeline_details.tick_animations(compositor) || ticked_any;
|
||||
pipeline_details.tick_animations(compositor)
|
||||
}
|
||||
ticked_any
|
||||
}
|
||||
|
||||
pub(crate) fn tick_animations_for_pipeline(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue