diff options
Diffstat (limited to 'vcl/win')
-rw-r--r-- | vcl/win/window/salframe.cxx | 52 |
1 files changed, 32 insertions, 20 deletions
diff --git a/vcl/win/window/salframe.cxx b/vcl/win/window/salframe.cxx index e0a99d8e8779..2e60f38c1f11 100644 --- a/vcl/win/window/salframe.cxx +++ b/vcl/win/window/salframe.cxx @@ -5395,30 +5395,43 @@ static void ImplHandleIMENotify( HWND hWnd, WPARAM wParam ) static bool ImplHandleGetObject(HWND hWnd, LPARAM lParam, WPARAM wParam, LRESULT & nRet) { - if (!Application::GetSettings().GetMiscSettings().GetEnableATToolSupport()) + uno::Reference<accessibility::XMSAAService> xMSAA; + if (ImplSalYieldMutexTryToAcquire()) { - // IA2 should be enabled automatically - AllSettings aSettings = Application::GetSettings(); - MiscSettings aMisc = aSettings.GetMiscSettings(); - aMisc.SetEnableATToolSupport(true); - // The above is enough, since aMisc changes the same shared ImplMiscData as used in global - // settings, so no need to call aSettings.SetMiscSettings and Application::SetSettings - if (!Application::GetSettings().GetMiscSettings().GetEnableATToolSupport()) - return false; // locked down somehow ? - } + { + // IA2 should be enabled automatically + AllSettings aSettings = Application::GetSettings(); + MiscSettings aMisc = aSettings.GetMiscSettings(); + aMisc.SetEnableATToolSupport(true); + // The above is enough, since aMisc changes the same shared ImplMiscData as used in global + // settings, so no need to call aSettings.SetMiscSettings and Application::SetSettings + + if (!Application::GetSettings().GetMiscSettings().GetEnableATToolSupport()) + return false; // locked down somehow ? + } - ImplSVData* pSVData = ImplGetSVData(); + ImplSVData* pSVData = ImplGetSVData(); - // Make sure to launch Accessibility only the following criteria are satisfied - // to avoid RFT interrupts regular accessibility processing - if ( !pSVData->mxAccessBridge.is() ) - { - if( !InitAccessBridge() ) - return false; + // Make sure to launch Accessibility only the following criteria are satisfied + // to avoid RFT interrupts regular accessibility processing + if ( !pSVData->mxAccessBridge.is() ) + { + if( !InitAccessBridge() ) + return false; + } + xMSAA.set(pSVData->mxAccessBridge, uno::UNO_QUERY); + ImplSalYieldMutexRelease(); + } + else + { // tdf#155794: access without locking: hopefully this should be fine + // as the bridge is typically inited in Desktop::Main() already and the + // WM_GETOBJECT is received only on the main thread and by the time in + // VCL shutdown when ImplSvData dies there should not be Windows any + // more that could receive messages. + xMSAA.set(ImplGetSVData()->mxAccessBridge, uno::UNO_QUERY); } - uno::Reference< accessibility::XMSAAService > xMSAA( pSVData->mxAccessBridge, uno::UNO_QUERY ); if ( xMSAA.is() ) { sal_Int32 lParam32 = static_cast<sal_Int32>(lParam); @@ -5963,12 +5976,11 @@ static LRESULT CALLBACK SalFrameWndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LP break; case WM_GETOBJECT: - ImplSalYieldMutexAcquireWithWait(); + // tdf#155794: this must complete without taking SolarMutex if ( ImplHandleGetObject( hWnd, lParam, wParam, nRet ) ) { rDef = false; } - ImplSalYieldMutexRelease(); break; case WM_APPCOMMAND: |