diff options
author | crupest <crupest@outlook.com> | 2022-05-15 13:56:40 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-05-15 13:56:40 +0800 |
commit | 9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752 (patch) | |
tree | 7342f6991771fa31b16fd6a5ed892ff6025f3d05 /src/platform/gui/win/UiApplication.cpp | |
parent | 41de54bad2c0f857821fcc83f41af3334d068b6d (diff) | |
download | cru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.tar.gz cru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.tar.bz2 cru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.zip |
...
Diffstat (limited to 'src/platform/gui/win/UiApplication.cpp')
-rw-r--r-- | src/platform/gui/win/UiApplication.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/platform/gui/win/UiApplication.cpp b/src/platform/gui/win/UiApplication.cpp new file mode 100644 index 00000000..90eb20ca --- /dev/null +++ b/src/platform/gui/win/UiApplication.cpp @@ -0,0 +1,113 @@ +#include "cru/platform/gui/win/UiApplication.h" + +#include "TimerManager.h" +#include "WindowManager.h" +#include "cru/common/log/Logger.h" +#include "cru/platform/Check.h" +#include "cru/platform/graphics/direct2d/Factory.h" +#include "cru/platform/gui/win/Base.h" +#include "cru/platform/gui/win/Clipboard.h" +#include "cru/platform/gui/win/Cursor.h" +#include "cru/platform/gui/win/Exception.h" +#include "cru/platform/gui/win/GodWindow.h" +#include "cru/platform/gui/win/InputMethod.h" +#include "cru/platform/gui/win/Window.h" + +namespace cru::platform::gui { +std::unique_ptr<IUiApplication> CreateUiApplication() { + return std::make_unique<win::WinUiApplication>(); +} +} // namespace cru::platform::gui + +namespace cru::platform::gui::win { +WinUiApplication* WinUiApplication::instance = nullptr; + +WinUiApplication::WinUiApplication() { + instance = this; + + instance_handle_ = ::GetModuleHandleW(nullptr); + if (!instance_handle_) + throw Win32Error(u"Failed to get module(instance) handle."); + + ::SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE); + + graph_factory_ = std::make_unique< + cru::platform::graphics::direct2d::DirectGraphicsFactory>(); + + 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>(); + clipboard_ = std::make_unique<WinClipboard>(this); +} + +WinUiApplication::~WinUiApplication() { instance = nullptr; } + +int WinUiApplication::Run() { + MSG msg; + while (GetMessageW(&msg, nullptr, 0, 0)) { + TranslateMessage(&msg); + DispatchMessageW(&msg); + } + + for (const auto& handler : quit_handlers_) handler(); + + return static_cast<int>(msg.wParam); +} + +void WinUiApplication::RequestQuit(const int quit_code) { + ::PostQuitMessage(quit_code); +} + +void WinUiApplication::AddOnQuitHandler(std::function<void()> handler) { + quit_handlers_.push_back(std::move(handler)); +} + +long long WinUiApplication::SetImmediate(std::function<void()> action) { + return this->timer_manager_->SetTimer(TimerType::Immediate, 0, + std::move(action)); +} + +long long WinUiApplication::SetTimeout(std::chrono::milliseconds milliseconds, + std::function<void()> action) { + return this->timer_manager_->SetTimer(TimerType::Timeout, + gsl::narrow<int>(milliseconds.count()), + std::move(action)); +} + +long long WinUiApplication::SetInterval(std::chrono::milliseconds milliseconds, + std::function<void()> action) { + return this->timer_manager_->SetTimer(TimerType::Interval, + gsl::narrow<int>(milliseconds.count()), + std::move(action)); +} + +void WinUiApplication::CancelTimer(long long id) { + timer_manager_->CancelTimer(id); +} + +std::vector<INativeWindow*> WinUiApplication::GetAllWindow() { + const auto&& windows = window_manager_->GetAllWindows(); + std::vector<INativeWindow*> result; + for (const auto w : windows) { + result.push_back(static_cast<INativeWindow*>(w)); + } + return result; +} + +INativeWindow* WinUiApplication::CreateWindow() { + return new WinNativeWindow(this); +} + +cru::platform::graphics::IGraphicsFactory* +WinUiApplication::GetGraphicsFactory() { + return graph_factory_.get(); +} + +ICursorManager* WinUiApplication::GetCursorManager() { + return cursor_manager_.get(); +} + +IClipboard* WinUiApplication::GetClipboard() { return clipboard_.get(); } + +} // namespace cru::platform::gui::win |