Connor McAdams : oleacc: Add get_accRole implementation for edit client accessible object.

Alexandre Julliard julliard at winehq.org
Mon Sep 27 15:21:45 CDT 2021


Module: wine
Branch: master
Commit: 8db8c473e978f75daf5235d087137e6787fd3373
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8db8c473e978f75daf5235d087137e6787fd3373

Author: Connor McAdams <cmcadams at codeweavers.com>
Date:   Mon Sep 27 16:10:55 2021 +0200

oleacc: Add get_accRole implementation for edit client accessible object.

Signed-off-by: Connor McAdams <cmcadams at codeweavers.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/oleacc/client.c         | 32 ++++++++++++++++++++++++++++----
 dlls/oleacc/oleacc_private.h |  1 +
 2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/dlls/oleacc/client.c b/dlls/oleacc/client.c
index bb3d5641a08..fe9026e5bc1 100644
--- a/dlls/oleacc/client.c
+++ b/dlls/oleacc/client.c
@@ -26,6 +26,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,15 @@ typedef struct {
 
     HWND hwnd;
     HWND enum_pos;
+    INT role;
+
+    const win_class_vtbl *vtbl;
 } Client;
 
+struct win_class_vtbl {
+    void (*init)(Client*);
+};
+
 static inline Client* impl_from_Client(IAccessible *iface)
 {
     return CONTAINING_RECORD(iface, Client, IAccessible_iface);
@@ -221,7 +229,7 @@ static HRESULT WINAPI Client_get_accRole(IAccessible *iface, VARIANT varID, VARI
     }
 
     V_VT(pvarRole) = VT_I4;
-    V_I4(pvarRole) = ROLE_SYSTEM_CLIENT;
+    V_I4(pvarRole) = This->role;
     return S_OK;
 }
 
@@ -651,12 +659,21 @@ static const IEnumVARIANTVtbl ClientEnumVARIANTVtbl = {
     Client_EnumVARIANT_Clone
 };
 
+static void edit_init(Client *client)
+{
+    client->role = ROLE_SYSTEM_TEXT;
+}
+
+static const win_class_vtbl edit_vtbl = {
+    edit_init,
+};
+
 static const struct win_class_data classes[] = {
     {WC_LISTBOXW,           0x10000, TRUE},
     {L"#32768",             0x10001, TRUE}, /* menu */
     {WC_BUTTONW,            0x10002, TRUE},
     {WC_STATICW,            0x10003, TRUE},
-    {WC_EDITW,              0x10004, TRUE},
+    {WC_EDITW,              0x10004, FALSE, &edit_vtbl},
     {WC_COMBOBOXW,          0x10005, TRUE},
     {L"#32770",             0x10006, TRUE}, /* dialog */
     {L"#32771",             0x10007, TRUE}, /* winswitcher */
@@ -685,8 +702,9 @@ static const struct win_class_data classes[] = {
 
 HRESULT create_client_object(HWND hwnd, const IID *iid, void **obj)
 {
+    const struct win_class_data *data;
     Client *client;
-    HRESULT hres;
+    HRESULT hres = S_OK;
 
     if(!IsWindow(hwnd))
         return E_FAIL;
@@ -695,7 +713,7 @@ HRESULT create_client_object(HWND hwnd, const IID *iid, void **obj)
     if(!client)
         return E_OUTOFMEMORY;
 
-    find_class_data(hwnd, classes);
+    data = find_class_data(hwnd, classes);
 
     client->IAccessible_iface.lpVtbl = &ClientVtbl;
     client->IOleWindow_iface.lpVtbl = &ClientOleWindowVtbl;
@@ -703,6 +721,12 @@ HRESULT create_client_object(HWND hwnd, const IID *iid, void **obj)
     client->ref = 1;
     client->hwnd = hwnd;
     client->enum_pos = 0;
+    client->role = ROLE_SYSTEM_CLIENT;
+
+    if(data)
+        client->vtbl = data->vtbl;
+    if(client->vtbl && client->vtbl->init)
+        client->vtbl->init(client);
 
     hres = IAccessible_QueryInterface(&client->IAccessible_iface, iid, obj);
     IAccessible_Release(&client->IAccessible_iface);
diff --git a/dlls/oleacc/oleacc_private.h b/dlls/oleacc/oleacc_private.h
index 64926b6abb7..a01fc3615fe 100644
--- a/dlls/oleacc/oleacc_private.h
+++ b/dlls/oleacc/oleacc_private.h
@@ -22,6 +22,7 @@ struct win_class_data {
     const WCHAR *name;
     DWORD idx;
     BOOL stub;
+    const void *vtbl;
 };
 const struct win_class_data* find_class_data(HWND, const struct win_class_data*) DECLSPEC_HIDDEN;
 




More information about the wine-cvs mailing list