use std::sync::Arc;
use inset_embedder::{EmbedderClient, Frame};
use crate::window::{HostEvent, WinitApp};
impl<C: EmbedderClient> WinitApp<C> {
pub(crate) fn pace(&mut self) {
if !self.platform.frame_requested.get() && !self.retries_at_refresh() {
return;
}
let source = self
.frame_source
.and_then(|id| self.views.get(&id))
.map(|hosted| Arc::clone(&hosted.window));
let Some(window) = source else {
self.platform.frame_requested.set(false);
self.draw_frame();
return;
};
let proxy = self.platform.proxy.clone();
self.pacing.keep_ticking(&window, move || {
let _ = proxy.send_event(HostEvent::Vsync);
});
}
pub(crate) fn tick(&mut self) {
let requested = self.platform.frame_requested.get();
if self.pacing.tick(requested || self.retries_at_refresh()) && requested {
self.platform.frame_requested.set(false);
self.draw_frame();
}
for hosted in self.views.values() {
if hosted.view.retries_at_refresh() {
hosted.view.retry();
}
}
}
fn retries_at_refresh(&self) -> bool {
self.views
.values()
.any(|hosted| hosted.view.retries_at_refresh())
}
pub(crate) fn draw_frame(&mut self) {
let Some(client) = &mut self.client else {
return;
};
client.frame(Frame {
elapsed: self.platform.elapsed(),
});
}
}