summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/toolkit/awt/vclxwindow.hxx17
-rw-r--r--svtools/source/control/toolbarmenu.cxx2
-rw-r--r--svtools/source/uno/popupwindowcontroller.cxx3
-rw-r--r--toolkit/source/controls/unocontrol.cxx55
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