mirror of
https://github.com/rust-windowing/winit.git
synced 2026-06-28 07:33:14 -04:00
This fixes the run_return loop never returning on macos when using multiple windows
This commit is contained in:
@@ -127,7 +127,6 @@ impl<T> EventHandler for EventLoopHandler<T> {
|
||||
struct Handler {
|
||||
ready: AtomicBool,
|
||||
in_callback: AtomicBool,
|
||||
dialog_is_closing: AtomicBool,
|
||||
control_flow: Mutex<ControlFlow>,
|
||||
control_flow_prev: Mutex<ControlFlow>,
|
||||
start_time: Mutex<Option<Instant>>,
|
||||
@@ -262,8 +261,6 @@ impl Handler {
|
||||
}
|
||||
}
|
||||
|
||||
pub static INTERRUPT_EVENT_LOOP_EXIT: AtomicBool = AtomicBool::new(false);
|
||||
|
||||
pub enum AppState {}
|
||||
|
||||
impl AppState {
|
||||
@@ -403,40 +400,12 @@ impl AppState {
|
||||
if HANDLER.should_exit() {
|
||||
unsafe {
|
||||
let app: id = NSApp();
|
||||
let windows: id = msg_send![app, windows];
|
||||
let window_count: usize = msg_send![windows, count];
|
||||
|
||||
let dialog_open = if window_count > 1 {
|
||||
let dialog: id = msg_send![windows, lastObject];
|
||||
let is_main_window: BOOL = msg_send![dialog, isMainWindow];
|
||||
let is_visible: BOOL = msg_send![dialog, isVisible];
|
||||
is_visible != NO && is_main_window == NO
|
||||
} else {
|
||||
false
|
||||
};
|
||||
|
||||
let dialog_is_closing = HANDLER.dialog_is_closing.load(Ordering::SeqCst);
|
||||
autoreleasepool(|| {
|
||||
if !INTERRUPT_EVENT_LOOP_EXIT.load(Ordering::SeqCst)
|
||||
&& !dialog_open
|
||||
&& !dialog_is_closing
|
||||
{
|
||||
let () = msg_send![app, stop: nil];
|
||||
// To stop event loop immediately, we need to post some event here.
|
||||
post_dummy_event(app);
|
||||
}
|
||||
let () = msg_send![app, stop: nil];
|
||||
// To stop event loop immediately, we need to post some event here.
|
||||
post_dummy_event(app);
|
||||
});
|
||||
|
||||
if window_count > 0 {
|
||||
let window: id = msg_send![windows, firstObject];
|
||||
let window_has_focus: BOOL = msg_send![window, isKeyWindow];
|
||||
if !dialog_open && window_has_focus != NO && dialog_is_closing {
|
||||
HANDLER.dialog_is_closing.store(false, Ordering::SeqCst);
|
||||
}
|
||||
if dialog_open {
|
||||
HANDLER.dialog_is_closing.store(true, Ordering::SeqCst);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
HANDLER.update_start_time();
|
||||
|
||||
Reference in New Issue
Block a user