#include "cru/win/gui/UiApplication.hpp" #include "TimerManager.hpp" #include "WindowManager.hpp" #include "cru/common/Logger.hpp" #include "cru/platform/Check.hpp" #include "cru/win/DebugLogger.hpp" #include "cru/win/StdOutLogger.hpp" #include "cru/win/graphics/direct/Factory.hpp" #include "cru/win/gui/Base.hpp" #include "cru/win/gui/Clipboard.hpp" #include "cru/win/gui/Cursor.hpp" #include "cru/win/gui/Exception.hpp" #include "cru/win/gui/GodWindow.hpp" #include "cru/win/gui/InputMethod.hpp" #include "cru/win/gui/Window.hpp" namespace cru::platform::gui { std::unique_ptr CreateUiApplication() { return std::make_unique(); } } // 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); log::Logger::GetInstance()->AddSource( std::make_unique<::cru::platform::win::WinDebugLoggerSource>()); log::Logger::GetInstance()->AddSource( std::make_unique<::cru::platform::win::WinStdOutLoggerSource>()); graph_factory_ = std::make_unique< cru::platform::graphics::win::direct::DirectGraphicsFactory>(); god_window_ = std::make_unique(this); timer_manager_ = std::make_unique(god_window_.get()); window_manager_ = std::make_unique(this); cursor_manager_ = std::make_unique(); clipboard_ = std::make_unique(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(msg.wParam); } void WinUiApplication::RequestQuit(const int quit_code) { ::PostQuitMessage(quit_code); } void WinUiApplication::AddOnQuitHandler(std::function handler) { quit_handlers_.push_back(std::move(handler)); } long long WinUiApplication::SetImmediate(std::function action) { return this->timer_manager_->SetTimer(TimerType::Immediate, 0, std::move(action)); } long long WinUiApplication::SetTimeout(std::chrono::milliseconds milliseconds, std::function action) { return this->timer_manager_->SetTimer(TimerType::Timeout, gsl::narrow(milliseconds.count()), std::move(action)); } long long WinUiApplication::SetInterval(std::chrono::milliseconds milliseconds, std::function action) { return this->timer_manager_->SetTimer(TimerType::Interval, gsl::narrow(milliseconds.count()), std::move(action)); } void WinUiApplication::CancelTimer(long long id) { timer_manager_->CancelTimer(id); } std::vector WinUiApplication::GetAllWindow() { const auto&& windows = window_manager_->GetAllWindows(); std::vector result; for (const auto w : windows) { result.push_back(static_cast(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