From: Piotr Caban Subject: Re: [PATCH 1/2] oleacc: Add Client_get_accFocus implementation. Message-Id: <14df7d0b-9d9b-179b-d1cb-28d32f826b16@gmail.com> Date: Fri, 17 Sep 2021 20:00:34 +0200 In-Reply-To: <20210917163724.3372582-1-cmcadams@codeweavers.com> References: <20210917163724.3372582-1-cmcadams@codeweavers.com> 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