From: Connor McAdams Subject: [PATCH v2 1/2] oleacc: Implement AccessibleObjectFromEvent. Message-Id: <20210525021524.668244-1-cmcadams@codeweavers.com> Date: Mon, 24 May 2021 22:15:23 -0400 Signed-off-by: Connor McAdams --- dlls/oleacc/main.c | 52 +++++++++++++++++++++++++++++++++++++++++ dlls/oleacc/oleacc.spec | 2 +- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/dlls/oleacc/main.c b/dlls/oleacc/main.c index f6b66a8bcab..db05d9dac92 100644 --- a/dlls/oleacc/main.c +++ b/dlls/oleacc/main.c @@ -331,6 +331,58 @@ HRESULT WINAPI AccessibleObjectFromPoint( POINT ptScreen, IAccessible** ppacc, V return E_NOTIMPL; } +HRESULT WINAPI AccessibleObjectFromEvent( HWND hwnd, DWORD dwObjectID, DWORD dwChildID, + IAccessible** ppacc, VARIANT* pvarChild ) +{ + IAccessible *iface = NULL; + IDispatch *disp = NULL; + VARIANT vid; + HRESULT hr; + + TRACE("%p %d %d %p %p\n", hwnd, dwObjectID, dwChildID, ppacc, pvarChild); + + hr = AccessibleObjectFromWindow(hwnd, dwObjectID, &IID_IAccessible, (void **)&iface); + if (!SUCCEEDED(hr)) + return hr; + + *ppacc = iface; + VariantInit(&vid); + V_VT(&vid) = VT_I4; + V_I4(&vid) = dwChildID; + + /* + * FIXME: Should also probably handle the possibility that the child isn't + * an object itself. + */ + hr = IAccessible_get_accChild(iface, vid, &disp); + + /* + * If we fail to get a child with the given ChildID, we instead return the + * IAccessible interface we retrieved from AccessibleObjectFromWindow. + */ + if (SUCCEEDED(hr)) + { + hr = IDispatch_QueryInterface(disp, &IID_IAccessible, (void **)ppacc); + if (SUCCEEDED(hr)) + { + V_I4(&vid) = CHILDID_SELF; + IAccessible_Release(iface); + } + else + { + *ppacc = iface; + } + + IDispatch_Release(disp); + } + + VariantInit(pvarChild); + V_VT(pvarChild) = VT_I4; + V_I4(pvarChild) = V_I4(&vid); + + return S_OK; +} + HRESULT WINAPI AccessibleObjectFromWindow( HWND hwnd, DWORD dwObjectID, REFIID riid, void** ppvObject ) { diff --git a/dlls/oleacc/oleacc.spec b/dlls/oleacc/oleacc.spec index 4cff0b8effc..9ad6e915965 100644 --- a/dlls/oleacc/oleacc.spec +++ b/dlls/oleacc/oleacc.spec @@ -1,5 +1,5 @@ @ stdcall AccessibleChildren(ptr long long ptr ptr) -@ stub AccessibleObjectFromEvent +@ stdcall AccessibleObjectFromEvent(ptr long long ptr ptr) @ stdcall AccessibleObjectFromPoint(int64 ptr ptr) @ stdcall AccessibleObjectFromWindow(ptr long ptr ptr) @ stdcall CreateStdAccessibleObject(ptr long ptr ptr) -- 2.25.1