aboutsummaryrefslogtreecommitdiffstats
path: root/src/render_loop.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/render_loop.rs')
-rw-r--r--src/render_loop.rs16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/render_loop.rs b/src/render_loop.rs
index 628e687..7056493 100644
--- a/src/render_loop.rs
+++ b/src/render_loop.rs
@@ -4,6 +4,8 @@ use std::rc::Rc;
use log::error;
use wasm_bindgen::prelude::*;
+use crate::JSResult;
+
/// use `window.requestAnimationFrame()` to schedule calling a
/// function as long as the function returns true.
pub struct RenderLoop {
@@ -21,7 +23,7 @@ impl RenderLoop {
/// `fun` takes a timestamp in the same space as the document
/// timeline and returns a flag specifying whether we should
/// schedule another frame..
- pub fn new<T: FnMut(f64) -> bool + 'static>(mut fun: T) -> Self {
+ pub fn new<T: FnMut(f64) -> JSResult<bool> + 'static>(mut fun: T) -> Self {
// init with stub closure because rust wants that, then change
// it later once we have our rc clone.
let inner = Rc::new(UnsafeCell::new(Closure::new(|_| {})));
@@ -29,11 +31,15 @@ impl RenderLoop {
let rloop = inner.clone();
let f = unsafe { &mut *inner.get() };
*f = Closure::new(move |t| {
- if fun(t) {
- let cl = unsafe { &*rloop.get() };
- if let Err(e) = Self::request_animation_frame(cl) {
- error!("couldn't request animation frame: {:?}", e);
+ match fun(t) {
+ Err(e) => error!("render callback error: {:?}", e),
+ Ok(true) => {
+ let cl = unsafe { &*rloop.get() };
+ if let Err(e) = Self::request_animation_frame(cl) {
+ error!("couldn't request animation frame: {:?}", e);
+ }
}
+ Ok(false) => {},
}
});