From 21fe20561208e2af1c7e6f6d8b94d05c2380e4bf Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 30 Apr 2025 19:55:51 +0500 Subject: [PATCH] Replace raw pointer with ComObjectWeakPtr (#18757) --- native/Avalonia.Native/src/OSX/AvnView.mm | 2 +- native/Avalonia.Native/src/OSX/PopupImpl.mm | 3 ++- native/Avalonia.Native/src/OSX/WindowBaseImpl.h | 2 +- native/Avalonia.Native/src/OSX/WindowBaseImpl.mm | 9 ++++++--- native/Avalonia.Native/src/OSX/WindowImpl.mm | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/AvnView.mm b/native/Avalonia.Native/src/OSX/AvnView.mm index 40122bfcca..e533bb4040 100644 --- a/native/Avalonia.Native/src/OSX/AvnView.mm +++ b/native/Avalonia.Native/src/OSX/AvnView.mm @@ -363,7 +363,7 @@ static void ConvertTilt(NSPoint tilt, float* xTilt, float* yTilt) auto windowBase = _parent.tryGetWithCast(); if(windowBase != nullptr){ - auto parent = windowBase->Parent; + auto parent = windowBase->Parent.tryGet(); if(parent != nullptr){ auto parentWindow = parent->Window; diff --git a/native/Avalonia.Native/src/OSX/PopupImpl.mm b/native/Avalonia.Native/src/OSX/PopupImpl.mm index f385bddfae..13131bf91e 100644 --- a/native/Avalonia.Native/src/OSX/PopupImpl.mm +++ b/native/Avalonia.Native/src/OSX/PopupImpl.mm @@ -45,8 +45,9 @@ public: virtual bool ShouldTakeFocusOnShow() override { + auto parent = Parent.tryGet(); // Don't steal the focus from another windows if our parent is inactive - if (Parent != nullptr && Parent->Window != nullptr && ![Parent->Window isKeyWindow]) + if (parent != nullptr && parent->Window != nullptr && ![parent->Window isKeyWindow]) return false; return WindowBaseImpl::ShouldTakeFocusOnShow(); diff --git a/native/Avalonia.Native/src/OSX/WindowBaseImpl.h b/native/Avalonia.Native/src/OSX/WindowBaseImpl.h index 874a875330..0c3d410094 100644 --- a/native/Avalonia.Native/src/OSX/WindowBaseImpl.h +++ b/native/Avalonia.Native/src/OSX/WindowBaseImpl.h @@ -108,7 +108,7 @@ protected: std::list _children; public: - WindowBaseImpl* Parent = nullptr; + ComObjectWeakPtr Parent = nullptr; NSWindow * Window; ComPtr BaseEvents; }; diff --git a/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm b/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm index 669927e851..6553e8f460 100644 --- a/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm +++ b/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm @@ -503,16 +503,19 @@ HRESULT WindowBaseImpl::SetParent(IAvnWindowBase *parent) { START_COM_CALL; @autoreleasepool { - if(Parent != nullptr) + + auto oldParent = Parent.tryGet(); + + if(oldParent != nullptr) { - Parent->_children.remove(this); + oldParent->_children.remove(this); } auto cparent = dynamic_cast(parent); Parent = cparent; - if(Parent != nullptr && Window != nullptr){ + if(cparent != nullptr && Window != nullptr){ // If one tries to show a child window with a minimized parent window, then the parent window will be // restored but macOS isn't kind enough to *tell* us that, so the window will be left in a non-interactive // state. Detect this and explicitly restore the parent window ourselves to avoid this situation. diff --git a/native/Avalonia.Native/src/OSX/WindowImpl.mm b/native/Avalonia.Native/src/OSX/WindowImpl.mm index 42ac37ae8c..03f3319bcd 100644 --- a/native/Avalonia.Native/src/OSX/WindowImpl.mm +++ b/native/Avalonia.Native/src/OSX/WindowImpl.mm @@ -546,7 +546,7 @@ bool WindowImpl::IsModal() { } bool WindowImpl::IsOwned() { - return Parent != nullptr; + return Parent.tryGet() != nullptr; } NSWindowStyleMask WindowImpl::CalculateStyleMask() {