[PATCH 2/7] oleacc: Add get_state function for edit client accessible object.
Connor McAdams
cmcadams at codeweavers.com
Wed Sep 22 11:20:51 CDT 2021
Signed-off-by: Connor McAdams <cmcadams at codeweavers.com>
---
dlls/oleacc/client.c | 69 +++++++++++++++++++++++++++++++++++---------
1 file changed, 55 insertions(+), 14 deletions(-)
diff --git a/dlls/oleacc/client.c b/dlls/oleacc/client.c
index 5f702d0135b..043d98d93cc 100644
--- a/dlls/oleacc/client.c
+++ b/dlls/oleacc/client.c
@@ -25,6 +25,10 @@
WINE_DEFAULT_DEBUG_CHANNEL(oleacc);
+typedef struct {
+ HRESULT (*get_state)(IAccessible *, VARIANT, VARIANT *);
+} WinClassVtbl;
+
typedef struct {
IAccessible IAccessible_iface;
IOleWindow IOleWindow_iface;
@@ -35,6 +39,8 @@ typedef struct {
HWND hwnd;
HWND enum_pos;
INT role;
+
+ WinClassVtbl vtbl;
} Client;
static inline Client* impl_from_Client(IAccessible *iface)
@@ -225,33 +231,44 @@ static HRESULT WINAPI Client_get_accRole(IAccessible *iface, VARIANT varID, VARI
return S_OK;
}
-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;
}
@@ -676,6 +693,29 @@ HRESULT create_client_object(HWND hwnd, const IID *iid, void **obj)
return hres;
}
+static HRESULT edit_get_state(IAccessible *iface, VARIANT var_id, VARIANT *out_state)
+{
+ Client *This = impl_from_Client(iface);
+ LONG style;
+
+ TRACE("(%p)->(%s %p)\n", This, debugstr_variant(&var_id), out_state);
+
+ if(convert_child_id(&var_id) != CHILDID_SELF) {
+ V_VT(out_state) = VT_EMPTY;
+ return E_INVALIDARG;
+ }
+
+ default_client_get_state(iface, out_state);
+
+ style = GetWindowLongW(This->hwnd, GWL_STYLE);
+ if(style & ES_READONLY)
+ V_I4(out_state) |= STATE_SYSTEM_READONLY;
+ if(style & ES_PASSWORD)
+ V_I4(out_state) |= STATE_SYSTEM_PROTECTED;
+
+ return S_OK;
+}
+
HRESULT create_edit_client_object(HWND hwnd, const IID *iid, void **obj)
{
IAccessible *acc;
@@ -687,6 +727,7 @@ HRESULT create_edit_client_object(HWND hwnd, const IID *iid, void **obj)
client = impl_from_Client(acc);
client->role = ROLE_SYSTEM_TEXT;
+ client->vtbl.get_state = &edit_get_state;
hres = IAccessible_QueryInterface(acc, iid, obj);
IAccessible_Release(acc);
--
2.25.1
More information about the wine-devel
mailing list