[PATCH 2/7] oleacc: Add get_state function for edit client accessible object.

Connor McAdams cmcadams at codeweavers.com
Wed Sep 22 12:39:32 CDT 2021


On Wed, Sep 22, 2021 at 07:19:44PM +0200, Piotr Caban wrote:
> 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;
> }
>

Yeah, I see what you're saying. That makes more sense. I guess in my
mind, I was thinking of the functions in the vtbl as more of an
"override" instead of an extension.

> Thanks,
> Piotr

Thanks for the review!



More information about the wine-devel mailing list