aboutsummaryrefslogtreecommitdiff
path: root/src/platform/gui/win/WindowManager.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-05-15 13:56:40 +0800
committercrupest <crupest@outlook.com>2022-05-15 13:56:40 +0800
commit9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752 (patch)
tree7342f6991771fa31b16fd6a5ed892ff6025f3d05 /src/platform/gui/win/WindowManager.cpp
parent41de54bad2c0f857821fcc83f41af3334d068b6d (diff)
downloadcru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.tar.gz
cru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.tar.bz2
cru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.zip
...
Diffstat (limited to 'src/platform/gui/win/WindowManager.cpp')
-rw-r--r--src/platform/gui/win/WindowManager.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/platform/gui/win/WindowManager.cpp b/src/platform/gui/win/WindowManager.cpp
new file mode 100644
index 00000000..ac172dda
--- /dev/null
+++ b/src/platform/gui/win/WindowManager.cpp
@@ -0,0 +1,57 @@
+#include "WindowManager.h"
+
+#include "cru/platform/gui/win/UiApplication.h"
+#include "cru/platform/gui/win/Window.h"
+#include "cru/platform/gui/win/WindowClass.h"
+
+namespace cru::platform::gui::win {
+LRESULT __stdcall GeneralWndProc(HWND hWnd, UINT Msg, WPARAM wParam,
+ LPARAM lParam) {
+ auto window =
+ WinUiApplication::GetInstance()->GetWindowManager()->FromHandle(hWnd);
+
+ LRESULT result;
+ if (window != nullptr &&
+ window->HandleNativeWindowMessage(hWnd, Msg, wParam, lParam, &result))
+ return result;
+
+ return DefWindowProc(hWnd, Msg, wParam, lParam);
+}
+
+WindowManager::WindowManager(WinUiApplication* application) {
+ application_ = application;
+ general_window_class_ = std::make_unique<WindowClass>(
+ L"CruUIWindowClass", GeneralWndProc, application->GetInstanceHandle());
+}
+
+WindowManager::~WindowManager() {
+ for (const auto& [key, window] : window_map_) delete window;
+}
+
+void WindowManager::RegisterWindow(HWND hwnd, WinNativeWindow* window) {
+ Expects(window_map_.count(hwnd) == 0); // The hwnd is already in the map.
+ window_map_.emplace(hwnd, window);
+}
+
+void WindowManager::UnregisterWindow(HWND hwnd) {
+ const auto find_result = window_map_.find(hwnd);
+ Expects(find_result != window_map_.end()); // The hwnd is not in the map.
+ window_map_.erase(find_result);
+ if (window_map_.empty() && application_->IsQuitOnAllWindowClosed())
+ application_->RequestQuit(0);
+}
+
+WinNativeWindow* WindowManager::FromHandle(HWND hwnd) {
+ const auto find_result = window_map_.find(hwnd);
+ if (find_result == window_map_.end())
+ return nullptr;
+ else
+ return find_result->second;
+}
+
+std::vector<WinNativeWindow*> WindowManager::GetAllWindows() const {
+ std::vector<WinNativeWindow*> windows;
+ for (const auto& [key, value] : window_map_) windows.push_back(value);
+ return windows;
+}
+} // namespace cru::platform::gui::win