[PATCH 2/7] oleacc: Add get_state function for edit client accessible object.
Piotr Caban
piotr.caban at gmail.com
Wed Sep 22 12:19:44 CDT 2021
Hi Connor,
On 9/22/21 6:20 PM, Connor McAdams wrote:
> +typedef struct {
> + HRESULT (*get_state)(IAccessible *, VARIANT, VARIANT *);
> +} WinClassVtbl;
I think it's better to pass Client* as first argument. Please also avoid
camel-case in new code.
> -static HRESULT WINAPI Client_get_accState(IAccessible *iface, VARIANT varID, VARIANT *pvarState)
> +static void default_client_get_state(IAccessible *iface, VARIANT *var_state)
> {
> Client *This = impl_from_Client(iface);
> GUITHREADINFO info;
> LONG style;
>
> - TRACE("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pvarState);
> -
> - if(convert_child_id(&varID) != CHILDID_SELF) {
> - V_VT(pvarState) = VT_EMPTY;
> - return E_INVALIDARG;
> - }
> -
> - V_VT(pvarState) = VT_I4;
> - V_I4(pvarState) = 0;
> + V_VT(var_state) = VT_I4;
> + V_I4(var_state) = 0;
>
> style = GetWindowLongW(This->hwnd, GWL_STYLE);
> if(style & WS_DISABLED)
> - V_I4(pvarState) |= STATE_SYSTEM_UNAVAILABLE;
> + V_I4(var_state) |= STATE_SYSTEM_UNAVAILABLE;
> else if(IsWindow(This->hwnd))
> - V_I4(pvarState) |= STATE_SYSTEM_FOCUSABLE;
> + V_I4(var_state) |= STATE_SYSTEM_FOCUSABLE;
>
> info.cbSize = sizeof(info);
> if(GetGUIThreadInfo(0, &info) && info.hwndFocus == This->hwnd)
> - V_I4(pvarState) |= STATE_SYSTEM_FOCUSED;
> + V_I4(var_state) |= STATE_SYSTEM_FOCUSED;
> if(!(style & WS_VISIBLE))
> - V_I4(pvarState) |= STATE_SYSTEM_INVISIBLE;
> + V_I4(var_state) |= STATE_SYSTEM_INVISIBLE;
> +}
> +
> +static HRESULT WINAPI Client_get_accState(IAccessible *iface, VARIANT varID, VARIANT *pvarState)
> +{
> + Client *This = impl_from_Client(iface);
> +
> + TRACE("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pvarState);
> +
> + if (This->vtbl.get_state)
> + return This->vtbl.get_state(iface, varID, pvarState);
> +
> + if(convert_child_id(&varID) != CHILDID_SELF) {
> + V_VT(pvarState) = VT_EMPTY;
> + return E_INVALIDARG;
> + }
> +
> + default_client_get_state(iface, pvarState);
> +
> return S_OK;
> }
Isn't it enough to call vtbl.get_state near the end of the function? I'm
asking about something along these lines (I've also changed get_state
header):
static HRESULT WINAPI Client_get_accState(IAccessible *iface, VARIANT
varID, VARIANT *pvarState)
{
...
info.cbSize = sizeof(info);
if(GetGUIThreadInfo(0, &info) && info.hwndFocus == This->hwnd)
V_I4(pvarState) |= STATE_SYSTEM_FOCUSED;
if(!(style & WS_VISIBLE))
V_I4(pvarState) |= STATE_SYSTEM_INVISIBLE;
if(This->vtbl.get_state)
return This->vtbl.get_state(This, &V_I4(pvarState))
return S_OK;
}
Thanks,
Piotr
More information about the wine-devel
mailing list