From d5ff69096a3f56052b30d8ef827845473d4aa5ea Mon Sep 17 00:00:00 2001 From: crupest Date: Fri, 3 Jan 2020 00:31:34 +0800 Subject: ... --- include/cru/win/native/ui_application.hpp | 2 +- include/cru/win/native/window.hpp | 42 ++++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 7 deletions(-) (limited to 'include/cru/win') diff --git a/include/cru/win/native/ui_application.hpp b/include/cru/win/native/ui_application.hpp index 80e358e4..73f67abe 100644 --- a/include/cru/win/native/ui_application.hpp +++ b/include/cru/win/native/ui_application.hpp @@ -45,7 +45,7 @@ class WinUiApplication : public WinNativeResource, void CancelTimer(unsigned long id) override; std::vector GetAllWindow() override; - INativeWindow* CreateWindow(INativeWindow* parent) override; + std::shared_ptr CreateWindow(INativeWindow* parent) override; cru::platform::graph::IGraphFactory* GetGraphFactory() override; diff --git a/include/cru/win/native/window.hpp b/include/cru/win/native/window.hpp index 9752682f..3c883338 100644 --- a/include/cru/win/native/window.hpp +++ b/include/cru/win/native/window.hpp @@ -12,12 +12,12 @@ class WinCursor; class WindowClass; class WindowManager; class WindowRenderTarget; +class WinNativeWindowResolver; class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { public: - WinNativeWindow(WinUiApplication* application, - WindowClass* window_class, DWORD window_style, - WinNativeWindow* parent); + WinNativeWindow(WinUiApplication* application, WindowClass* window_class, + DWORD window_style, WinNativeWindow* parent); CRU_DELETE_COPY(WinNativeWindow) CRU_DELETE_MOVE(WinNativeWindow) @@ -25,8 +25,9 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { ~WinNativeWindow() override; public: - bool IsValid() override; - void SetDeleteThisOnDestroy(bool value) override; + std::shared_ptr GetResolver() override { + return std::static_pointer_cast(resolver_); + } void Close() override; @@ -118,7 +119,14 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { private: WinUiApplication* application_; - bool delete_this_on_destroy_ = true; + // when delete is called first, it set this to true to indicate + // destroy message handler not to double delete this instance; + // when destroy handler is called first (by user action or method + // Close), it set this to true to indicate delete not call Close + // again. + bool sync_flag_ = false; + + std::shared_ptr resolver_; HWND hwnd_; WinNativeWindow* parent_window_; @@ -143,4 +151,26 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow { Event native_message_event_; }; + +class WinNativeWindowResolver : public WinNativeResource, + public virtual INativeWindowResolver { + friend WinNativeWindow::~WinNativeWindow(); + + public: + WinNativeWindowResolver(WinNativeWindow* window) : window_(window) {} + + CRU_DELETE_COPY(WinNativeWindowResolver) + CRU_DELETE_MOVE(WinNativeWindowResolver) + + ~WinNativeWindowResolver() override = default; + + public: + INativeWindow* Resolve() override { return window_; } + + private: + void Reset(); + + private: + WinNativeWindow* window_; +}; } // namespace cru::platform::native::win -- cgit v1.2.3