2021-07-12 10:13:34 +00:00
|
|
|
/// 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.
|
2017-11-12 13:53:50 +00:00
|
|
|
|
|
|
|
/// On macOS this launches the callback function on a thread.
|
|
|
|
/// On other platforms it's just executed immediately.
|
|
|
|
#[cfg(not(target_os = "macos"))]
|
2017-11-12 19:11:25 +00:00
|
|
|
pub fn run<T, F: FnOnce() -> T + Send + 'static>(main: F) -> T
|
|
|
|
where
|
|
|
|
T: Send + 'static,
|
|
|
|
{
|
|
|
|
main()
|
2017-11-12 13:53:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(target_os = "macos")]
|
2017-11-12 19:11:25 +00:00
|
|
|
pub fn run<T, F: FnOnce() -> T + Send + 'static>(main: F) -> T
|
|
|
|
where
|
|
|
|
T: Send + 'static,
|
|
|
|
{
|
2021-07-12 10:13:34 +00:00
|
|
|
use cocoa::appkit::NSApplication;
|
2017-11-12 19:11:25 +00:00
|
|
|
|
2021-07-12 10:13:34 +00:00
|
|
|
use std::thread;
|
2017-11-12 19:11:25 +00:00
|
|
|
|
2021-07-12 10:13:34 +00:00
|
|
|
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);
|
|
|
|
|
|
|
|
std::process::exit(0);
|
|
|
|
|
|
|
|
res
|
|
|
|
});
|
|
|
|
|
|
|
|
app.run();
|
|
|
|
|
|
|
|
t.join().unwrap()
|
|
|
|
}
|
2017-11-12 13:53:50 +00:00
|
|
|
}
|