/// macOS has a specific requirement that there must be a run loop running on the main thread in /// order to open windows and use OpenGL, and that the global NSApplication instance must be /// initialized. /// On macOS this launches the callback function on a thread. /// On other platforms it's just executed immediately. #[cfg(not(target_os = "macos"))] pub fn run T + Send + 'static>(main: F) -> T where T: Send + 'static, { main() } #[cfg(target_os = "macos")] pub fn run T + Send + 'static>(main: F) -> T where T: Send + 'static, { use cocoa::appkit::NSApplication; use objc::{msg_send, sel, sel_impl}; use std::thread; unsafe { let app = cocoa::appkit::NSApp(); let t = thread::spawn(|| { let res = main(); let app = cocoa::appkit::NSApp(); let _: () = msg_send![app, terminate: cocoa::base::nil]; res }); app.run(); t.join().unwrap() } }