diff --git a/egui_web/src/backend.rs b/egui_web/src/backend.rs index bc76346d..5eccb89c 100644 --- a/egui_web/src/backend.rs +++ b/egui_web/src/backend.rs @@ -200,6 +200,7 @@ pub fn start(app_runner: AppRunner) -> Result { let runner_ref = AppRunnerRef(Arc::new(Mutex::new(app_runner))); install_canvas_events(&runner_ref)?; install_document_events(&runner_ref)?; + repaint_every_ms(&runner_ref, 1000)?; // just in case. TODO: make it a parameter paint_and_schedule(runner_ref.clone())?; Ok(runner_ref) } diff --git a/egui_web/src/lib.rs b/egui_web/src/lib.rs index 9623f6d5..a6ed6467 100644 --- a/egui_web/src/lib.rs +++ b/egui_web/src/lib.rs @@ -424,6 +424,23 @@ fn install_document_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> { Ok(()) } +/// Repaint at least every `ms` milliseconds. +fn repaint_every_ms(runner_ref: &AppRunnerRef, milliseconds: i32) -> Result<(), JsValue> { + assert!(milliseconds >= 0); + use wasm_bindgen::JsCast; + let window = web_sys::window().unwrap(); + let runner_ref = runner_ref.clone(); + let closure = Closure::wrap(Box::new(move || { + runner_ref.0.lock().needs_repaint = true; + }) as Box); + window.set_interval_with_callback_and_timeout_and_arguments_0( + closure.as_ref().unchecked_ref(), + milliseconds, + )?; + closure.forget(); + Ok(()) +} + fn modifiers_from_event(event: &web_sys::KeyboardEvent) -> egui::Modifiers { egui::Modifiers { alt: event.alt_key(),