include/vcl/tabpage.hxx | 3 - sfx2/source/sidebar/SidebarController.cxx | 23 +++++++-- sfx2/source/sidebar/SidebarPanelBase.cxx | 14 +++++ sfx2/source/sidebar/Theme.cxx | 20 +++++++ vcl/source/window/tabpage.cxx | 76 +++++++++++++----------------- 5 files changed, 89 insertions(+), 47 deletions(-)
New commits: commit 05444104239f4c7ee5f8df8e96d8cbb8160bbb1e Author: Thorsten Behrens <[email protected]> AuthorDate: Thu Nov 19 14:00:57 2020 +0100 Commit: Thorsten Behrens <[email protected]> CommitDate: Mon Dec 7 13:34:03 2020 +0100 fix tdf#138335 guard sidebar uno methods with SolarMutex Wasn't threadsafe before; using vcl/gui code, so we need the SolarMutex. Conflicts: sfx2/source/sidebar/SidebarController.cxx Change-Id: I3d4407f095837d03ad492fcdf9a08746cf911d25 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106169 Tested-by: Jenkins Reviewed-by: Thorsten Behrens <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106211 Tested-by: Thorsten Behrens <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107137 diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx index 739963e1c36e..e1e8b1e3e079 100644 --- a/sfx2/source/sidebar/SidebarController.cxx +++ b/sfx2/source/sidebar/SidebarController.cxx @@ -202,6 +202,8 @@ void SidebarController::disposeDecks() void SAL_CALL SidebarController::disposing() { + SolarMutexGuard aSolarMutexGuard; + mpCloseIndicator.disposeAndClear(); maFocusManager.Clear(); @@ -270,6 +272,8 @@ void SAL_CALL SidebarController::disposing() void SAL_CALL SidebarController::notifyContextChangeEvent (const css::ui::ContextChangeEventObject& rEvent) { + SolarMutexGuard aSolarMutexGuard; + // Update to the requested new context asynchronously to avoid // subtle errors caused by SFX2 which in rare cases can not // properly handle a synchronous update. @@ -282,7 +286,9 @@ void SAL_CALL SidebarController::notifyContextChangeEvent (const css::ui::Contex { mxCurrentController.set(rEvent.Source, css::uno::UNO_QUERY); maAsynchronousDeckSwitch.CancelRequest(); - maContextChangeUpdate.RequestCall(); + maContextChangeUpdate.RequestCall(); // async call, not a prob + // calling with held + // solarmutex // TODO: this call is redundant but mandatory for unit test to update context on document loading UpdateConfigurations(); } @@ -290,16 +296,24 @@ void SAL_CALL SidebarController::notifyContextChangeEvent (const css::ui::Contex void SAL_CALL SidebarController::disposing (const css::lang::EventObject& ) { + SolarMutexGuard aSolarMutexGuard; + dispose(); } void SAL_CALL SidebarController::propertyChange (const css::beans::PropertyChangeEvent& ) { - maPropertyChangeForwarder.RequestCall(); + SolarMutexGuard aSolarMutexGuard; + + maPropertyChangeForwarder.RequestCall(); // async call, not a prob + // to call with held + // solarmutex } void SAL_CALL SidebarController::statusChanged (const css::frame::FeatureStateEvent& rEvent) { + SolarMutexGuard aSolarMutexGuard; + bool bIsReadWrite (true); if (rEvent.IsEnabled) rEvent.State >>= bIsReadWrite; @@ -314,12 +328,15 @@ void SAL_CALL SidebarController::statusChanged (const css::frame::FeatureStateEv mnRequestedForceFlags |= SwitchFlag_ForceSwitch; maAsynchronousDeckSwitch.CancelRequest(); - maContextChangeUpdate.RequestCall(); + maContextChangeUpdate.RequestCall(); // async call, ok to call + // with held solarmutex } } void SAL_CALL SidebarController::requestLayout() { + SolarMutexGuard aSolarMutexGuard; + sal_Int32 nMinimalWidth = 0; if (mpCurrentDeck && !mpCurrentDeck->isDisposed()) { diff --git a/sfx2/source/sidebar/SidebarPanelBase.cxx b/sfx2/source/sidebar/SidebarPanelBase.cxx index 7d0687462122..ea5c0497aa8e 100644 --- a/sfx2/source/sidebar/SidebarPanelBase.cxx +++ b/sfx2/source/sidebar/SidebarPanelBase.cxx @@ -79,6 +79,8 @@ SidebarPanelBase::~SidebarPanelBase() void SAL_CALL SidebarPanelBase::disposing() { + SolarMutexGuard aGuard; + mpControl.disposeAndClear(); if (mxFrame.is()) @@ -95,6 +97,8 @@ void SAL_CALL SidebarPanelBase::disposing() void SAL_CALL SidebarPanelBase::notifyContextChangeEvent ( const ui::ContextChangeEventObject& rEvent) { + SolarMutexGuard aGuard; + IContextChangeReceiver* pContextChangeReceiver = dynamic_cast<IContextChangeReceiver*>(mpControl.get()); if (pContextChangeReceiver != nullptr) @@ -109,6 +113,8 @@ void SAL_CALL SidebarPanelBase::notifyContextChangeEvent ( void SAL_CALL SidebarPanelBase::disposing ( const css::lang::EventObject&) { + SolarMutexGuard aGuard; + mxFrame = nullptr; mpControl = nullptr; } @@ -142,6 +148,8 @@ Reference<accessibility::XAccessible> SAL_CALL SidebarPanelBase::createAccessibl Reference<awt::XWindow> SAL_CALL SidebarPanelBase::getWindow() { + SolarMutexGuard aGuard; + if (mpControl != nullptr) return Reference<awt::XWindow>( mpControl->GetComponentInterface(), @@ -152,6 +160,8 @@ Reference<awt::XWindow> SAL_CALL SidebarPanelBase::getWindow() ui::LayoutSize SAL_CALL SidebarPanelBase::getHeightForWidth (const sal_Int32 nWidth) { + SolarMutexGuard aGuard; + if (maLayoutSize.Minimum >= 0) return maLayoutSize; else @@ -178,6 +188,8 @@ ui::LayoutSize SAL_CALL SidebarPanelBase::getHeightForWidth (const sal_Int32 nWi sal_Int32 SAL_CALL SidebarPanelBase::getMinimalWidth () { + SolarMutexGuard aGuard; + if (isLayoutEnabled(mpControl)) { // widget layout-based sidebar @@ -189,6 +201,8 @@ sal_Int32 SAL_CALL SidebarPanelBase::getMinimalWidth () void SAL_CALL SidebarPanelBase::updateModel(const css::uno::Reference<css::frame::XModel>& xModel) { + SolarMutexGuard aGuard; + SidebarModelUpdate* pModelUpdate = dynamic_cast<SidebarModelUpdate*>(mpControl.get()); if (!pModelUpdate) return; diff --git a/sfx2/source/sidebar/Theme.cxx b/sfx2/source/sidebar/Theme.cxx index e793c4c77e00..08c142e6ff4e 100644 --- a/sfx2/source/sidebar/Theme.cxx +++ b/sfx2/source/sidebar/Theme.cxx @@ -345,6 +345,8 @@ void Theme::UpdateTheme() void SAL_CALL Theme::disposing() { + SolarMutexGuard aGuard; + ChangeListeners aListeners; aListeners.swap(maChangeListeners); @@ -387,6 +389,8 @@ void SAL_CALL Theme::setPropertyValue ( const ::rtl::OUString& rsPropertyName, const css::uno::Any& rValue) { + SolarMutexGuard aGuard; + PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName)); if (iId == maPropertyNameToIdMap.end()) throw beans::UnknownPropertyException(rsPropertyName); @@ -429,6 +433,8 @@ void SAL_CALL Theme::setPropertyValue ( Any SAL_CALL Theme::getPropertyValue ( const ::rtl::OUString& rsPropertyName) { + SolarMutexGuard aGuard; + PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName)); if (iId == maPropertyNameToIdMap.end()) throw beans::UnknownPropertyException(); @@ -446,6 +452,8 @@ void SAL_CALL Theme::addPropertyChangeListener( const ::rtl::OUString& rsPropertyName, const css::uno::Reference<css::beans::XPropertyChangeListener>& rxListener) { + SolarMutexGuard aGuard; + ThemeItem eItem (AnyItem_); if (rsPropertyName.getLength() > 0) { @@ -468,6 +476,8 @@ void SAL_CALL Theme::removePropertyChangeListener( const ::rtl::OUString& rsPropertyName, const css::uno::Reference<css::beans::XPropertyChangeListener>& rxListener) { + SolarMutexGuard aGuard; + ThemeItem eItem (AnyItem_); if (rsPropertyName.getLength() > 0) { @@ -500,6 +510,8 @@ void SAL_CALL Theme::addVetoableChangeListener( const ::rtl::OUString& rsPropertyName, const css::uno::Reference<css::beans::XVetoableChangeListener>& rxListener) { + SolarMutexGuard aGuard; + ThemeItem eItem (AnyItem_); if (rsPropertyName.getLength() > 0) { @@ -522,6 +534,8 @@ void SAL_CALL Theme::removeVetoableChangeListener( const ::rtl::OUString& rsPropertyName, const css::uno::Reference<css::beans::XVetoableChangeListener>& rxListener) { + SolarMutexGuard aGuard; + ThemeItem eItem (AnyItem_); if (rsPropertyName.getLength() > 0) { @@ -551,6 +565,8 @@ void SAL_CALL Theme::removeVetoableChangeListener( css::uno::Sequence<css::beans::Property> SAL_CALL Theme::getProperties() { + SolarMutexGuard aGuard; + ::std::vector<beans::Property> aProperties; sal_Int32 const nEnd(End_); @@ -576,6 +592,8 @@ css::uno::Sequence<css::beans::Property> SAL_CALL Theme::getProperties() beans::Property SAL_CALL Theme::getPropertyByName (const ::rtl::OUString& rsPropertyName) { + SolarMutexGuard aGuard; + PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName)); if (iId == maPropertyNameToIdMap.end()) throw beans::UnknownPropertyException(); @@ -595,6 +613,8 @@ beans::Property SAL_CALL Theme::getPropertyByName (const ::rtl::OUString& rsProp sal_Bool SAL_CALL Theme::hasPropertyByName (const ::rtl::OUString& rsPropertyName) { + SolarMutexGuard aGuard; + PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName)); if (iId == maPropertyNameToIdMap.end()) return false; commit 963cc1593fc7755d63d2e73806544fb9fd5c68c8 Author: Thorsten Behrens <[email protected]> AuthorDate: Wed Nov 11 03:06:46 2020 +0100 Commit: Thorsten Behrens <[email protected]> CommitDate: Mon Dec 7 13:33:51 2020 +0100 Create tabpage scrollbars only on demand Otherwise glade-ui code gets confused to find controls it never generated. Change-Id: Iaf9a6e6aa5080f7a49bb754fe967e6a85e80cfae Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105572 Tested-by: Thorsten Behrens <[email protected]> Reviewed-by: Thorsten Behrens <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107136 diff --git a/include/vcl/tabpage.hxx b/include/vcl/tabpage.hxx index 9e93de8f37a1..7a57ad17d4bd 100644 --- a/include/vcl/tabpage.hxx +++ b/include/vcl/tabpage.hxx @@ -49,8 +49,6 @@ private: bool mbHasVertBar; Point mnScrollPos; long mnScrWidth; - enum ScrollBarVisibility { None, Vert, Hori, Both }; - ScrollBarVisibility maScrollVis; public: explicit TabPage( vcl::Window* pParent, WinBits nStyle = 0 ); @@ -80,7 +78,6 @@ public: void SetScrollHeight( long nHeight ); void SetScrollLeft( long nLeft ); void SetScrollTop( long Top ); - void setScrollVisibility( ScrollBarVisibility rState ); void ResetScrollBars(); }; diff --git a/vcl/source/window/tabpage.cxx b/vcl/source/window/tabpage.cxx index dc714847bdbd..d5f220a7b1b6 100644 --- a/vcl/source/window/tabpage.cxx +++ b/vcl/source/window/tabpage.cxx @@ -37,35 +37,41 @@ void TabPage::ImplInit( vcl::Window* pParent, WinBits nStyle ) Window::ImplInit( pParent, nStyle, nullptr ); - ImplInitSettings(); - - m_pVScroll.set(VclPtr<ScrollBar>::Create(this, ((nStyle & WB_VSCROLL) ? WB_HIDE : 0) | WB_VSCROLL | WB_DRAG)); - m_pHScroll.set(VclPtr<ScrollBar>::Create(this, ((nStyle & WB_HSCROLL) ? WB_HIDE : 0) | WB_HSCROLL | WB_DRAG)); - m_aScrollBarBox.set( - VclPtr<ScrollBarBox>::Create(this, - ((nStyle & (WB_VSCROLL|WB_HSCROLL)) ? WB_HIDE : 0))); mbHasHoriBar = false; mbHasVertBar = false; - ScrollBarVisibility aVis = None; + + Link<ScrollBar*,void> aLink( LINK( this, TabPage, ScrollBarHdl ) ); if ( nStyle & ( WB_AUTOHSCROLL | WB_AUTOVSCROLL ) ) { if ( nStyle & WB_AUTOHSCROLL ) - aVis = Hori; + { + mbHasHoriBar = true; + m_pHScroll.set(VclPtr<ScrollBar>::Create(this, (WB_HSCROLL | WB_DRAG))); + m_pHScroll->Show(); + m_pHScroll->SetScrollHdl(aLink); + } if ( nStyle & WB_AUTOVSCROLL ) { - if ( aVis == Hori ) - aVis = Both; - else - aVis = Vert; + mbHasVertBar = true; + m_pVScroll.set(VclPtr<ScrollBar>::Create(this, (WB_VSCROLL | WB_DRAG))); + m_pVScroll->Show(); + m_pVScroll->SetScrollHdl(aLink); } } - setScrollVisibility( aVis ); + + if ( mbHasHoriBar || mbHasVertBar ) + { + m_aScrollBarBox.set( + VclPtr<ScrollBarBox>::Create(this, + ((nStyle & (WB_VSCROLL|WB_HSCROLL)) ? WB_HIDE : 0))); + m_aScrollBarBox->Show(); + SetStyle( GetStyle() | WB_CLIPCHILDREN ); + } + mnScrWidth = Application::GetSettings().GetStyleSettings().GetScrollBarSize(); - Link<ScrollBar*,void> aLink( LINK( this, TabPage, ScrollBarHdl ) ); - m_pVScroll->SetScrollHdl(aLink); - m_pHScroll->SetScrollHdl(aLink); + ImplInitSettings(); // if the tabpage is drawn (ie filled) by a native widget, make sure all controls will have transparent background // otherwise they will paint with a wrong background @@ -244,23 +250,6 @@ void TabPage::SetPosPixel(const Point& rAllocPos) } } -void TabPage::setScrollVisibility( ScrollBarVisibility rVisState ) -{ - maScrollVis = rVisState; - if ( maScrollVis == Hori || maScrollVis == Both ) - { - mbHasHoriBar = true; - m_pHScroll->Show(); - } - if ( maScrollVis == Vert || maScrollVis == Both ) - { - mbHasVertBar = true; - m_pVScroll->Show(); - } - if ( mbHasHoriBar || mbHasVertBar ) - SetStyle( GetStyle() | WB_CLIPCHILDREN ); -} - void TabPage::lcl_Scroll( long nX, long nY ) { long nXScroll = mnScrollPos.X() - nX; @@ -332,14 +321,19 @@ void TabPage::ResetScrollBars() Point aVPos( aOutSz.Width() - mnScrWidth, 0 ); Point aHPos( 0, aOutSz.Height() - mnScrWidth ); - m_pVScroll->SetPosSizePixel( aVPos, Size( mnScrWidth, GetSizePixel().Height() - mnScrWidth ) ); - m_pHScroll->SetPosSizePixel( aHPos, Size( GetSizePixel().Width() - mnScrWidth, mnScrWidth ) ); - - m_pHScroll->SetRangeMax( maScrollArea.Width() + mnScrWidth ); - m_pHScroll->SetVisibleSize( GetSizePixel().Width() ); + if( m_pVScroll ) + { + m_pVScroll->SetPosSizePixel( aVPos, Size( mnScrWidth, GetSizePixel().Height() - mnScrWidth ) ); + m_pVScroll->SetRangeMax( maScrollArea.Height() + mnScrWidth ); + m_pVScroll->SetVisibleSize( GetSizePixel().Height() ); + } - m_pVScroll->SetRangeMax( maScrollArea.Height() + mnScrWidth ); - m_pVScroll->SetVisibleSize( GetSizePixel().Height() ); + if( m_pHScroll ) + { + m_pHScroll->SetPosSizePixel( aHPos, Size( GetSizePixel().Width() - mnScrWidth, mnScrWidth ) ); + m_pHScroll->SetRangeMax( maScrollArea.Width() + mnScrWidth ); + m_pHScroll->SetVisibleSize( GetSizePixel().Width() ); + } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
