diff options
author | crupest <crupest@outlook.com> | 2021-12-06 16:36:05 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-12-06 16:36:05 +0800 |
commit | 6230b3e2873f2114eead9f3f21ff817cd83058d2 (patch) | |
tree | 1d9eb9c2dd75f2f982ec70ab83b2aba51253271b | |
parent | 6117141e1ff1e464854949c8a792961dbad8ea73 (diff) | |
download | cru-6230b3e2873f2114eead9f3f21ff817cd83058d2.tar.gz cru-6230b3e2873f2114eead9f3f21ff817cd83058d2.tar.bz2 cru-6230b3e2873f2114eead9f3f21ff817cd83058d2.zip |
...
-rw-r--r-- | include/cru/osx/gui/UiApplication.hpp | 2 | ||||
-rw-r--r-- | include/cru/platform/gui/UiApplication.hpp | 3 | ||||
-rw-r--r-- | src/osx/gui/UiApplication.mm | 7 | ||||
-rw-r--r-- | src/osx/gui/Window.mm | 21 |
4 files changed, 32 insertions, 1 deletions
diff --git a/include/cru/osx/gui/UiApplication.hpp b/include/cru/osx/gui/UiApplication.hpp index e4036854..09547b38 100644 --- a/include/cru/osx/gui/UiApplication.hpp +++ b/include/cru/osx/gui/UiApplication.hpp @@ -29,6 +29,8 @@ class OsxUiApplication : public OsxGuiResource, public virtual IUiApplication { void RequestQuit(int quit_code) override; void AddOnQuitHandler(std::function<void()> handler) override; + bool IsQuitOnAllWindowClosed() override; + void SetQuitOnAllWindowClosed(bool quit_on_all_window_closed) override; long long SetImmediate(std::function<void()> action) override; long long SetTimeout(std::chrono::milliseconds milliseconds, diff --git a/include/cru/platform/gui/UiApplication.hpp b/include/cru/platform/gui/UiApplication.hpp index 8bad9668..f450ba7d 100644 --- a/include/cru/platform/gui/UiApplication.hpp +++ b/include/cru/platform/gui/UiApplication.hpp @@ -32,6 +32,9 @@ struct CRU_PLATFORM_GUI_API IUiApplication : public virtual IPlatformResource { virtual void AddOnQuitHandler(std::function<void()> handler) = 0; + virtual bool IsQuitOnAllWindowClosed() = 0; + virtual void SetQuitOnAllWindowClosed(bool quit_on_all_window_closed) = 0; + // Timer id should always be positive (not 0) and never the same. So it's ok // to use negative value (or 0) to represent no timer. virtual long long SetImmediate(std::function<void()> action) = 0; 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(); } |