include/svx/gridctrl.hxx | 4 ++-- include/vcl/weldutils.hxx | 1 + svtools/source/control/tabbar.cxx | 18 +++++++++--------- svx/source/fmcomp/gridctrl.cxx | 8 ++++---- vcl/source/app/weldutils.cxx | 3 +++ 5 files changed, 19 insertions(+), 15 deletions(-)
New commits: commit a0bf3da7a610e35862878687fed01b63ee5e5308 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Sat Dec 19 22:22:18 2020 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Sun Dec 20 17:36:53 2020 +0100 tdf#139063 crash when add a new sheet to a RTL sheet Change-Id: Icbfb45036f93ed92e5c83039cd4c3b536f0df0d4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108036 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/include/svx/gridctrl.hxx b/include/svx/gridctrl.hxx index e09b0a146284..7667d456bd00 100644 --- a/include/svx/gridctrl.hxx +++ b/include/svx/gridctrl.hxx @@ -190,8 +190,8 @@ class NavigationBar final : public InterimItemWindow std::unique_ptr<weld::Button> m_xLastBtn; // Button for 'go to the last record' std::unique_ptr<weld::Button> m_xNewBtn; // Button for 'go to a new record' - weld::ButtonPressRepeater m_aPrevRepeater; - weld::ButtonPressRepeater m_aNextRepeater; + std::shared_ptr<weld::ButtonPressRepeater> m_xPrevRepeater; + std::shared_ptr<weld::ButtonPressRepeater> m_xNextRepeater; sal_Int32 m_nCurrentPos; diff --git a/include/vcl/weldutils.hxx b/include/vcl/weldutils.hxx index 43461ab6fb51..86af6c6e95ee 100644 --- a/include/vcl/weldutils.hxx +++ b/include/vcl/weldutils.hxx @@ -397,6 +397,7 @@ private: }; class VCL_DLLPUBLIC ButtonPressRepeater final + : public std::enable_shared_from_this<ButtonPressRepeater> { private: weld::Button& m_rButton; diff --git a/svtools/source/control/tabbar.cxx b/svtools/source/control/tabbar.cxx index 1beda5faeff6..640d767477d6 100644 --- a/svtools/source/control/tabbar.cxx +++ b/svtools/source/control/tabbar.cxx @@ -426,9 +426,9 @@ public: std::unique_ptr<weld::Button> m_xNextButton; std::unique_ptr<weld::Button> m_xLastButton; std::unique_ptr<weld::Button> m_xAddButton; - std::unique_ptr<weld::ButtonPressRepeater> m_xAddRepeater; - std::unique_ptr<weld::ButtonPressRepeater> m_xPrevRepeater; - std::unique_ptr<weld::ButtonPressRepeater> m_xNextRepeater; + std::shared_ptr<weld::ButtonPressRepeater> m_xAddRepeater; + std::shared_ptr<weld::ButtonPressRepeater> m_xPrevRepeater; + std::shared_ptr<weld::ButtonPressRepeater> m_xNextRepeater; TabButtons(TabBar* pParent) : InterimItemWindow(pParent, @@ -780,8 +780,8 @@ void TabBar::ImplInitControls() if (mnWinStyle & WB_INSERTTAB) { Link<weld::Button&,void> aLink = LINK(this, TabBar, ImplAddClickHandler); - mpImpl->mxButtonBox->m_xAddRepeater.reset(new weld::ButtonPressRepeater( - *mpImpl->mxButtonBox->m_xAddButton, aLink, aContextLink)); + mpImpl->mxButtonBox->m_xAddRepeater = std::make_shared<weld::ButtonPressRepeater>( + *mpImpl->mxButtonBox->m_xAddButton, aLink, aContextLink); mpImpl->mxButtonBox->m_xAddButton->show(); } @@ -789,11 +789,11 @@ void TabBar::ImplInitControls() if (mnWinStyle & (WB_MINSCROLL | WB_SCROLL)) { - mpImpl->mxButtonBox->m_xPrevRepeater.reset(new weld::ButtonPressRepeater( - *mpImpl->mxButtonBox->m_xPrevButton, aLink, aContextLink)); + mpImpl->mxButtonBox->m_xPrevRepeater = std::make_shared<weld::ButtonPressRepeater>( + *mpImpl->mxButtonBox->m_xPrevButton, aLink, aContextLink); mpImpl->mxButtonBox->m_xPrevButton->show(); - mpImpl->mxButtonBox->m_xNextRepeater.reset(new weld::ButtonPressRepeater( - *mpImpl->mxButtonBox->m_xNextButton, aLink, aContextLink)); + mpImpl->mxButtonBox->m_xNextRepeater = std::make_shared<weld::ButtonPressRepeater>( + *mpImpl->mxButtonBox->m_xNextButton, aLink, aContextLink); mpImpl->mxButtonBox->m_xNextButton->show(); } diff --git a/svx/source/fmcomp/gridctrl.cxx b/svx/source/fmcomp/gridctrl.cxx index b004aed7d7d9..41f3255e3585 100644 --- a/svx/source/fmcomp/gridctrl.cxx +++ b/svx/source/fmcomp/gridctrl.cxx @@ -317,8 +317,8 @@ NavigationBar::NavigationBar(vcl::Window* pParent) , m_xNextBtn(m_xBuilder->weld_button("next")) , m_xLastBtn(m_xBuilder->weld_button("last")) , m_xNewBtn(m_xBuilder->weld_button("new")) - , m_aPrevRepeater(*m_xPrevBtn, LINK(this,NavigationBar,OnClick)) - , m_aNextRepeater(*m_xNextBtn, LINK(this,NavigationBar,OnClick)) + , m_xPrevRepeater(std::make_shared<weld::ButtonPressRepeater>(*m_xPrevBtn, LINK(this,NavigationBar,OnClick))) + , m_xNextRepeater(std::make_shared<weld::ButtonPressRepeater>(*m_xNextBtn, LINK(this,NavigationBar,OnClick))) , m_nCurrentPos(-1) , m_bPositioning(false) { @@ -577,9 +577,9 @@ void NavigationBar::SetState(DbGridControlNavigationBarState nWhich) if (!bAvailable) { if (pWnd == m_xNextBtn.get()) - m_aNextRepeater.Stop(); + m_xNextRepeater->Stop(); else if (pWnd == m_xPrevBtn.get()) - m_aPrevRepeater.Stop(); + m_xPrevRepeater->Stop(); } } diff --git a/vcl/source/app/weldutils.cxx b/vcl/source/app/weldutils.cxx index bce1f478a1f1..836f6220e222 100644 --- a/vcl/source/app/weldutils.cxx +++ b/vcl/source/app/weldutils.cxx @@ -576,7 +576,10 @@ IMPL_LINK(ButtonPressRepeater, MousePressHdl, const MouseEvent&, rMouseEvent, bo m_bModKey = rMouseEvent.IsMod1(); if (!m_rButton.get_sensitive()) return false; + auto self = weak_from_this(); RepeatTimerHdl(nullptr); + if (!self.lock()) + return false; if (!m_rButton.get_sensitive()) return false; m_aRepeat.SetTimeout(MouseSettings::GetButtonStartRepeat()); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits