From: Connor McAdams Subject: Re: [PATCH v2 1/2] oleacc: Implement AccessibleObjectFromEvent. Message-Id: <20210525162747.GA799854@connor-desktop> Date: Tue, 25 May 2021 12:27:47 -0400 In-Reply-To: <20210525021524.668244-1-cmcadams@codeweavers.com> References: <20210525021524.668244-1-cmcadams@codeweavers.com> On Mon, May 24, 2021 at 10:15:23PM -0400, Connor McAdams wrote: > 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 > This patch for now can be ignored, I've since figured out how the ChildID's are supposed to be treated if they aren't associated with an object, and am in the process of writing new tests to account for this.