vcl/source/window/dockmgr.cxx |   54 +++++++++++++++++++++---------------------
 1 file changed, 28 insertions(+), 26 deletions(-)

New commits:
commit 78f33a2fa02a1fb4025cf5f74984d3064c103e3e
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Fri Feb 26 09:21:38 2021 +0000
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Fri Feb 26 12:17:39 2021 +0100

    take GetWindow by VclPtr to hold reference in face of potential dispose
    
    Change-Id: I141d64695ea01a175eb794fbf9b923d3c7c21934
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111597
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/vcl/source/window/dockmgr.cxx b/vcl/source/window/dockmgr.cxx
index b5e31254ac94..66eccfa36150 100644
--- a/vcl/source/window/dockmgr.cxx
+++ b/vcl/source/window/dockmgr.cxx
@@ -759,16 +759,17 @@ void ImplDockingWindowWrapper::ShowTitleButton( 
TitleButton nButton, bool bVisib
 
 void ImplDockingWindowWrapper::ImplPreparePopupMode()
 {
-    GetWindow()->Show( false, ShowFlags::NoFocusChange );
+    VclPtr<vcl::Window> xWindow = GetWindow();
+    xWindow->Show( false, ShowFlags::NoFocusChange );
 
     // prepare reparenting
-    vcl::Window* pRealParent = GetWindow()->GetWindow( GetWindowType::Parent );
-    mpOldBorderWin = GetWindow()->GetWindow( GetWindowType::Border );
-    if( mpOldBorderWin.get() == GetWindow() )
+    vcl::Window* pRealParent = xWindow->GetWindow( GetWindowType::Parent );
+    mpOldBorderWin = xWindow->GetWindow( GetWindowType::Border );
+    if( mpOldBorderWin.get() == xWindow )
         mpOldBorderWin = nullptr;  // no border window found
 
     // the new parent for popup mode
-    VclPtrInstance<ImplPopupFloatWin> pWin( mpParent, GetWindow()->GetType() 
== WindowType::TOOLBOX );
+    VclPtrInstance<ImplPopupFloatWin> pWin( mpParent, xWindow->GetType() == 
WindowType::TOOLBOX );
     pWin->SetPopupModeEndHdl( LINK( this, ImplDockingWindowWrapper, 
PopupModeEnd ) );
 
     // At least for DockingWindow, GetText() has a side effect of setting 
deferred
@@ -776,24 +777,24 @@ void ImplDockingWindowWrapper::ImplPreparePopupMode()
     // so that the border width will end up in mpWindowImpl->mnBorderWidth, 
not in
     // the border window (See DockingWindow::setPosSizeOnContainee() and
     // DockingWindow::GetOptimalSize()).
-    pWin->SetText( GetWindow()->GetText() );
-    pWin->SetOutputSizePixel( GetWindow()->GetSizePixel() );
+    pWin->SetText( xWindow->GetText() );
+    pWin->SetOutputSizePixel( xWindow->GetSizePixel() );
 
-    GetWindow()->mpWindowImpl->mpBorderWindow  = nullptr;
-    GetWindow()->mpWindowImpl->mnLeftBorder    = 0;
-    GetWindow()->mpWindowImpl->mnTopBorder     = 0;
-    GetWindow()->mpWindowImpl->mnRightBorder   = 0;
-    GetWindow()->mpWindowImpl->mnBottomBorder  = 0;
+    xWindow->mpWindowImpl->mpBorderWindow  = nullptr;
+    xWindow->mpWindowImpl->mnLeftBorder    = 0;
+    xWindow->mpWindowImpl->mnTopBorder     = 0;
+    xWindow->mpWindowImpl->mnRightBorder   = 0;
+    xWindow->mpWindowImpl->mnBottomBorder  = 0;
 
     // reparent borderwindow and window
     if ( mpOldBorderWin )
         mpOldBorderWin->SetParent( pWin );
-    GetWindow()->SetParent( pWin );
+    xWindow->SetParent( pWin );
 
     // correct border window pointers
-    GetWindow()->mpWindowImpl->mpBorderWindow = pWin;
-    pWin->mpWindowImpl->mpClientWindow = GetWindow();
-    GetWindow()->mpWindowImpl->mpRealParent = pRealParent;
+    xWindow->mpWindowImpl->mpBorderWindow = pWin;
+    pWin->mpWindowImpl->mpClientWindow = xWindow;
+    xWindow->mpWindowImpl->mpRealParent = pRealParent;
 
     // set mpFloatWin not until all window positioning is done !!!
     // (SetPosPixel etc. check for valid mpFloatWin pointer)
@@ -842,31 +843,32 @@ void ImplDockingWindowWrapper::StartPopupMode( const 
tools::Rectangle& rRect, Fl
 
 IMPL_LINK_NOARG(ImplDockingWindowWrapper, PopupModeEnd, FloatingWindow*, void)
 {
-    GetWindow()->Show( false, ShowFlags::NoFocusChange );
+    VclPtr<vcl::Window> xWindow = GetWindow();
+    xWindow->Show( false, ShowFlags::NoFocusChange );
 
     // set parameter for handler before destroying floating window
     EndPopupModeData aData( mpFloatWin->GetWindow( GetWindowType::Border 
)->GetPosPixel(), mpFloatWin->IsPopupModeTearOff() );
 
     // before deleting change parent back, so we can delete the floating 
window alone
-    vcl::Window* pRealParent = GetWindow()->GetWindow( GetWindowType::Parent );
-    GetWindow()->mpWindowImpl->mpBorderWindow = nullptr;
+    vcl::Window* pRealParent = xWindow->GetWindow( GetWindowType::Parent );
+    xWindow->mpWindowImpl->mpBorderWindow = nullptr;
     if ( mpOldBorderWin )
     {
-        GetWindow()->SetParent( mpOldBorderWin );
+        xWindow->SetParent( mpOldBorderWin );
         static_cast<ImplBorderWindow*>(mpOldBorderWin.get())->GetBorder(
-            GetWindow()->mpWindowImpl->mnLeftBorder, 
GetWindow()->mpWindowImpl->mnTopBorder,
-            GetWindow()->mpWindowImpl->mnRightBorder, 
GetWindow()->mpWindowImpl->mnBottomBorder );
+            xWindow->mpWindowImpl->mnLeftBorder, 
xWindow->mpWindowImpl->mnTopBorder,
+            xWindow->mpWindowImpl->mnRightBorder, 
xWindow->mpWindowImpl->mnBottomBorder );
         mpOldBorderWin->Resize();
     }
-    GetWindow()->mpWindowImpl->mpBorderWindow = mpOldBorderWin;
-    GetWindow()->SetParent( pRealParent );
-    GetWindow()->mpWindowImpl->mpRealParent = pRealParent;
+    xWindow->mpWindowImpl->mpBorderWindow = mpOldBorderWin;
+    xWindow->SetParent( pRealParent );
+    xWindow->mpWindowImpl->mpRealParent = pRealParent;
 
     maPopupModeEndHdl.Call(mpFloatWin);
     mpFloatWin.disposeAndClear();
 
     // call handler - which will destroy the window and thus the wrapper as 
well !
-    GetWindow()->CallEventListeners( VclEventId::WindowEndPopupMode, &aData );
+    xWindow->CallEventListeners( VclEventId::WindowEndPopupMode, &aData );
 }
 
 bool ImplDockingWindowWrapper::IsInPopupMode() const
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to