From ea19409960fd16704e60e6ffa38aa57573c5add8 Mon Sep 17 00:00:00 2001 From: mitchmindtree Date: Sat, 4 Feb 2017 02:54:40 +1100 Subject: [PATCH] Make sure EventsLoop::interrupt awakens the waiting event loop --- src/platform/macos/events_loop.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/platform/macos/events_loop.rs b/src/platform/macos/events_loop.rs index 83301a83..99ed1a17 100644 --- a/src/platform/macos/events_loop.rs +++ b/src/platform/macos/events_loop.rs @@ -136,7 +136,25 @@ impl EventsLoop { pub fn interrupt(&self) { self.interrupted.store(true, std::sync::atomic::Ordering::Relaxed); - // TODO: We should also signal to "awaken" the cocoa event loop here. + + // Awaken the event loop by triggering `NSApplicationActivatedEventType`. + unsafe { + let pool = foundation::NSAutoreleasePool::new(cocoa::base::nil); + let event = + NSEvent::otherEventWithType_location_modifierFlags_timestamp_windowNumber_context_subtype_data1_data2_( + cocoa::base::nil, + appkit::NSApplicationDefined, + foundation::NSPoint::new(0.0, 0.0), + appkit::NSEventModifierFlags::empty(), + 0.0, + 0, + cocoa::base::nil, + appkit::NSEventSubtype::NSApplicationActivatedEventType, + 0, + 0); + appkit::NSApp().postEvent_atStart_(event, cocoa::base::NO); + foundation::NSAutoreleasePool::drain(pool); + } } // Here we store user's `callback` behind the `EventsLoop`'s mutex so that it may be safely