aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-12-06 16:36:05 +0800
committercrupest <crupest@outlook.com>2021-12-06 16:36:05 +0800
commit6230b3e2873f2114eead9f3f21ff817cd83058d2 (patch)
tree1d9eb9c2dd75f2f982ec70ab83b2aba51253271b
parent6117141e1ff1e464854949c8a792961dbad8ea73 (diff)
downloadcru-6230b3e2873f2114eead9f3f21ff817cd83058d2.tar.gz
cru-6230b3e2873f2114eead9f3f21ff817cd83058d2.tar.bz2
cru-6230b3e2873f2114eead9f3f21ff817cd83058d2.zip
...
-rw-r--r--include/cru/osx/gui/UiApplication.hpp2
-rw-r--r--include/cru/platform/gui/UiApplication.hpp3
-rw-r--r--src/osx/gui/UiApplication.mm7
-rw-r--r--src/osx/gui/Window.mm21
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(); }