aboutsummaryrefslogtreecommitdiff
path: root/include/cru/win/native/window.hpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-01-03 00:31:34 +0800
committercrupest <crupest@outlook.com>2020-01-03 00:31:34 +0800
commitd5ff69096a3f56052b30d8ef827845473d4aa5ea (patch)
tree8faf7466ea173b66e81da83bdc4e0be1a159e263 /include/cru/win/native/window.hpp
parent26c3b5c7a509d0123719f2a6537399c332a48011 (diff)
downloadcru-d5ff69096a3f56052b30d8ef827845473d4aa5ea.tar.gz
cru-d5ff69096a3f56052b30d8ef827845473d4aa5ea.tar.bz2
cru-d5ff69096a3f56052b30d8ef827845473d4aa5ea.zip
...
Diffstat (limited to 'include/cru/win/native/window.hpp')
-rw-r--r--include/cru/win/native/window.hpp42
1 files changed, 36 insertions, 6 deletions
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<INativeWindowResolver> GetResolver() override {
+ return std::static_pointer_cast<INativeWindowResolver>(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<WinNativeWindowResolver> resolver_;
HWND hwnd_;
WinNativeWindow* parent_window_;
@@ -143,4 +151,26 @@ class WinNativeWindow : public WinNativeResource, public virtual INativeWindow {
Event<WindowNativeMessageEventArgs&> 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