[PATCH 1/2] oleacc: Add Client_get_accFocus implementation.
Piotr Caban
piotr.caban at gmail.com
Fri Sep 17 13:00:34 CDT 2021
Hi Connor,
On 9/17/21 6:37 PM, Connor McAdams wrote:
> @@ -306,8 +306,26 @@ static HRESULT WINAPI Client_get_accKeyboardShortcut(IAccessible *iface,
> static HRESULT WINAPI Client_get_accFocus(IAccessible *iface, VARIANT *pvarID)
> {
> Client *This = impl_from_Client(iface);
> - FIXME("(%p)->(%p)\n", This, pvarID);
> - return E_NOTIMPL;
> + GUITHREADINFO info;
> +
> + TRACE("(%p)->(%p)\n", This, pvarID);
> +
> + V_VT(pvarID) = VT_EMPTY;
> + info.cbSize = sizeof(info);
> + if(GetGUIThreadInfo(0, &info) && info.hwndFocus) {
> + if(info.hwndFocus == This->hwnd) {
> + V_VT(pvarID) = VT_I4;
> + V_I4(pvarID) = CHILDID_SELF;
> + }
> + else if(IsChild(This->hwnd, info.hwndFocus)) {
> + V_VT(pvarID) = VT_DISPATCH;
> + if(FAILED(AccessibleObjectFromWindow(info.hwndFocus, OBJID_WINDOW,
> + &IID_IDispatch, (void**)&V_DISPATCH(pvarID))))
> + V_VT(pvarID) = VT_EMPTY;
The child case seems to be not right. You should propagate error from
AccessibleObjectFromWindow and check if returned interface pointer is
not NULL. It should probably look like this:
hr = AccessibleObjectFromWindow(info.hwndFocus, OBJID_WINDOW,
&IID_IDispatch, (void**)&disp);
if (FAILED(hr)) return hr;
if (!disp) return E_FAIL;
V_VT(pvarID) = VT_DISPATCH;
V_DISPATCH(pvarID) = disp;
It would be also nice to rename the pvarID argument to e.g. focus.
Thanks,
Piotr
More information about the wine-devel
mailing list