aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2019-05-26 23:38:34 +0800
committercrupest <crupest@outlook.com>2019-05-26 23:38:34 +0800
commit9e2d63adb90c293f4bc2893b0de7655aea2ecc85 (patch)
tree102bb993bf0dbca6c0673195a327f01c59287172 /src
parenta191a44e0ec7fd353cb9a60e2e7a18f45f6df04a (diff)
downloadcru-9e2d63adb90c293f4bc2893b0de7655aea2ecc85.tar.gz
cru-9e2d63adb90c293f4bc2893b0de7655aea2ecc85.tar.bz2
cru-9e2d63adb90c293f4bc2893b0de7655aea2ecc85.zip
...
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp4
-rw-r--r--src/ui/ui_manager.cpp2
-rw-r--r--src/ui/window.cpp2
-rw-r--r--src/win/native/win_application.cpp47
4 files changed, 28 insertions, 27 deletions
diff --git a/src/main.cpp b/src/main.cpp
index ecaebda5..ee381430 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -5,7 +5,7 @@
#include "cru/ui/controls/text_block.hpp"
#include "cru/ui/window.hpp"
-using cru::platform::native::UiApplication;
+using cru::platform::native::IUiApplication;
using cru::ui::Rect;
using cru::ui::Thickness;
using cru::ui::Window;
@@ -21,7 +21,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
*/
int main() {
- auto application = UiApplication::GetInstance();
+ std::unique_ptr<IUiApplication> application(IUiApplication::CreateInstance());
const auto window = Window::CreateOverlapped();
diff --git a/src/ui/ui_manager.cpp b/src/ui/ui_manager.cpp
index 82b859c8..cc741ec5 100644
--- a/src/ui/ui_manager.cpp
+++ b/src/ui/ui_manager.cpp
@@ -20,7 +20,7 @@ PredefineResources::PredefineResources() {
UiManager* UiManager::GetInstance() {
static UiManager* instance = new UiManager();
- platform::native::UiApplication::GetInstance()->AddOnQuitHandler([] {
+ platform::native::IUiApplication::GetInstance()->AddOnQuitHandler([] {
delete instance;
instance = nullptr;
});
diff --git a/src/ui/window.cpp b/src/ui/window.cpp
index 1c035081..48f046f1 100644
--- a/src/ui/window.cpp
+++ b/src/ui/window.cpp
@@ -102,7 +102,7 @@ Window::Window(tag_overlapped_constructor) {
using namespace std::placeholders;
native_window_ =
- platform::native::UiApplication::GetInstance()->CreateWindow(nullptr);
+ platform::native::IUiApplication::GetInstance()->CreateWindow(nullptr);
render_object_.reset(new render::WindowRenderObject(this));
event_revoker_guards_.push_back(
diff --git a/src/win/native/win_application.cpp b/src/win/native/win_application.cpp
index 00a16ff1..586af331 100644
--- a/src/win/native/win_application.cpp
+++ b/src/win/native/win_application.cpp
@@ -11,26 +11,27 @@
#include <VersionHelpers.h>
#include <cassert>
-namespace cru::platform::native {
-UiApplication* UiApplication::GetInstance() {
- return win::native::WinApplication::GetInstance();
-}
-} // namespace cru::platform::native
-
namespace cru::win::native {
-WinApplication* WinApplication::instance = nullptr;
-
namespace {
-bool application_constructing = false;
+WinApplication* instance = nullptr;
}
+} // namespace cru::win::native
-WinApplication* WinApplication::GetInstance() {
- if (instance == nullptr && !application_constructing) {
- application_constructing = true;
- instance = new WinApplication(::GetModuleHandleW(nullptr));
- }
- return instance;
+namespace cru::platform::native {
+IUiApplication* IUiApplication::CreateInstance() {
+ auto& i = ::cru::win::native::instance; // avoid long namespace prefix
+ assert(i == nullptr);
+ i = new win::native::WinApplication(::GetModuleHandleW(nullptr));
+ return i;
+}
+
+IUiApplication* IUiApplication::GetInstance() {
+ return ::cru::win::native::instance;
}
+} // namespace cru::platform::native
+
+namespace cru::win::native {
+WinApplication* WinApplication::GetInstance() { return instance; }
WinApplication::WinApplication(HINSTANCE h_instance) : h_instance_(h_instance) {
assert(instance == nullptr);
@@ -38,7 +39,8 @@ WinApplication::WinApplication(HINSTANCE h_instance) : h_instance_(h_instance) {
if (!::IsWindows8OrGreater())
throw std::runtime_error("Must run on Windows 8 or later.");
- graph::WinGraphFactory::CreateInstance();
+ const auto graph_factory = platform::graph::IGraphFactory::CreateInstance();
+ graph_factory->SetAutoDelete(true);
god_window_ = std::make_shared<GodWindow>(this);
timer_manager_ = std::make_shared<TimerManager>(god_window_.get());
@@ -56,8 +58,7 @@ int WinApplication::Run() {
for (const auto& handler : quit_handlers_) handler();
- delete graph::WinGraphFactory::GetInstance();
- delete this;
+ if (auto_delete_) delete this;
return static_cast<int>(msg.wParam);
}
@@ -94,17 +95,17 @@ void WinApplication::CancelTimer(unsigned long id) {
timer_manager_->KillTimer(static_cast<UINT_PTR>(id));
}
-std::vector<platform::native::NativeWindow*> WinApplication::GetAllWindow() {
+std::vector<platform::native::INativeWindow*> WinApplication::GetAllWindow() {
const auto&& windows = window_manager_->GetAllWindows();
- std::vector<platform::native::NativeWindow*> result;
+ std::vector<platform::native::INativeWindow*> result;
for (const auto w : windows) {
- result.push_back(static_cast<platform::native::NativeWindow*>(w));
+ result.push_back(static_cast<platform::native::INativeWindow*>(w));
}
return result;
}
-platform::native::NativeWindow* WinApplication::CreateWindow(
- platform::native::NativeWindow* parent) {
+platform::native::INativeWindow* WinApplication::CreateWindow(
+ platform::native::INativeWindow* parent) {
WinNativeWindow* p = nullptr;
if (parent != nullptr) {
p = dynamic_cast<WinNativeWindow*>(parent);