From fb5f6c47202daad7b9aaae2d08c1518a79cf0829 Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Mon, 3 Oct 2016 20:43:00 +0200 Subject: [PATCH] Add wxACC_INVALID_ARG error code to wxAccStatus enum Since accessibility framework supports signaling E_INVALIDARG error, it would be good to have a corresponding flag indicating this error in wxAccessible functions. In response to wxACC_INVALID_ARG returned by wxAccessible functions, wxIAccessible should return E_INVALIDARG to the framework. --- docs/changes.txt | 2 ++ include/wx/access.h | 3 ++- interface/wx/access.h | 7 ++++++- src/msw/ole/access.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 146bae0b54..df81f930fb 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -137,6 +137,8 @@ wxMSW: - Fix wxMemoryDC::Blit() with itself as source (Tim Roberts). - Return proper value from wxIAccessible::get_accSelection() if no children are selected. +- Add wxAccStatus::wxACC_INVALID_ARG error code to indicate argument-related + errors in wxAccessible methods. wxOSX: diff --git a/include/wx/access.h b/include/wx/access.h index 7eb041730b..4948969209 100644 --- a/include/wx/access.h +++ b/include/wx/access.h @@ -27,7 +27,8 @@ enum wxAccStatus wxACC_FALSE, wxACC_OK, wxACC_NOT_IMPLEMENTED, - wxACC_NOT_SUPPORTED + wxACC_NOT_SUPPORTED, + wxACC_INVALID_ARG }; // Child ids are integer identifiers from 1 up. diff --git a/interface/wx/access.h b/interface/wx/access.h index 91c14f0db4..609085c453 100644 --- a/interface/wx/access.h +++ b/interface/wx/access.h @@ -16,7 +16,12 @@ enum wxAccStatus wxACC_FALSE, //!< The function returned false. wxACC_OK, //!< The function completed successfully. wxACC_NOT_IMPLEMENTED, //!< The function is not implemented. - wxACC_NOT_SUPPORTED //!< The function is not supported. + wxACC_NOT_SUPPORTED, //!< The function is not supported. + /** + An argument is not valid (e.g. it does not make sense + for the specified object). + */ + wxACC_INVALID_ARG }; diff --git a/src/msw/ole/access.cpp b/src/msw/ole/access.cpp index 6036317d96..fb3584da15 100644 --- a/src/msw/ole/access.cpp +++ b/src/msw/ole/access.cpp @@ -385,6 +385,8 @@ STDMETHODIMP wxIAccessible::accHitTest(long xLeft, long yLeft, VARIANT* pVarID) if (status == wxACC_FAIL) return E_FAIL; + if (status == wxACC_INVALID_ARG) + return E_INVALIDARG; if (status == wxACC_NOT_IMPLEMENTED) { @@ -451,6 +453,8 @@ STDMETHODIMP wxIAccessible::accLocation ( long* pxLeft, long* pyTop, long* pcxWi wxAccStatus status = m_pAccessible->GetLocation(rect, varID.lVal); if (status == wxACC_FAIL) return E_FAIL; + if (status == wxACC_INVALID_ARG) + return E_INVALIDARG; if (status == wxACC_NOT_IMPLEMENTED) { @@ -570,6 +574,12 @@ STDMETHODIMP wxIAccessible::accNavigate ( long navDir, VARIANT varStart, VARIANT return E_FAIL; } + if (status == wxACC_INVALID_ARG) + { + wxLogTrace(wxS("access"), wxS("Invalid argument passed to wxAccessible::Navigate")); + return E_INVALIDARG; + } + if (status == wxACC_FALSE) { wxLogTrace(wxT("access"), wxT("wxAccessible::Navigate found no object in this direction")); @@ -670,6 +680,11 @@ STDMETHODIMP wxIAccessible::get_accChild ( VARIANT varChildID, IDispatch** ppDis wxLogTrace(wxT("access"), wxT("GetChild failed")); return E_FAIL; } + if (status == wxACC_INVALID_ARG) + { + wxLogTrace(wxS("access"), wxS("Invalid argument passed to GetChild")); + return E_INVALIDARG; + } if (status == wxACC_NOT_IMPLEMENTED) { @@ -844,6 +859,9 @@ STDMETHODIMP wxIAccessible::accDoDefaultAction(VARIANT varID) if (status == wxACC_NOT_SUPPORTED) return DISP_E_MEMBERNOTFOUND; + if (status == wxACC_INVALID_ARG) + return E_INVALIDARG; + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -887,6 +905,9 @@ STDMETHODIMP wxIAccessible::get_accDefaultAction ( VARIANT varID, BSTR* pszDefau if (status == wxACC_FAIL) return E_FAIL; + if (status == wxACC_INVALID_ARG) + return E_INVALIDARG; + if (status == wxACC_NOT_SUPPORTED) return DISP_E_MEMBERNOTFOUND; @@ -946,6 +967,8 @@ STDMETHODIMP wxIAccessible::get_accDescription ( VARIANT varID, BSTR* pszDescrip wxAccStatus status = m_pAccessible->GetDescription(varID.lVal, & description); if (status == wxACC_FAIL) return E_FAIL; + if (status == wxACC_INVALID_ARG) + return E_INVALIDARG; if (status == wxACC_NOT_IMPLEMENTED) { @@ -1003,6 +1026,8 @@ STDMETHODIMP wxIAccessible::get_accHelp ( VARIANT varID, BSTR* pszHelp) wxAccStatus status = m_pAccessible->GetHelpText(varID.lVal, & helpString); if (status == wxACC_FAIL) return E_FAIL; + if (status == wxACC_INVALID_ARG) + return E_INVALIDARG; if (status == wxACC_NOT_IMPLEMENTED) { @@ -1108,6 +1133,8 @@ STDMETHODIMP wxIAccessible::get_accKeyboardShortcut ( VARIANT varID, BSTR* pszKe wxAccStatus status = m_pAccessible->GetKeyboardShortcut(varID.lVal, & keyboardShortcut); if (status == wxACC_FAIL) return E_FAIL; + if (status == wxACC_INVALID_ARG) + return E_INVALIDARG; if (status == wxACC_NOT_IMPLEMENTED) { @@ -1170,6 +1197,9 @@ STDMETHODIMP wxIAccessible::get_accName ( VARIANT varID, BSTR* pszName) if (status == wxACC_FAIL) return E_FAIL; + if (status == wxACC_INVALID_ARG) + return E_INVALIDARG; + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -1223,6 +1253,9 @@ STDMETHODIMP wxIAccessible::get_accRole ( VARIANT varID, VARIANT* pVarRole) if (status == wxACC_FAIL) return E_FAIL; + if (status == wxACC_INVALID_ARG) + return E_INVALIDARG; + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -1279,6 +1312,8 @@ STDMETHODIMP wxIAccessible::get_accState ( VARIANT varID, VARIANT* pVarState) wxAccStatus status = m_pAccessible->GetState(varID.lVal, & wxstate); if (status == wxACC_FAIL) return E_FAIL; + if (status == wxACC_INVALID_ARG) + return E_INVALIDARG; if (status == wxACC_NOT_IMPLEMENTED) { @@ -1332,6 +1367,9 @@ STDMETHODIMP wxIAccessible::get_accValue ( VARIANT varID, BSTR* pszValue) if (status == wxACC_FAIL) return E_FAIL; + if (status == wxACC_INVALID_ARG) + return E_INVALIDARG; + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -1382,6 +1420,8 @@ STDMETHODIMP wxIAccessible::accSelect ( long flagsSelect, VARIANT varID ) wxAccStatus status = m_pAccessible->Select(varID.lVal, wxsel); if (status == wxACC_FAIL) return E_FAIL; + if (status == wxACC_INVALID_ARG) + return E_INVALIDARG; if (status == wxACC_NOT_IMPLEMENTED) {