Created
April 11, 2018 13:41
-
-
Save bokuweb/011a0e8473e237bfe419269c4b19cde0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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