tdf#156820 Fix crash in custom color picker

which requires

(*) keeping ColorPicker alive during the runAsync in
ColorPicker::startExecuteModal

(*) keeping the PaletteManager alive during the ExecuteAsync in
PaletteManager::PopupCOlorPicker

Noting that MattK debugged the cause of this.

Change-Id: I07efe8e6514f8882b1347c79c6150578c234bb9d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161054
Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
This commit is contained in:
Noel Grandin
2023-12-22 12:20:27 +01:00
parent 5302a8888d
commit 78ccae0d42
3 changed files with 11 additions and 9 deletions
+4 -3
View File
@@ -1345,12 +1345,13 @@ void SAL_CALL ColorPicker::setDialogTitle( const OUString& )
void SAL_CALL ColorPicker::startExecuteModal( const css::uno::Reference< css::ui::dialogs::XDialogClosedListener >& xListener )
{
std::shared_ptr<ColorPickerDialog> xDlg = std::make_shared<ColorPickerDialog>(Application::GetFrameWeld(mxParent), mnColor, mnMode);
weld::DialogController::runAsync(xDlg, [this, xDlg, xListener] (sal_Int32 nResult) {
rtl::Reference<ColorPicker> xThis(this);
weld::DialogController::runAsync(xDlg, [xThis, xDlg, xListener] (sal_Int32 nResult) {
if (nResult)
mnColor = xDlg->GetColor();
xThis->mnColor = xDlg->GetColor();
sal_Int16 nRet = static_cast<sal_Int16>(nResult);
css::ui::dialogs::DialogClosedEvent aEvent( *this, nRet );
css::ui::dialogs::DialogClosedEvent aEvent( *xThis, nRet );
xListener->dialogClosed( aEvent );
});
}
+1 -1
View File
@@ -33,7 +33,7 @@ namespace svx { class ToolboxButtonColorUpdaterBase; }
namespace weld { class Window; }
namespace model { class ColorSet; }
class SVXCORE_DLLPUBLIC PaletteManager
class SVXCORE_DLLPUBLIC PaletteManager : public std::enable_shared_from_this<PaletteManager>
{
const sal_uInt16 mnMaxRecentColors;
+6 -5
View File
@@ -405,15 +405,16 @@ void PaletteManager::PopupColorPicker(weld::Window* pParent, const OUString& aCo
m_pColorDlg = std::make_unique<SvColorDialog>();
m_pColorDlg->SetColor(rInitialColor);
m_pColorDlg->SetMode(svtools::ColorPickerMode::Modify);
m_pColorDlg->ExecuteAsync(pParent, [this, aCommandCopy] (sal_Int32 nResult) {
std::shared_ptr<PaletteManager> xSelf(shared_from_this());
m_pColorDlg->ExecuteAsync(pParent, [xSelf, aCommandCopy] (sal_Int32 nResult) {
if (nResult == RET_OK)
{
Color aLastColor = m_pColorDlg->GetColor();
Color aLastColor = xSelf->m_pColorDlg->GetColor();
OUString sColorName = "#" + aLastColor.AsRGBHexString().toAsciiUpperCase();
NamedColor aNamedColor(aLastColor, sColorName);
SetSplitButtonColor(aNamedColor);
AddRecentColor(aLastColor, sColorName);
maColorSelectFunction(aCommandCopy, aNamedColor);
xSelf->SetSplitButtonColor(aNamedColor);
xSelf->AddRecentColor(aLastColor, sColorName);
xSelf->maColorSelectFunction(aCommandCopy, aNamedColor);
}
});
}