aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/win/UiApplication.cpp
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-16 14:49:46 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-16 14:49:46 +0800
commitc350346c41cb779413389f26c5c8f4e9bd2a8141 (patch)
tree2bc976b3d6724f9665cab64a4d5f355d67b03e6f /src/platform/gui/win/UiApplication.cpp
parent9feb6a1611a86b90a02b5bfe2b1d4c8189650491 (diff)
downloadcru-c350346c41cb779413389f26c5c8f4e9bd2a8141.tar.gz
cru-c350346c41cb779413389f26c5c8f4e9bd2a8141.tar.bz2
cru-c350346c41cb779413389f26c5c8f4e9bd2a8141.zip
Cleanup Win codes.
Diffstat (limited to 'src/platform/gui/win/UiApplication.cpp')
-rw-r--r--src/platform/gui/win/UiApplication.cpp51
1 files changed, 42 insertions, 9 deletions
diff --git a/src/platform/gui/win/UiApplication.cpp b/src/platform/gui/win/UiApplication.cpp
index 12a74bc6..eb85ef90 100644
--- a/src/platform/gui/win/UiApplication.cpp
+++ b/src/platform/gui/win/UiApplication.cpp
@@ -1,21 +1,29 @@
#include "cru/platform/gui/win/UiApplication.h"
-#include "WindowManager.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/Window.h"
+#include <algorithm>
#include <chrono>
-namespace cru::platform::gui {
-std::unique_ptr<IUiApplication> CreateUiApplication() {
- return std::make_unique<win::WinUiApplication>();
+namespace cru::platform::gui::win {
+namespace {
+LRESULT __stdcall GeneralWndProc(HWND hWnd, UINT Msg, WPARAM wParam,
+ LPARAM lParam) {
+ auto window = WinUiApplication::GetInstance()->FromHWND(hWnd);
+
+ LRESULT result;
+ if (window != nullptr &&
+ window->HandleNativeWindowMessage(hWnd, Msg, wParam, lParam, &result))
+ return result;
+
+ return DefWindowProc(hWnd, Msg, wParam, lParam);
}
-} // namespace cru::platform::gui
+} // namespace
-namespace cru::platform::gui::win {
WinUiApplication* WinUiApplication::instance = nullptr;
WinUiApplication::WinUiApplication() {
@@ -27,10 +35,12 @@ WinUiApplication::WinUiApplication() {
::SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE);
+ general_window_class_ = std::make_unique<WindowClass>(
+ L"CruUIWindowClass", GeneralWndProc, instance_handle_);
+
graph_factory_ = std::make_unique<
cru::platform::graphics::direct2d::DirectGraphicsFactory>();
- window_manager_ = std::make_unique<WindowManager>(this);
cursor_manager_ = std::make_unique<WinCursorManager>();
clipboard_ = std::make_unique<WinClipboard>(this);
}
@@ -94,9 +104,8 @@ long long WinUiApplication::SetInterval(std::chrono::milliseconds milliseconds,
void WinUiApplication::CancelTimer(long long id) { timers_.Remove(id); }
std::vector<INativeWindow*> WinUiApplication::GetAllWindow() {
- const auto&& windows = window_manager_->GetAllWindows();
std::vector<INativeWindow*> result;
- for (const auto w : windows) {
+ for (const auto w : windows_) {
result.push_back(static_cast<INativeWindow*>(w));
}
return result;
@@ -117,4 +126,28 @@ ICursorManager* WinUiApplication::GetCursorManager() {
IClipboard* WinUiApplication::GetClipboard() { return clipboard_.get(); }
+std::vector<WinNativeWindow*> WinUiApplication::GetAllWinWindow() {
+ return windows_;
+}
+
+WinNativeWindow* WinUiApplication::FromHWND(HWND hwnd) {
+ for (auto window : windows_) {
+ if (window->GetWindowHandle() == hwnd) {
+ return window;
+ }
+ }
+ return nullptr;
+}
+
+WindowClass* WinUiApplication::GetGeneralWindowClass() {
+ return general_window_class_.get();
+}
+
+void WinUiApplication::RegisterWindow(WinNativeWindow* window) {
+ windows_.push_back(window);
+}
+
+void WinUiApplication::UnregisterWindow(WinNativeWindow* window) {
+ windows_.erase(std::ranges::find(windows_, window));
+}
} // namespace cru::platform::gui::win