forked from mirrors/gstreamer-rs
a091ea201c
This is required for OpenGL to work nowadays on macOS. Simply running an CFRunLoop on the main thread is not sufficient. Thanks to Philippe Normand for testing this on macOS and making sure it actually compiles and works.
56 lines
1.6 KiB
Rust
56 lines
1.6 KiB
Rust
/// 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, F: FnOnce() -> T + Send + 'static>(main: F) -> T
|
|
where
|
|
T: Send + 'static,
|
|
{
|
|
main()
|
|
}
|
|
|
|
#[cfg(target_os = "macos")]
|
|
pub fn run<T, F: FnOnce() -> T + Send + 'static>(main: F) -> T
|
|
where
|
|
T: Send + 'static,
|
|
{
|
|
use cocoa::appkit::NSApplication;
|
|
|
|
use std::thread;
|
|
|
|
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()
|
|
}
|
|
}
|