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

Connor McAdams cmcadams at codeweavers.com
Wed Sep 22 15:12:36 CDT 2021


Signed-off-by: Connor McAdams <cmcadams at codeweavers.com>
---
 dlls/oleacc/client.c | 37 ++++++++++++++++++++++++++++++++++---
 1 file changed, 34 insertions(+), 3 deletions(-)

diff --git a/dlls/oleacc/client.c b/dlls/oleacc/client.c
index 99be7d9fa37..afa2aa5babd 100644
--- a/dlls/oleacc/client.c
+++ b/dlls/oleacc/client.c
@@ -25,6 +25,7 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(oleacc);
 
+typedef struct win_class_vtbl win_class_vtbl;
 typedef struct {
     IAccessible IAccessible_iface;
     IOleWindow IOleWindow_iface;
@@ -35,8 +36,14 @@ typedef struct {
     HWND hwnd;
     HWND enum_pos;
     INT role;
+
+    const win_class_vtbl *vtbl;
 } Client;
 
+struct win_class_vtbl {
+    HRESULT (*get_state)(Client *, INT *);
+};
+
 static inline Client* impl_from_Client(IAccessible *iface)
 {
     return CONTAINING_RECORD(iface, Client, IAccessible_iface);
@@ -252,6 +259,10 @@ static HRESULT WINAPI Client_get_accState(IAccessible *iface, VARIANT varID, VAR
         V_I4(pvarState) |= STATE_SYSTEM_FOCUSED;
     if(!(style & WS_VISIBLE))
         V_I4(pvarState) |= STATE_SYSTEM_INVISIBLE;
+
+    if (This->vtbl && This->vtbl->get_state)
+        return This->vtbl->get_state(This, &V_I4(pvarState));
+
     return S_OK;
 }
 
@@ -652,7 +663,7 @@ static const IEnumVARIANTVtbl ClientEnumVARIANTVtbl = {
 };
 
 static HRESULT create_class_object(HWND hwnd, const IID *iid, void **obj,
-        INT role)
+        INT role, const win_class_vtbl *vtbl)
 {
     Client *client;
     HRESULT hres;
@@ -671,6 +682,7 @@ static HRESULT create_class_object(HWND hwnd, const IID *iid, void **obj,
     client->hwnd = hwnd;
     client->enum_pos = 0;
     client->role = role;
+    client->vtbl = vtbl;
 
     hres = IAccessible_QueryInterface(&client->IAccessible_iface, iid, obj);
     IAccessible_Release(&client->IAccessible_iface);
@@ -679,10 +691,29 @@ static HRESULT create_class_object(HWND hwnd, const IID *iid, void **obj,
 
 HRESULT create_client_object(HWND hwnd, const IID *iid, void **obj)
 {
-    return create_class_object(hwnd, iid, obj, ROLE_SYSTEM_CLIENT);
+    return create_class_object(hwnd, iid, obj, ROLE_SYSTEM_CLIENT, NULL);
 }
 
+static HRESULT edit_get_state(Client *client, INT *state)
+{
+    LONG style;
+
+    TRACE("(%p, %p)\n", client, state);
+
+    style = GetWindowLongW(client->hwnd, GWL_STYLE);
+    if(style & ES_READONLY)
+        *state |= STATE_SYSTEM_READONLY;
+    if(style & ES_PASSWORD)
+        *state |= STATE_SYSTEM_PROTECTED;
+
+    return S_OK;
+}
+
+const win_class_vtbl edit_class_vtbl = {
+    edit_get_state,
+};
+
 HRESULT create_edit_client_object(HWND hwnd, const IID *iid, void **obj)
 {
-    return create_class_object(hwnd, iid, obj, ROLE_SYSTEM_TEXT);
+    return create_class_object(hwnd, iid, obj, ROLE_SYSTEM_TEXT, &edit_class_vtbl);
 }
-- 
2.25.1




More information about the wine-devel mailing list