#[cfg(target_os = "emscripten")] pub mod emscripten { use std::cell::RefCell; use std::os::raw::{c_float, c_int, c_void}; use std::ptr::null_mut; #[allow(non_camel_case_types)] type em_callback_func = unsafe extern "C" fn(); extern "C" { pub fn emscripten_set_main_loop( func: em_callback_func, fps: c_int, simulate_infinite_loop: c_int, ); pub fn emscripten_cancel_main_loop(); pub fn emscripten_get_now() -> c_float; } thread_local!(static MAIN_LOOP_CALLBACK: RefCell<*mut c_void> = RefCell::new(null_mut())); pub fn set_main_loop_callback(callback: F) where F: FnMut(), { MAIN_LOOP_CALLBACK.with(|log| { *log.borrow_mut() = &callback as *const _ as *mut c_void; }); unsafe { emscripten_set_main_loop(wrapper::, 0, 1); } unsafe extern "C" fn wrapper() where F: FnMut(), { MAIN_LOOP_CALLBACK.with(|z| { let closure = *z.borrow_mut() as *mut F; (*closure)(); }); } } }