From ed5322c3212868e87853d3cb00aefde4428d682e Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Oct 31 2019 11:07:26 +0000 Subject: fix crashes related to line and color menubutton popups --- diff --git a/0001-setting-has-default-true-on-an-element-in-a-GtkPopov.patch b/0001-setting-has-default-true-on-an-element-in-a-GtkPopov.patch new file mode 100644 index 0000000..a4313f0 --- /dev/null +++ b/0001-setting-has-default-true-on-an-element-in-a-GtkPopov.patch @@ -0,0 +1,105 @@ +From b1c1b0d4336f0acfa3696d0b83349acbce613b18 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Thu, 31 Oct 2019 10:57:31 +0000 +Subject: [PATCH] setting has-default true on an element in a GtkPopover is + fatal + +in gtk 3.24.12 at least. + +in ColorWindow explicitly track which button is the 'default' one for the two +modes instead of using get/use-default and then just grab_focus instead of +setting has-default for these popover cases + +Change-Id: Ia226f847f666d2356c6ea4e8c47f5db8e2535410 +--- + include/svx/colorwindow.hxx | 1 + + svtools/source/control/ctrlbox.cxx | 4 ++-- + svx/source/tbxctrls/tbcontrl.cxx | 14 ++++++++------ + 3 files changed, 11 insertions(+), 8 deletions(-) + +diff --git a/include/svx/colorwindow.hxx b/include/svx/colorwindow.hxx +index 45a5a8b30343..c3863f80ee80 100644 +--- a/include/svx/colorwindow.hxx ++++ b/include/svx/colorwindow.hxx +@@ -149,6 +149,7 @@ private: + std::unique_ptr mxAutomaticSeparator; + std::unique_ptr mxColorSetWin; + std::unique_ptr mxRecentColorSetWin; ++ weld::Button* mpDefaultButton; + + DECL_LINK(SelectHdl, SvtValueSet*, void); + DECL_LINK(SelectPaletteHdl, weld::ComboBox&, void); +diff --git a/svtools/source/control/ctrlbox.cxx b/svtools/source/control/ctrlbox.cxx +index d67c69dce9e3..61d1d9e729ac 100644 +--- a/svtools/source/control/ctrlbox.cxx ++++ b/svtools/source/control/ctrlbox.cxx +@@ -1597,12 +1597,12 @@ void SvtLineListBox::SelectEntry(SvxBorderLineStyle nStyle) + if (nStyle == SvxBorderLineStyle::NONE) + { + m_xLineSet->SetNoSelection(); +- m_xNoneButton->set_has_default(true); ++ m_xNoneButton->grab_focus(); + } + else + { + m_xLineSet->SelectItem(static_cast(nStyle) + 1); +- m_xNoneButton->set_has_default(false); ++ m_xLineSet->GrabFocus(); + } + UpdatePreview(); + } +diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx +index 2c2603fb4c8d..1b8d6fe09092 100644 +--- a/svx/source/tbxctrls/tbcontrl.cxx ++++ b/svx/source/tbxctrls/tbcontrl.cxx +@@ -1791,6 +1791,7 @@ ColorWindow::ColorWindow(std::shared_ptr const & rPaletteManager + , mxAutomaticSeparator(m_xBuilder->weld_widget("separator4")) + , mxColorSetWin(new weld::CustomWeld(*m_xBuilder, "colorset", *mxColorSet)) + , mxRecentColorSetWin(new weld::CustomWeld(*m_xBuilder, "recent_colorset", *mxRecentColorSet)) ++ , mpDefaultButton(nullptr) + { + mxColorSet->SetStyle( WinBits(WB_FLATVALUESET | WB_ITEMBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT | WB_TABSTOP) ); + mxRecentColorSet->SetStyle( WinBits(WB_FLATVALUESET | WB_ITEMBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT | WB_TABSTOP) ); +@@ -1988,7 +1989,7 @@ NamedColor ColorWindow::GetSelectEntryColor() const + return GetSelectEntryColor(mxColorSet.get()); + if (!mxRecentColorSet->IsNoSelection()) + return GetSelectEntryColor(mxRecentColorSet.get()); +- if (mxButtonNoneColor->get_has_default()) ++ if (mxButtonNoneColor.get() == mpDefaultButton) + return GetNoneColor(); + return GetAutoColor(); + } +@@ -2130,8 +2131,7 @@ void ColorWindow::SetNoSelection() + { + mxColorSet->SetNoSelection(); + mxRecentColorSet->SetNoSelection(); +- mxButtonAutoColor->set_has_default(false); +- mxButtonNoneColor->set_has_default(false); ++ mpDefaultButton = nullptr; + } + + bool SvxColorWindow::IsNoSelection() const +@@ -2259,15 +2259,17 @@ void ColorWindow::SelectEntry(const NamedColor& rNamedColor) + + const Color &rColor = rNamedColor.first; + +- if (mxButtonNoneColor->get_visible() && (rColor == COL_TRANSPARENT || rColor == COL_AUTO)) ++ if (mxButtonAutoColor->get_visible() && (rColor == COL_TRANSPARENT || rColor == COL_AUTO)) + { +- mxButtonAutoColor->set_has_default(true); ++ mpDefaultButton = mxButtonAutoColor.get(); ++ mxButtonAutoColor->grab_focus(); + return; + } + + if (mxButtonNoneColor->get_visible() && rColor == COL_NONE_COLOR) + { +- mxButtonNoneColor->set_has_default(true); ++ mpDefaultButton = mxButtonNoneColor.get(); ++ mxButtonNoneColor->grab_focus(); + return; + } + +-- +2.20.1 +