aboutsummaryrefslogtreecommitdiff
path: root/src/win/native/ui_application.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/win/native/ui_application.cpp')
-rw-r--r--src/win/native/ui_application.cpp72
1 files changed, 27 insertions, 45 deletions
diff --git a/src/win/native/ui_application.cpp b/src/win/native/ui_application.cpp
index 0bbe9c03..f3a7f1dc 100644
--- a/src/win/native/ui_application.cpp
+++ b/src/win/native/ui_application.cpp
@@ -2,58 +2,39 @@
#include "../debug_logger.hpp"
#include "cru/common/logger.hpp"
-#include "cru/win/graph/direct/graph_factory.hpp"
+#include "cru/platform/check.hpp"
+#include "cru/win/graph/direct/factory.hpp"
+#include "cru/win/native/cursor.hpp"
#include "cru/win/native/exception.hpp"
#include "cru/win/native/god_window.hpp"
-#include "cru/win/native/native_window.hpp"
+#include "cru/win/native/window.hpp"
#include "god_window_message.hpp"
#include "timer.hpp"
#include "window_manager.hpp"
-#include <VersionHelpers.h>
#include <cassert>
namespace cru::platform::native::win {
-namespace {
-WinUiApplication* instance = nullptr;
-}
-} // namespace cru::platform::native::win
-
-namespace cru::platform::native {
-UiApplication* UiApplication::CreateInstance() {
- auto& i =
- ::cru::platform::native::win::instance; // avoid long namespace prefix
- assert(i == nullptr);
- i = new win::WinUiApplication(::GetModuleHandleW(nullptr));
- return i;
-}
+WinUiApplication* WinUiApplication::instance = nullptr;
-UiApplication* UiApplication::GetInstance() {
- return ::cru::platform::native::win::instance;
-}
-} // namespace cru::platform::native
-
-namespace cru::platform::native::win {
-WinUiApplication* WinUiApplication::GetInstance() { return instance; }
+WinUiApplication::WinUiApplication() {
+ if (instance) {
+ throw new std::runtime_error(
+ "Already created an instance of WinUiApplication");
+ }
-WinUiApplication::WinUiApplication(HINSTANCE h_instance)
- : h_instance_(h_instance) {
- assert(instance == nullptr);
+ instance = this;
log::Logger::GetInstance()->AddSource(
- new ::cru::platform::win::WinDebugLoggerSource());
-
- if (!::IsWindows8OrGreater())
- throw std::runtime_error("Must run on Windows 8 or later.");
-
- const auto graph_factory = graph::GraphFactory::CreateInstance();
- graph_factory->SetAutoDelete(true);
+ std::make_unique<::cru::platform::win::WinDebugLoggerSource>());
- god_window_ = std::make_shared<GodWindow>(this);
- timer_manager_ = std::make_shared<TimerManager>(god_window_.get());
- window_manager_ = std::make_shared<WindowManager>(this);
+ graph_factory_ =
+ std::make_unique<cru::platform::graph::win::direct::DirectGraphFactory>();
- cursor_manager_.reset(new WinCursorManager());
+ god_window_ = std::make_unique<GodWindow>(this);
+ timer_manager_ = std::make_unique<TimerManager>(god_window_.get());
+ window_manager_ = std::make_unique<WindowManager>(this);
+ cursor_manager_ = std::make_unique<WinCursorManager>();
}
WinUiApplication::~WinUiApplication() { instance = nullptr; }
@@ -67,12 +48,10 @@ int WinUiApplication::Run() {
for (const auto& handler : quit_handlers_) handler();
- if (auto_delete_) delete this;
-
return static_cast<int>(msg.wParam);
}
-void WinUiApplication::Quit(const int quit_code) {
+void WinUiApplication::RequestQuit(const int quit_code) {
::PostQuitMessage(quit_code);
}
@@ -84,8 +63,8 @@ void WinUiApplication::InvokeLater(const std::function<void()>& action) {
// copy the action to a safe place
auto p_action_copy = new std::function<void()>(action);
- if (PostMessageW(GetGodWindow()->GetHandle(), invoke_later_message_id,
- reinterpret_cast<WPARAM>(p_action_copy), 0) == 0)
+ if (::PostMessageW(GetGodWindow()->GetHandle(), invoke_later_message_id,
+ reinterpret_cast<WPARAM>(p_action_copy), 0) == 0)
throw Win32Error(::GetLastError(), "InvokeLater failed to post message.");
}
@@ -119,14 +98,17 @@ std::vector<INativeWindow*> WinUiApplication::GetAllWindow() {
INativeWindow* WinUiApplication::CreateWindow(INativeWindow* parent) {
WinNativeWindow* p = nullptr;
if (parent != nullptr) {
- p = dynamic_cast<WinNativeWindow*>(parent);
- assert(p);
+ p = CheckPlatform<WinNativeWindow>(parent, GetPlatformId());
}
return new WinNativeWindow(this, window_manager_->GetGeneralWindowClass(),
WS_OVERLAPPEDWINDOW, p);
}
-WinCursorManager* WinUiApplication::GetCursorManager() {
+cru::platform::graph::IGraphFactory* WinUiApplication::GetGraphFactory() {
+ return graph_factory_.get();
+}
+
+ICursorManager* WinUiApplication::GetCursorManager() {
return cursor_manager_.get();
}
} // namespace cru::platform::native::win