[Libreoffice-commits] core.git: 5 commits - vcl/source vcl/win winaccessibility/inc winaccessibility/source
Michael Stahl
mstahl at redhat.com
Mon Dec 2 04:21:06 PST 2013
vcl/source/app/svdata.cxx | 33 +++++++----
vcl/win/source/window/salframe.cxx | 20 +++++-
winaccessibility/inc/AccObjectManagerAgent.hxx | 9 ++-
winaccessibility/inc/AccObjectWinManager.hxx | 2
winaccessibility/inc/AccTopWindowListener.hxx | 2
winaccessibility/inc/g_msacc.hxx | 27 ---------
winaccessibility/source/UAccCOM/MAccessible.cxx | 33 +++++------
winaccessibility/source/UAccCOM/UAccCOM.cxx | 4 -
winaccessibility/source/service/AccObjectManagerAgent.cxx | 22 ++++---
winaccessibility/source/service/AccObjectWinManager.cxx | 33 -----------
winaccessibility/source/service/AccTopWindowListener.cxx | 6 ++
winaccessibility/source/service/msaaservice_impl.cxx | 41 +-------------
12 files changed, 89 insertions(+), 143 deletions(-)
New commits:
commit b44ed4c408d92f7a1a3f2390c056d518c137ddd0
Author: Michael Stahl <mstahl at redhat.com>
Date: Fri Nov 29 23:03:37 2013 +0100
vcl: check if AT is running before loading the library
... which should result in faster startup if it's disabled.
Change-Id: I39774b0a56f186d08270c2f17b2b20a823f21dc2
diff --git a/vcl/source/app/svdata.cxx b/vcl/source/app/svdata.cxx
index 97116d4..aa58484 100644
--- a/vcl/source/app/svdata.cxx
+++ b/vcl/source/app/svdata.cxx
@@ -297,6 +297,9 @@ com::sun::star::uno::Any AccessBridgeCurrentContext::getValueByName( const OUStr
return ret;
}
+#ifdef _WIN32
+bool HasAtHook();
+#endif
bool ImplInitAccessBridge(bool bAllowCancel, bool &rCancelled)
{
@@ -324,25 +327,35 @@ bool ImplInitAccessBridge(bool bAllowCancel, bool &rCancelled)
{
css::uno::Reference< XComponentContext > xContext(comphelper::getProcessComponentContext());
+#ifdef _WIN32
bool bTryIAcc2 = ( officecfg::Office::Common::Misc::ExperimentalMode::get( xContext ) &&
!getenv ("SAL_DISABLE_IACCESSIBLE2") );
if ( bTryIAcc2 ) // Windows only really
{
- try {
- pSVData->mxAccessBridge
- = css::accessibility::MSAAService::create(xContext);
- SAL_INFO("vcl", "got IAccessible2 bridge");
- return true;
- } catch (css::uno::DeploymentException & e) {
- SAL_INFO(
- "vcl",
- "got no IAccessible2 bridge, \"" << e.Message
- << "\", falling back to java");
+ if (!HasAtHook() && !getenv("SAL_FORCE_IACCESSIBLE2"))
+ {
+ SAL_INFO("vcl", "Apparently no running AT -> "
+ "not enabling IAccessible2 integration");
+ }
+ else
+ {
+ try {
+ pSVData->mxAccessBridge
+ = css::accessibility::MSAAService::create(xContext);
+ SAL_INFO("vcl", "got IAccessible2 bridge");
+ return true;
+ } catch (css::uno::DeploymentException & e) {
+ SAL_INFO(
+ "vcl",
+ "got no IAccessible2 bridge, \"" << e.Message
+ << "\", falling back to java");
+ }
}
}
else
SAL_INFO( "vcl", "IAccessible2 disabled, falling back to java" );
+#endif
css::uno::Reference< XExtendedToolkit > xToolkit =
css::uno::Reference< XExtendedToolkit >(Application::GetVCLToolkit(), UNO_QUERY);
diff --git a/vcl/win/source/window/salframe.cxx b/vcl/win/source/window/salframe.cxx
index 913d539..f7c3086 100644
--- a/vcl/win/source/window/salframe.cxx
+++ b/vcl/win/source/window/salframe.cxx
@@ -6257,4 +6257,14 @@ sal_Bool ImplWriteLastError( DWORD lastError, const char *szApiCall )
// -----------------------------------------------------------------------
+#ifdef _WIN32
+bool HasAtHook()
+{
+ BOOL bIsRunning = FALSE;
+ // pvParam must be BOOL
+ return SystemParametersInfo(SPI_GETSCREENREADER, 0, &bIsRunning, 0)
+ && bIsRunning;
+}
+#endif
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/winaccessibility/source/service/msaaservice_impl.cxx b/winaccessibility/source/service/msaaservice_impl.cxx
index 219eaee..961a012 100644
--- a/winaccessibility/source/service/msaaservice_impl.cxx
+++ b/winaccessibility/source/service/msaaservice_impl.cxx
@@ -237,21 +237,6 @@ static void AccessBridgeUpdateOldTopWindows( const Reference< XMSAAService > &xA
}
}
-static bool HasAtHook()
-{
- sal_Int32 bIsRuning=0;
- // BOOL WINAPI SystemParametersInfo(
- // __in UINT uiAction,
- // __in UINT uiParam,
- // __inout PVOID pvParam,
- // __in UINT fWinIni
- // );
- // pvParam must be BOOL (defined in MFC as int)
- // End
- return SystemParametersInfo( SPI_GETSCREENREADER, 0,
- &bIsRuning, 0) && bIsRuning;
-}
-
/**
* Static method that can create an entity of our MSAA Service
* @param xContext No use here.
@@ -259,17 +244,6 @@ static bool HasAtHook()
*/
Reference< XInterface > SAL_CALL create_MSAAServiceImpl( Reference< XComponentContext > const & /*xContext*/ ) SAL_THROW( () )
{
- bool bRunWithoutAt = getenv("SAL_FORCE_IACCESSIBLE2");
-
- if ( !HasAtHook() )
- {
- if ( !bRunWithoutAt )
- {
- SAL_INFO("iacc2", "Apparently no running AT -> not enabling IAccessible2 integration");
- return Reference< XMSAAService >();
- }
- }
-
Reference< XMSAAService > xAccMgr( new MSAAServiceImpl() );
AccessBridgeUpdateOldTopWindows( xAccMgr );
commit fabca7370e22f96ae041dc179475b35c87ac53ec
Author: Michael Stahl <mstahl at redhat.com>
Date: Fri Nov 29 22:39:33 2013 +0100
winaccessibility: remove global g_acc_manager
It is possible to retrieve it via the AccTopWindowListener.
Change-Id: I6cc5ab25bc937d0d9f4de54a1bed09a76ce27491
diff --git a/winaccessibility/inc/AccObjectManagerAgent.hxx b/winaccessibility/inc/AccObjectManagerAgent.hxx
index fd61c40..5aa9f81 100644
--- a/winaccessibility/inc/AccObjectManagerAgent.hxx
+++ b/winaccessibility/inc/AccObjectManagerAgent.hxx
@@ -20,9 +20,9 @@
#ifndef __ACCOBJECTMANAGERAGENT_HXX
#define __ACCOBJECTMANAGERAGENT_HXX
-#ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLE_HPP_
+#include <boost/scoped_ptr.hpp>
+
#include <com/sun/star/accessibility/XAccessible.hpp>
-#endif
struct IMAccessible;
struct IAccessible;
@@ -37,7 +37,7 @@ class AccObjectManagerAgent
{
private:
- AccObjectWinManager* pWinManager;
+ boost::scoped_ptr<AccObjectWinManager> pWinManager;
public:
@@ -96,6 +96,9 @@ public:
bool IsTopWinAcc( com::sun::star::accessibility::XAccessible* pXAcc );
bool IsStateManageDescendant(com::sun::star::accessibility::XAccessible* pXAcc);
+
+ sal_Int64 Get_ToATInterface(sal_Int64 hWnd, sal_Int64 lParam, sal_Int64 wParam);
+
};
#endif
diff --git a/winaccessibility/inc/AccObjectWinManager.hxx b/winaccessibility/inc/AccObjectWinManager.hxx
index f58a858..84bfca6 100644
--- a/winaccessibility/inc/AccObjectWinManager.hxx
+++ b/winaccessibility/inc/AccObjectWinManager.hxx
@@ -97,8 +97,6 @@ public:
void DeleteAccObj( com::sun::star::accessibility::XAccessible* pXAcc );
void DeleteChildrenAccObj(com::sun::star::accessibility::XAccessible* pAccObj);
- static AccObjectWinManager* CreateAccObjectWinManagerInstance(AccObjectManagerAgent* Agent);
-
sal_Bool NotifyAccEvent( com::sun::star::accessibility::XAccessible* pXAcc,short state = 0 );
LPARAM Get_ToATInterface(HWND hWnd, long lParam, WPARAM wParam);
diff --git a/winaccessibility/inc/AccTopWindowListener.hxx b/winaccessibility/inc/AccTopWindowListener.hxx
index 9babd67..2782320 100644
--- a/winaccessibility/inc/AccTopWindowListener.hxx
+++ b/winaccessibility/inc/AccTopWindowListener.hxx
@@ -59,6 +59,8 @@ public:
virtual void AddAllListeners(com::sun::star::accessibility::XAccessible* pAccessible,com::sun::star::accessibility::XAccessible* pParentXAcc,HWND pWND );
//for On-Demand load.
virtual void HandleWindowOpened( com::sun::star::accessibility::XAccessible* pAccessible );
+
+ sal_Int64 GetMSComPtr(sal_Int64 hWnd, sal_Int64 lParam, sal_Int64 wParam);
};
#endif
diff --git a/winaccessibility/inc/g_msacc.hxx b/winaccessibility/inc/g_msacc.hxx
deleted file mode 100644
index b9670cf..0000000
--- a/winaccessibility/inc/g_msacc.hxx
+++ /dev/null
@@ -1,27 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#ifndef __G_MSACC_HXX
-#define __G_MSACC_HXX
-
-extern sal_Int64 GetMSComPtr(sal_Int64 hWnd, sal_Int64 lParam, sal_Int64 wParam);
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/winaccessibility/source/service/AccObjectManagerAgent.cxx b/winaccessibility/source/service/AccObjectManagerAgent.cxx
index 1c76360..d4f4dab 100644
--- a/winaccessibility/source/service/AccObjectManagerAgent.cxx
+++ b/winaccessibility/source/service/AccObjectManagerAgent.cxx
@@ -30,19 +30,13 @@ using namespace com::sun::star::accessibility;
* @param
* @return
*/
-AccObjectManagerAgent::AccObjectManagerAgent():
- pWinManager(NULL)
+AccObjectManagerAgent::AccObjectManagerAgent()
+ : pWinManager(new AccObjectWinManager(this))
{
- if( pWinManager == NULL )
- {
- pWinManager = AccObjectWinManager::CreateAccObjectWinManagerInstance(this);
- }
}
AccObjectManagerAgent::~AccObjectManagerAgent()
{
- delete pWinManager;
- pWinManager = NULL;
}
/**
@@ -388,4 +382,16 @@ bool AccObjectManagerAgent::IsStateManageDescendant(XAccessible* pXAcc)
return false;
}
+/**
+ * Implementation of interface XMSAAService's method getAccObjectPtr()
+ * that returns the corresponding COM interface with the MS event.
+ * @return Com interface.
+ */
+sal_Int64 AccObjectManagerAgent::Get_ToATInterface(
+ sal_Int64 hWnd, sal_Int64 lParam, sal_Int64 wParam)
+{
+ return static_cast<sal_Int64>(pWinManager->Get_ToATInterface(
+ static_cast<HWND>(reinterpret_cast<void*>(hWnd)), lParam, wParam));
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/winaccessibility/source/service/AccObjectWinManager.cxx b/winaccessibility/source/service/AccObjectWinManager.cxx
index cd51b7e..779f201 100644
--- a/winaccessibility/source/service/AccObjectWinManager.cxx
+++ b/winaccessibility/source/service/AccObjectWinManager.cxx
@@ -53,23 +53,6 @@ using namespace com::sun::star::accessibility::AccessibleRole;
using namespace com::sun::star::accessibility::AccessibleStateType;
using namespace com::sun::star::uno;
-AccObjectWinManager* g_acc_manager = NULL;
-
-/**
- * Implementation of interface XMSAAService's method getAccObjectPtr() that return the
- * corresponding com interface with the MS event.
- *
- * @param
- * @return Com interface.
- */
-sal_Int64 GetMSComPtr(sal_Int64 hWnd, sal_Int64 lParam, sal_Int64 wParam)
-{
- if (!g_acc_manager)
- return 0;
- return static_cast<sal_Int64>(g_acc_manager->Get_ToATInterface(
- static_cast<HWND>(reinterpret_cast<void*>(hWnd)), lParam, wParam));
-}
-
/**
* constructor
* @param Agent The agent kept in all listeners,it's the sole interface by which
@@ -89,22 +72,6 @@ AccObjectWinManager::AccObjectWinManager( AccObjectManagerAgent* Agent ):
}
/**
- * Public method to produce manager
- * @param Agent The agent kept in all listeners,it's the sole interface by which
- * listener communicate with windows manager.
- * @return
- */
-AccObjectWinManager* AccObjectWinManager::CreateAccObjectWinManagerInstance( AccObjectManagerAgent* Agent )
-{
- if (!g_acc_manager)
- {
- g_acc_manager = new AccObjectWinManager( Agent );
- }
- return g_acc_manager;
-}
-
-
-/**
* Destructor,clear all resource.
* @param
* @return
diff --git a/winaccessibility/source/service/AccTopWindowListener.cxx b/winaccessibility/source/service/AccTopWindowListener.cxx
index ca8a1c0..db87f23 100644
--- a/winaccessibility/source/service/AccTopWindowListener.cxx
+++ b/winaccessibility/source/service/AccTopWindowListener.cxx
@@ -255,4 +255,10 @@ void AccTopWindowListener::disposing( const ::com::sun::star::lang::EventObject&
{
}
+sal_Int64 AccTopWindowListener::GetMSComPtr(
+ sal_Int64 hWnd, sal_Int64 lParam, sal_Int64 wParam)
+{
+ return accManagerAgent.Get_ToATInterface(hWnd, lParam, wParam);
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/winaccessibility/source/service/msaaservice_impl.cxx b/winaccessibility/source/service/msaaservice_impl.cxx
index 950ef9b..219eaee 100644
--- a/winaccessibility/source/service/msaaservice_impl.cxx
+++ b/winaccessibility/source/service/msaaservice_impl.cxx
@@ -42,7 +42,6 @@ using namespace ::com::sun::star::accessibility;
using namespace ::com::sun::star::awt;
#include "AccTopWindowListener.hxx"
-#include "g_msacc.hxx"
namespace my_sc_impl
{
@@ -96,7 +95,11 @@ throw (RuntimeException)
{
SolarMutexGuard g;
- return GetMSComPtr( hWnd, lParam, wParam );
+ if (!m_pTopWindowListener.is())
+ {
+ return 0;
+ }
+ return m_pTopWindowListener->GetMSComPtr(hWnd, lParam, wParam);
}
/**
commit b54d441ad728ffce8e543de10bd897f0900422b5
Author: Michael Stahl <mstahl at redhat.com>
Date: Fri Nov 29 21:43:42 2013 +0100
Revert "winaccessibility: let CoCreateInstance calls find the components"
This only works partially: the ClassObjects are only registered on the
main thread; CoCreateInstance on other threads still fails.
This reverts commit 29c6216af8c502f220bb84857d3dda901ddfd234.
diff --git a/winaccessibility/source/UAccCOM/UAccCOM.cxx b/winaccessibility/source/UAccCOM/UAccCOM.cxx
index 6a8a86b..4cf9f10 100644
--- a/winaccessibility/source/UAccCOM/UAccCOM.cxx
+++ b/winaccessibility/source/UAccCOM/UAccCOM.cxx
@@ -67,14 +67,10 @@ extern "C"
if (dwReason == DLL_PROCESS_ATTACH)
{
_Module.Init(ObjectMap, hInstance, &LIBID_UACCCOMLib);
- _Module.RegisterClassObjects(CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE);
DisableThreadLibraryCalls(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
- {
- _Module.RevokeClassObjects();
_Module.Term();
- }
return TRUE; // ok
}
diff --git a/winaccessibility/source/service/msaaservice_impl.cxx b/winaccessibility/source/service/msaaservice_impl.cxx
index 6dc1b25..950ef9b 100644
--- a/winaccessibility/source/service/msaaservice_impl.cxx
+++ b/winaccessibility/source/service/msaaservice_impl.cxx
@@ -267,14 +267,6 @@ Reference< XInterface > SAL_CALL create_MSAAServiceImpl( Reference< XComponentCo
}
}
- // load UAccCOM library so its DllMain can register its COM components
- static HMODULE h = LoadLibrary("UAccCOM.dll");
- if (!h)
- {
- assert(false);
- return 0;
- }
-
Reference< XMSAAService > xAccMgr( new MSAAServiceImpl() );
AccessBridgeUpdateOldTopWindows( xAccMgr );
commit d0e8e6e3cd51736583603e37f0ba2ff7bdf29f5c
Author: Michael Stahl <mstahl at redhat.com>
Date: Fri Nov 29 19:17:33 2013 +0100
winaccessibility: fix my stupid mistake in createAggInstance
Change-Id: I7701021befcf1dbad85557c2095fe4bf0b4e0ff1
diff --git a/winaccessibility/source/UAccCOM/MAccessible.cxx b/winaccessibility/source/UAccCOM/MAccessible.cxx
index 6e5f018..73897c4 100644
--- a/winaccessibility/source/UAccCOM/MAccessible.cxx
+++ b/winaccessibility/source/UAccCOM/MAccessible.cxx
@@ -2560,14 +2560,15 @@ BOOL CMAccessible::GetXInterfaceFromXAccessible(XAccessible* pXAcc, XInterface**
}
template<typename T> HRESULT
-createAggInstance(CMAccessible &rOuter, REFIID iid, void ** ppvObject)
+createAggInstance(CMAccessible &rOuter, void ** ppvObject)
{
-// return CComCreator< CComAggObject<T> >::CreateInstance(
-// XXX: do not use CComAggObject - the aggregation is hand-crafted!
-// the SmartQI method must not call itself recursively -
-// which it will do if CComAggObject redirects QueryInterface.
- return CComCreator< CComObject<T> >::CreateInstance(
- rOuter.GetControllingUnknown(), iid, ppvObject);
+ // Note: CComAggObject has special handling for IUnknown - must
+ // query for that when creating it! Otherwise we get a T member of it
+ // which will redirect QueryInterface back to CMAccessible infinitely.
+ // (CComAggObject has its own ref-count too which is not a problem
+ // since it is inserted in m_containedObjects.)
+ return CComCreator< CComAggObject<T> >::CreateInstance(
+ rOuter.GetControllingUnknown(), IID_IUnknown, ppvObject);
}
HRESULT WINAPI CMAccessible::SmartQI(void* /*pv*/, REFIID iid, void** ppvObject)
@@ -2606,31 +2607,31 @@ HRESULT WINAPI CMAccessible::SmartQI(void* /*pv*/, REFIID iid, void** ppvObject)
switch (pMap->XIFIndex)
{
case XI_COMPONENT:
- hr = createAggInstance<CAccComponent>(*this, iid, ppvObject);
+ hr = createAggInstance<CAccComponent>(*this, ppvObject);
break;
case XI_TEXT:
- hr = createAggInstance<CAccText>(*this, iid, ppvObject);
+ hr = createAggInstance<CAccText>(*this, ppvObject);
break;
case XI_EDITABLETEXT:
- hr = createAggInstance<CAccEditableText>(*this, iid, ppvObject);
+ hr = createAggInstance<CAccEditableText>(*this, ppvObject);
break;
case XI_IMAGE:
- hr = createAggInstance<CAccImage>(*this, iid, ppvObject);
+ hr = createAggInstance<CAccImage>(*this, ppvObject);
break;
case XI_TABLE:
- hr = createAggInstance<CAccTable>(*this, iid, ppvObject);
+ hr = createAggInstance<CAccTable>(*this, ppvObject);
break;
case XI_ACTION:
- hr = createAggInstance<CAccAction>(*this, iid, ppvObject);
+ hr = createAggInstance<CAccAction>(*this, ppvObject);
break;
case XI_VALUE:
- hr = createAggInstance<CAccValue>(*this, iid, ppvObject);
+ hr = createAggInstance<CAccValue>(*this, ppvObject);
break;
case XI_HYPERTEXT:
- hr = createAggInstance<CAccHypertext>(*this, iid, ppvObject);
+ hr = createAggInstance<CAccHypertext>(*this, ppvObject);
break;
case XI_HYPERLINK:
- hr = createAggInstance<CAccHyperLink>(*this, iid, ppvObject);
+ hr = createAggInstance<CAccHyperLink>(*this, ppvObject);
break;
default:
assert(false);
commit db214684057e3ff2fa32d57c00507309dd6c24d6
Author: Michael Stahl <mstahl at redhat.com>
Date: Thu Nov 28 20:12:12 2013 +0100
vcl: fix crashes when retrieving objects for MSAA
The ImplHandleGetObject() function modifies the Application Settings and
must take the SolarMutex for this; otherwise we get crashes when another
thread calls StyleSettings::GetPersonaHeader() during some unoapi test.
Also fix another HWND to long cast; use LRESULT which is Win32 for intptr_t.
Change-Id: I5580f88ed0a8e9955697655ace94584e2307982d
diff --git a/vcl/win/source/window/salframe.cxx b/vcl/win/source/window/salframe.cxx
index 8ee2cae..913d539 100644
--- a/vcl/win/source/window/salframe.cxx
+++ b/vcl/win/source/window/salframe.cxx
@@ -5484,7 +5484,8 @@ static void ImplHandleIMENotify( HWND hWnd, WPARAM wParam )
// -----------------------------------------------------------------------
-static bool ImplHandleGetObject( HWND hWnd, LPARAM lParam, WPARAM wParam, long &nRet )
+static bool
+ImplHandleGetObject(HWND hWnd, LPARAM lParam, WPARAM wParam, LRESULT & nRet)
{
// IA2 should be enabled automatically
AllSettings aSettings = Application::GetSettings();
@@ -5514,7 +5515,8 @@ static bool ImplHandleGetObject( HWND hWnd, LPARAM lParam, WPARAM wParam, long &
// mhOnSetTitleWnd not set to reasonable value anywhere...
if ( lParam == OBJID_CLIENT )
{
- nRet = xMSAA->getAccObjectPtr( (long)hWnd, lParam, wParam );
+ nRet = xMSAA->getAccObjectPtr(
+ reinterpret_cast<sal_Int64>(hWnd), lParam, wParam);
if( nRet != 0 )
return true;
}
@@ -6053,12 +6055,12 @@ LRESULT CALLBACK SalFrameWndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lP
break;
case WM_GETOBJECT:
- long nRet;
+ ImplSalYieldMutexAcquireWithWait();
if ( ImplHandleGetObject( hWnd, lParam, wParam, nRet ) )
{
rDef = false;
- return (HRESULT) nRet;
}
+ ImplSalYieldMutexRelease();
break;
case WM_APPCOMMAND:
More information about the Libreoffice-commits
mailing list