From 01203b247b804628abf5b215a24f20c2778c4d3a Mon Sep 17 00:00:00 2001 From: hatoo Date: Thu, 19 Dec 2019 18:10:47 +0900 Subject: [PATCH] Fix run_return in MacOS (#1321) * Fix run_return in MacOS * MacOS: Fix the way of getting a window in run_return * Fix CHANGELOG.md --- CHANGELOG.md | 1 + src/platform_impl/macos/app_state.rs | 24 +++++++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7e89bde..f1ef822f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # Unreleased +- On macOS, fix application not to terminate on `run_return`. - On Wayland, fix cursor icon updates on window borders when using CSD. # # 0.20.0 Alpha 5 (2019-12-09) diff --git a/src/platform_impl/macos/app_state.rs b/src/platform_impl/macos/app_state.rs index bc585a52..7e116567 100644 --- a/src/platform_impl/macos/app_state.rs +++ b/src/platform_impl/macos/app_state.rs @@ -11,7 +11,7 @@ use std::{ time::Instant, }; -use cocoa::{appkit::NSApp, base::nil}; +use cocoa::{appkit::NSApp, base::nil, foundation::NSString}; use crate::{ event::{Event, StartCause, WindowEvent}, @@ -19,6 +19,7 @@ use crate::{ platform_impl::platform::{observer::EventLoopWaker, util::Never}, window::WindowId, }; +use objc::runtime::Object; lazy_static! { static ref HANDLER: Handler = Default::default(); @@ -275,8 +276,25 @@ impl AppState { HANDLER.set_in_callback(false); } if HANDLER.should_exit() { - let _: () = unsafe { msg_send![NSApp(), terminate: nil] }; - return; + unsafe { + let _: () = msg_send![NSApp(), stop: nil]; + + let windows: *const Object = msg_send![NSApp(), windows]; + let window: *const Object = msg_send![windows, objectAtIndex:0]; + assert_ne!(window, nil); + + let title: *const Object = msg_send![window, title]; + assert_ne!(title, nil); + let postfix = NSString::alloc(nil).init_str("*"); + let some_unique_title: *const Object = + msg_send![title, stringByAppendingString: postfix]; + assert_ne!(some_unique_title, nil); + + // To stop event loop immediately, we need to send some UI event here. + let _: () = msg_send![window, setTitle: some_unique_title]; + // And restore it. + let _: () = msg_send![window, setTitle: title]; + }; } HANDLER.update_start_time(); match HANDLER.get_old_and_new_control_flow() {