aboutsummaryrefslogtreecommitdiff
path: root/src/win/native/win_application.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2019-04-19 23:20:09 +0800
committercrupest <crupest@outlook.com>2019-04-19 23:20:09 +0800
commitea87825d58ab5b58dd360c3f080518c07a865db0 (patch)
tree4b497ef3687d682368e0fde4b86293565583a63a /src/win/native/win_application.cpp
parent7351020a582d70a1495249fba87d342c8a1fb634 (diff)
downloadcru-ea87825d58ab5b58dd360c3f080518c07a865db0.tar.gz
cru-ea87825d58ab5b58dd360c3f080518c07a865db0.tar.bz2
cru-ea87825d58ab5b58dd360c3f080518c07a865db0.zip
...
Diffstat (limited to 'src/win/native/win_application.cpp')
-rw-r--r--src/win/native/win_application.cpp33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/win/native/win_application.cpp b/src/win/native/win_application.cpp
index 72e12fa0..6c39453f 100644
--- a/src/win/native/win_application.cpp
+++ b/src/win/native/win_application.cpp
@@ -1,6 +1,7 @@
#include "cru/win/native/win_application.hpp"
#include "cru/win/exception.hpp"
+#include "cru/win/graph/graph_manager.hpp"
#include "cru/win/native/god_window.hpp"
#include "cru/win/native/win_native_window.hpp"
#include "god_window_message.hpp"
@@ -17,19 +18,22 @@ UiApplication* UiApplication::GetInstance() {
} // namespace cru::platform::native
namespace cru::win::native {
-WinApplication* WinApplication::instance_ = nullptr;
+WinApplication* WinApplication::instance = nullptr;
+
+namespace {
+bool application_constructing = false;
+}
WinApplication* WinApplication::GetInstance() {
- if (instance_ == nullptr)
- instance_ = new WinApplication(::GetModuleHandleW(nullptr));
- return instance_;
+ if (instance == nullptr && !application_constructing) {
+ application_constructing = true;
+ instance = new WinApplication(::GetModuleHandleW(nullptr));
+ }
+ return instance;
}
WinApplication::WinApplication(HINSTANCE h_instance) : h_instance_(h_instance) {
- if (instance_)
- throw std::runtime_error("A application instance already exists.");
-
- instance_ = this;
+ assert(instance == nullptr);
if (!::IsWindows8OrGreater())
throw std::runtime_error("Must run on Windows 8 or later.");
@@ -39,7 +43,8 @@ WinApplication::WinApplication(HINSTANCE h_instance) : h_instance_(h_instance) {
window_manager_ = std::make_shared<WindowManager>(this);
}
-WinApplication::~WinApplication() { instance_ = nullptr; }
+WinApplication::~WinApplication() {
+ instance = nullptr; }
int WinApplication::Run() {
MSG msg;
@@ -47,11 +52,21 @@ int WinApplication::Run() {
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
+
+ for (const auto& handler : quit_handlers_) handler();
+
+ delete graph::GraphManager::GetInstance();
+ delete this;
+
return static_cast<int>(msg.wParam);
}
void WinApplication::Quit(const int quit_code) { ::PostQuitMessage(quit_code); }
+void WinApplication::AddOnQuitHandler(const std::function<void()>& handler) {
+ quit_handlers_.push_back(handler);
+}
+
void WinApplication::InvokeLater(const std::function<void()>& action) {
// copy the action to a safe place
auto p_action_copy = new std::function<void()>(action);