diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/osx/gui/UiApplication.mm | 7 | ||||
-rw-r--r-- | src/osx/gui/Window.mm | 21 |
2 files changed, 27 insertions, 1 deletions
diff --git a/src/osx/gui/UiApplication.mm b/src/osx/gui/UiApplication.mm index a3c9acd5..7ec2a049 100644 --- a/src/osx/gui/UiApplication.mm +++ b/src/osx/gui/UiApplication.mm @@ -49,6 +49,7 @@ class OsxUiApplicationPrivate { OsxUiApplication* osx_ui_application_; CruAppDelegate* app_delegate_; std::vector<std::function<void()>> quit_handlers_; + bool quit_on_all_window_closed_ = true; long long current_timer_id_ = 1; std::unordered_map<long long, std::function<void()>> next_tick_; @@ -99,6 +100,12 @@ void OsxUiApplication::AddOnQuitHandler(std::function<void()> handler) { p_->quit_handlers_.push_back(std::move(handler)); } +bool OsxUiApplication::IsQuitOnAllWindowClosed() { return p_->quit_on_all_window_closed_; } + +void OsxUiApplication::SetQuitOnAllWindowClosed(bool quit_on_all_window_closed) { + p_->quit_on_all_window_closed_ = quit_on_all_window_closed; +} + long long OsxUiApplication::SetImmediate(std::function<void()> action) { const long long id = p_->current_timer_id_++; p_->next_tick_.emplace(id, std::move(action)); diff --git a/src/osx/gui/Window.mm b/src/osx/gui/Window.mm index 1a42f340..a0542147 100644 --- a/src/osx/gui/Window.mm +++ b/src/osx/gui/Window.mm @@ -53,9 +53,28 @@ OsxWindowPrivate::OsxWindowPrivate(OsxWindow* osx_window) : osx_window_(osx_wind OsxWindowPrivate::~OsxWindowPrivate() {} void OsxWindowPrivate::OnWindowWillClose() { - destroy_event_.Raise(nullptr); + if (window_) destroy_event_.Raise(nullptr); window_ = nil; CGLayerRelease(draw_layer_); + draw_layer_ = nullptr; + + if (osx_window_->GetUiApplication()->IsQuitOnAllWindowClosed()) { + const auto& all_window = osx_window_->GetUiApplication()->GetAllWindow(); + + bool quit = true; + + for (auto window : all_window) { + auto w = CheckPlatform<OsxWindow>(window, osx_window_->GetPlatformId()); + if (w->p_->window_) { + quit = false; + break; + } + } + + if (quit) { + osx_window_->GetUiApplication()->RequestQuit(0); + } + } } void OsxWindowPrivate::OnWindowDidExpose() { osx_window_->RequestRepaint(); } |