dioxus/packages/web/src/ric_raf.rs

64 lines
2.1 KiB
Rust
Raw Normal View History

2021-08-24 20:29:10 +00:00
//! RequestAnimationFrame and RequestIdleCallback port and polyfill.
use gloo_timers::future::TimeoutFuture;
use js_sys::Function;
use wasm_bindgen::JsCast;
use wasm_bindgen::{prelude::Closure, JsValue};
use web_sys::Window;
pub struct RafLoop {
window: Window,
ric_receiver: async_channel::Receiver<u32>,
2021-08-24 20:29:10 +00:00
raf_receiver: async_channel::Receiver<()>,
ric_closure: Closure<dyn Fn(JsValue)>,
raf_closure: Closure<dyn Fn(JsValue)>,
}
impl RafLoop {
pub fn new() -> Self {
let (raf_sender, raf_receiver) = async_channel::unbounded();
let raf_closure: Closure<dyn Fn(JsValue)> = Closure::wrap(Box::new(move |_v: JsValue| {
raf_sender.try_send(()).unwrap()
}));
2021-08-24 20:29:10 +00:00
let (ric_sender, ric_receiver) = async_channel::unbounded();
let ric_closure: Closure<dyn Fn(JsValue)> = Closure::wrap(Box::new(move |_v: JsValue| {
//
let deadline = _v.dyn_into::<web_sys::IdleDeadline>().unwrap();
let time_remaining = deadline.time_remaining() as u32;
ric_sender.try_send(time_remaining).unwrap()
}));
2021-08-24 20:29:10 +00:00
2021-08-24 20:36:00 +00:00
// execute the polyfill for safari
Function::new_no_args(include_str!("./ricpolyfill.js"))
.call0(&JsValue::NULL)
.unwrap();
2021-09-22 05:25:28 +00:00
let window = web_sys::window().unwrap();
2021-08-24 20:29:10 +00:00
Self {
2021-09-22 05:25:28 +00:00
window,
2021-08-24 20:29:10 +00:00
raf_receiver,
raf_closure,
ric_receiver,
ric_closure,
}
}
/// waits for some idle time and returns a timeout future that expires after the idle time has passed
pub async fn wait_for_idle_time(&self) -> TimeoutFuture {
let ric_fn = self.ric_closure.as_ref().dyn_ref::<Function>().unwrap();
let _cb_id: u32 = self.window.request_idle_callback(ric_fn).unwrap();
let deadline = self.ric_receiver.recv().await.unwrap();
2021-08-24 20:29:10 +00:00
let deadline = TimeoutFuture::new(deadline);
deadline
}
pub async fn wait_for_raf(&self) {
let raf_fn = self.raf_closure.as_ref().dyn_ref::<Function>().unwrap();
let _id: i32 = self.window.request_animation_frame(raf_fn).unwrap();
2021-08-24 20:29:10 +00:00
self.raf_receiver.recv().await.unwrap();
}
}