/// 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 std::thread; use cocoa::appkit::NSApplication; unsafe { let app = cocoa::appkit::NSApp(); let t = thread::spawn(|| { let res = main(); let app = cocoa::appkit::NSApp(); app.stop_(cocoa::base::nil); // Stopping the event loop requires an actual event let event = cocoa::appkit::NSEvent::otherEventWithType_location_modifierFlags_timestamp_windowNumber_context_subtype_data1_data2_( cocoa::base::nil, cocoa::appkit::NSEventType::NSApplicationDefined, cocoa::foundation::NSPoint { x: 0.0, y: 0.0 }, cocoa::appkit::NSEventModifierFlags::empty(), 0.0, 0, cocoa::base::nil, cocoa::appkit::NSEventSubtype::NSApplicationActivatedEventType, 0, 0, ); app.postEvent_atStart_(event, cocoa::base::YES); res }); app.run(); t.join().unwrap() } }