diff options
-rw-r--r-- | include/toolkit/awt/vclxwindow.hxx | 17 | ||||
-rw-r--r-- | svtools/source/control/toolbarmenu.cxx | 2 | ||||
-rw-r--r-- | svtools/source/uno/popupwindowcontroller.cxx | 3 | ||||
-rw-r--r-- | toolkit/source/controls/unocontrol.cxx | 55 |
4 files changed, 61 insertions, 16 deletions
diff --git a/include/toolkit/awt/vclxwindow.hxx b/include/toolkit/awt/vclxwindow.hxx index 27be3e102d32..3c925a59143b 100644 --- a/include/toolkit/awt/vclxwindow.hxx +++ b/include/toolkit/awt/vclxwindow.hxx @@ -233,6 +233,23 @@ public: virtual css::uno::Reference< css::awt::XStyleSettings > SAL_CALL getStyleSettings() override; }; +class TOOLKIT_DLLPUBLIC VclListenerLock +{ +private: + VCLXWindow* m_pLockWindow; + +public: + explicit VclListenerLock(VCLXWindow* _pLockWindow); + /** + * @param bSystemWindow - if pVclWindow or its first system window parent + * is locked. + */ + explicit VclListenerLock(vcl::Window* pVclWindow, bool bSystemWindow); + ~VclListenerLock(); + VclListenerLock(const VclListenerLock&) = delete; + VclListenerLock& operator=(const VclListenerLock&) = delete; +}; + #endif // INCLUDED_TOOLKIT_AWT_VCLXWINDOW_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svtools/source/control/toolbarmenu.cxx b/svtools/source/control/toolbarmenu.cxx index eb0c3dcc9b03..d4b69b1a747b 100644 --- a/svtools/source/control/toolbarmenu.cxx +++ b/svtools/source/control/toolbarmenu.cxx @@ -35,6 +35,7 @@ #include <svtools/framestatuslistener.hxx> #include <svtools/valueset.hxx> #include <svtools/toolbarmenu.hxx> +#include <toolkit/awt/vclxwindow.hxx> #include "toolbarmenuimp.hxx" using namespace ::com::sun::star::uno; @@ -1486,6 +1487,7 @@ bool ToolbarPopup::IsInPopupMode() void ToolbarPopup::EndPopupMode() { + VclListenerLock aLock(this, /*bSystemWindow=*/true); GetDockingManager()->EndPopupMode(this); } diff --git a/svtools/source/uno/popupwindowcontroller.cxx b/svtools/source/uno/popupwindowcontroller.cxx index 51f2b6e10f42..19276a45854f 100644 --- a/svtools/source/uno/popupwindowcontroller.cxx +++ b/svtools/source/uno/popupwindowcontroller.cxx @@ -19,6 +19,7 @@ #include <cppuhelper/supportsservice.hxx> #include <toolkit/helper/vclunohelper.hxx> +#include <toolkit/awt/vclxwindow.hxx> #include <vcl/toolbox.hxx> #include <vcl/svapp.hxx> @@ -213,6 +214,8 @@ Reference< awt::XWindow > SAL_CALL PopupWindowController::createPopupWindow() pWin->EnableDocking(); mxImpl->SetPopupWindow(pWin,pToolBox); + + VclListenerLock aLock(pWin, /*bSystemWindow=*/true); vcl::Window::GetDockingManager()->StartPopupMode( pToolBox, pWin, eFloatFlags ); } } diff --git a/toolkit/source/controls/unocontrol.cxx b/toolkit/source/controls/unocontrol.cxx index 6c8435791883..2f41e3f367d4 100644 --- a/toolkit/source/controls/unocontrol.cxx +++ b/toolkit/source/controls/unocontrol.cxx @@ -94,27 +94,50 @@ static Sequence< OUString> lcl_ImplGetPropertyNames( const Reference< XMultiProp return aNames; } - -class VclListenerLock +namespace { -private: - VCLXWindow* m_pLockWindow; - -public: - explicit VclListenerLock( VCLXWindow* _pLockWindow ) - : m_pLockWindow( _pLockWindow ) +VCLXWindow* GetParentSystemWindow(vcl::Window* pWindow) +{ + while (pWindow) { - if ( m_pLockWindow ) - m_pLockWindow->suspendVclEventListening( ); + if (pWindow->IsSystemWindow()) + break; + + pWindow = pWindow->GetParent(); } - ~VclListenerLock() + + uno::Reference<awt::XWindow> xWindow = VCLUnoHelper::GetInterface(pWindow); + return VCLXWindow::GetImplementation(xWindow); +} +} + +VclListenerLock::VclListenerLock(VCLXWindow* _pLockWindow) + : m_pLockWindow(_pLockWindow) +{ + if (m_pLockWindow) + m_pLockWindow->suspendVclEventListening(); +} + +VclListenerLock::VclListenerLock(vcl::Window* pVclWindow, bool bSystemWindow) + : m_pLockWindow(nullptr) +{ + if (bSystemWindow) + m_pLockWindow = GetParentSystemWindow(pVclWindow); + else { - if ( m_pLockWindow ) - m_pLockWindow->resumeVclEventListening( ); + uno::Reference<awt::XWindow> xWindow = VCLUnoHelper::GetInterface(pVclWindow); + m_pLockWindow = VCLXWindow::GetImplementation(xWindow); } - VclListenerLock(const VclListenerLock&) = delete; - VclListenerLock& operator=(const VclListenerLock&) = delete; -}; + + if (m_pLockWindow) + m_pLockWindow->suspendVclEventListening(); +} + +VclListenerLock::~VclListenerLock() +{ + if (m_pLockWindow) + m_pLockWindow->resumeVclEventListening(); +} typedef ::std::map< OUString, sal_Int32 > MapString2Int; struct UnoControl_Data |