Skip to content

Instantly share code, notes, and snippets.

@bokuweb
Created April 11, 2018 13:41
Show Gist options
  • Select an option

  • Save bokuweb/011a0e8473e237bfe419269c4b19cde0 to your computer and use it in GitHub Desktop.

Select an option

Save bokuweb/011a0e8473e237bfe419269c4b19cde0 to your computer and use it in GitHub Desktop.
use std::cell::RefCell;
use std::ptr::null_mut;
use std::os::raw::{c_int, c_void};
#[allow(non_camel_case_types)]
type em_callback_func = unsafe extern "C" fn();
thread_local!(static MAIN_LOOP_CALLBACK: RefCell<*mut c_void> = RefCell::new(null_mut()));
extern "C" {
pub fn emscripten_cancel_main_loop();
pub fn emscripten_set_main_loop(func: em_callback_func,
fps: c_int,
simulate_infinite_loop: c_int);
}
pub fn cancel_main_loop() {
unsafe { emscripten_cancel_main_loop(); }
}
pub fn set_main_loop_callback<F>(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::<F>, 0, 1);
}
}
unsafe extern "C" fn wrapper<F>()
where F: FnMut()
{
MAIN_LOOP_CALLBACK.with(|z| {
let closure = *z.borrow_mut() as *mut F;
(*closure)();
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment