diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2017-01-16 13:53:00 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2017-01-17 11:36:59 +0000 |
commit | 4bde081f7ebaf3d6e489a50b287f82ccb14de224 (patch) | |
tree | 5551f3ff0532344a761033a29b1887f21bf05711 | |
parent | f3217ade046a723ae7ff9c729ca6691f19581ebb (diff) |
tdf#105017 Crash when click a "New Theme..." in Gallery on detached SideBar
caused by VclPtr fixes which meant instead of the dialog staying in an
always-zero ref-count state, it went up to a ref-count of 1, then down
to zero, which triggered a delete before the dialog had finished
displaying.
And revert my fix in commit 0c1cd678f71e519f5a4e623d93442e046485005a
which just worked around the underlying problem
Change-Id: Icb35535dd06a2d1db1016d00d106760847d87430
(cherry picked from commit cd9d8315141c3070f43e145ed4ee390e837eb73f)
Reviewed-on: https://gerrit.libreoffice.org/33209
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r-- | svx/source/gallery2/galbrws1.cxx | 28 | ||||
-rw-r--r-- | svx/source/gallery2/galbrws1.hxx | 3 | ||||
-rw-r--r-- | vcl/source/window/dialog.cxx | 2 |
3 files changed, 17 insertions, 16 deletions
diff --git a/svx/source/gallery2/galbrws1.cxx b/svx/source/gallery2/galbrws1.cxx index dbd09be8f738..3967fc4eaa8c 100644 --- a/svx/source/gallery2/galbrws1.cxx +++ b/svx/source/gallery2/galbrws1.cxx @@ -148,6 +148,7 @@ GalleryBrowser1::~GalleryBrowser1() void GalleryBrowser1::dispose() { EndListening( *mpGallery ); + mpThemePropertiesDialog.clear(); mpThemes.disposeAndClear(); delete mpExchangeData; mpExchangeData = nullptr; @@ -265,24 +266,24 @@ void GalleryBrowser1::ImplGalleryThemeProperties( const OUString & rThemeName, b SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); assert(pFact && "Got no AbstractDialogFactory!"); - VclPtr<VclAbstractDialog2> pThemeProps = pFact->CreateGalleryThemePropertiesDialog( mpExchangeData, mpThemePropsDlgItemSet ); - assert(pThemeProps && "Got no GalleryThemePropertiesDialog!"); + mpThemePropertiesDialog = pFact->CreateGalleryThemePropertiesDialog( mpExchangeData, mpThemePropsDlgItemSet ); + assert(mpThemePropertiesDialog && "Got no GalleryThemePropertiesDialog!"); if ( bCreateNew ) { - pThemeProps->StartExecuteModal( + mpThemePropertiesDialog->StartExecuteModal( LINK( this, GalleryBrowser1, EndNewThemePropertiesDlgHdl ) ); } else { - pThemeProps->StartExecuteModal( + mpThemePropertiesDialog->StartExecuteModal( LINK( this, GalleryBrowser1, EndThemePropertiesDlgHdl ) ); } } -void GalleryBrowser1::ImplEndGalleryThemeProperties(Dialog* pDialog, bool bCreateNew) +void GalleryBrowser1::ImplEndGalleryThemeProperties(Dialog* /*pDialog*/, bool bCreateNew) { - long nRet = pDialog->GetResult(); + long nRet = mpThemePropertiesDialog->GetResult(); if( nRet == RET_OK ) { @@ -319,23 +320,22 @@ void GalleryBrowser1::ImplEndGalleryThemeProperties(Dialog* pDialog, bool bCreat } // destroy mpThemeProps asynchronously - Application::PostUserEvent( LINK( this, GalleryBrowser1, DestroyThemePropertiesDlgHdl ), pDialog, true ); + Application::PostUserEvent( LINK( this, GalleryBrowser1, DestroyThemePropertiesDlgHdl ), nullptr, true ); } -IMPL_LINK( GalleryBrowser1, EndNewThemePropertiesDlgHdl, Dialog&, rDialog, void ) +IMPL_LINK( GalleryBrowser1, EndNewThemePropertiesDlgHdl, Dialog&, /*rDialog*/, void ) { - ImplEndGalleryThemeProperties(&rDialog, true); + ImplEndGalleryThemeProperties(nullptr, true); } -IMPL_LINK( GalleryBrowser1, EndThemePropertiesDlgHdl, Dialog&, rDialog, void ) +IMPL_LINK( GalleryBrowser1, EndThemePropertiesDlgHdl, Dialog&, /*rDialog*/, void ) { - ImplEndGalleryThemeProperties(&rDialog, false); + ImplEndGalleryThemeProperties(nullptr, false); } -IMPL_LINK( GalleryBrowser1, DestroyThemePropertiesDlgHdl, void*, p, void ) +IMPL_LINK( GalleryBrowser1, DestroyThemePropertiesDlgHdl, void*, /*p*/, void ) { - VclPtr<VclAbstractDialog2> pDialog = static_cast<VclAbstractDialog2*>(p); - pDialog.disposeAndClear(); + mpThemePropertiesDialog.disposeAndClear(); delete mpThemePropsDlgItemSet; mpThemePropsDlgItemSet = nullptr; } diff --git a/svx/source/gallery2/galbrws1.hxx b/svx/source/gallery2/galbrws1.hxx index 999d8a6cea76..47118f3e0a14 100644 --- a/svx/source/gallery2/galbrws1.hxx +++ b/svx/source/gallery2/galbrws1.hxx @@ -77,8 +77,9 @@ class GalleryBrowser1 : public Control, public SfxListener private: - VclPtr<GalleryButton> maNewTheme; + VclPtr<GalleryButton> maNewTheme; VclPtr<GalleryThemeListBox> mpThemes; + VclPtr<VclAbstractDialog2> mpThemePropertiesDialog; // to keep it alive during execution Gallery* mpGallery; ExchangeData* mpExchangeData; SfxItemSet* mpThemePropsDlgItemSet; diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx index c6fcae325a0d..eef4c5ab5018 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -1039,7 +1039,7 @@ void Dialog::SetModalInputMode( bool bModal ) // Disable the prev Modal Dialog, because our dialog must close at first, // before the other dialog can be closed (because the other dialog // is on stack since our dialog returns) - if ( mpPrevExecuteDlg && !mpPrevExecuteDlg->isDisposed() && !mpPrevExecuteDlg->IsWindowOrChild( this, true ) ) + if ( mpPrevExecuteDlg && !mpPrevExecuteDlg->IsWindowOrChild( this, true ) ) mpPrevExecuteDlg->EnableInput( false, this ); // determine next overlap dialog parent |