Piotr Caban : oleacc: Prepare CreateStdAccessibleObject to support class specific accessibility objects.

Alexandre Julliard julliard at winehq.org
Fri May 16 12:13:58 CDT 2014


Module: wine
Branch: master
Commit: e73bbd0c810332f0eef93bd3d44149a82115edfd
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e73bbd0c810332f0eef93bd3d44149a82115edfd

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri May 16 16:37:03 2014 +0200

oleacc: Prepare CreateStdAccessibleObject to support class specific accessibility objects.

---

 dlls/oleacc/main.c |  100 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 97 insertions(+), 3 deletions(-)

diff --git a/dlls/oleacc/main.c b/dlls/oleacc/main.c
index 9d5320e..c7a622b 100644
--- a/dlls/oleacc/main.c
+++ b/dlls/oleacc/main.c
@@ -24,6 +24,7 @@
 #include "windef.h"
 #include "winbase.h"
 #include "ole2.h"
+#include "commctrl.h"
 
 #include "initguid.h"
 #include "oleacc_private.h"
@@ -36,6 +37,54 @@ WINE_DEFAULT_DEBUG_CHANNEL(oleacc);
 
 static const WCHAR lresult_atom_prefix[] = {'w','i','n','e','_','o','l','e','a','c','c',':'};
 
+static const WCHAR menuW[] = {'#','3','2','7','6','8',0};
+static const WCHAR desktopW[] = {'#','3','2','7','6','9',0};
+static const WCHAR dialogW[] = {'#','3','2','7','7','0',0};
+static const WCHAR winswitchW[] = {'#','3','2','7','7','1',0};
+static const WCHAR mdi_clientW[] = {'M','D','I','C','l','i','e','n','t',0};
+static const WCHAR richeditW[] = {'R','I','C','H','E','D','I','T',0};
+static const WCHAR richedit20aW[] = {'R','i','c','h','E','d','i','t','2','0','A',0};
+static const WCHAR richedit20wW[] = {'R','i','c','h','E','d','i','t','2','0','W',0};
+
+typedef HRESULT (WINAPI *accessible_create)(HWND, const IID*, void**);
+
+static struct {
+    const WCHAR *name;
+    DWORD idx;
+    accessible_create create_client;
+    accessible_create create_window;
+} builtin_classes[] = {
+    {WC_LISTBOXW,           0x10000, NULL, NULL},
+    {menuW,                 0x10001, NULL, NULL},
+    {WC_BUTTONW,            0x10002, NULL, NULL},
+    {WC_STATICW,            0x10003, NULL, NULL},
+    {WC_EDITW,              0x10004, NULL, NULL},
+    {WC_COMBOBOXW,          0x10005, NULL, NULL},
+    {dialogW,               0x10006, NULL, NULL},
+    {winswitchW,            0x10007, NULL, NULL},
+    {mdi_clientW,           0x10008, NULL, NULL},
+    {desktopW,              0x10009, NULL, NULL},
+    {WC_SCROLLBARW,         0x1000a, NULL, NULL},
+    {STATUSCLASSNAMEW,      0x1000b, NULL, NULL},
+    {TOOLBARCLASSNAMEW,     0x1000c, NULL, NULL},
+    {PROGRESS_CLASSW,       0x1000d, NULL, NULL},
+    {ANIMATE_CLASSW,        0x1000e, NULL, NULL},
+    {WC_TABCONTROLW,        0x1000f, NULL, NULL},
+    {HOTKEY_CLASSW,         0x10010, NULL, NULL},
+    {WC_HEADERW,            0x10011, NULL, NULL},
+    {TRACKBAR_CLASSW,       0x10012, NULL, NULL},
+    {WC_LISTVIEWW,          0x10013, NULL, NULL},
+    {UPDOWN_CLASSW,         0x10016, NULL, NULL},
+    {TOOLTIPS_CLASSW,       0x10018, NULL, NULL},
+    {WC_TREEVIEWW,          0x10019, NULL, NULL},
+    {MONTHCAL_CLASSW,       0,       NULL, NULL},
+    {DATETIMEPICK_CLASSW,   0,       NULL, NULL},
+    {WC_IPADDRESSW,         0,       NULL, NULL},
+    {richeditW,             0x1001c, NULL, NULL},
+    {richedit20aW,          0,       NULL, NULL},
+    {richedit20wW,          0,       NULL, NULL},
+};
+
 static HINSTANCE oleacc_handle = 0;
 
 const char *debugstr_variant(const VARIANT *v)
@@ -81,20 +130,65 @@ int convert_child_id(VARIANT *v)
     }
 }
 
+static accessible_create get_builtin_accessible_obj(HWND hwnd, LONG objid)
+{
+    WCHAR class_name[64];
+    int i, idx;
+
+    if(!RealGetWindowClassW(hwnd, class_name, sizeof(class_name)/sizeof(WCHAR)))
+        return NULL;
+    TRACE("got window class: %s\n", debugstr_w(class_name));
+
+    for(i=0; i<sizeof(builtin_classes)/sizeof(builtin_classes[0]); i++) {
+        if(!strcmpiW(class_name, builtin_classes[i].name)) {
+            accessible_create ret;
+
+            ret = (objid==OBJID_CLIENT ?
+                    builtin_classes[i].create_client :
+                    builtin_classes[i].create_window);
+            if(!ret)
+                FIXME("unhandled window class: %s\n", debugstr_w(class_name));
+            return ret;
+        }
+    }
+
+    idx = SendMessageW(hwnd, WM_GETOBJECT, 0, OBJID_QUERYCLASSNAMEIDX);
+    if(idx) {
+        for(i=0; i<sizeof(builtin_classes)/sizeof(builtin_classes[0]); i++) {
+            if(idx == builtin_classes[i].idx) {
+                accessible_create ret;
+
+                ret = (objid==OBJID_CLIENT ?
+                        builtin_classes[i].create_client :
+                        builtin_classes[i].create_window);
+                if(!ret)
+                    FIXME("unhandled class name idx: %x\n", idx);
+                return ret;
+            }
+        }
+
+        WARN("unhandled class name idx: %x\n", idx);
+    }
+
+    return NULL;
+}
+
 HRESULT WINAPI CreateStdAccessibleObject( HWND hwnd, LONG idObject,
         REFIID riidInterface, void** ppvObject )
 {
-    WCHAR class_name[64];
+    accessible_create create;
 
     TRACE("%p %d %s %p\n", hwnd, idObject,
           debugstr_guid( riidInterface ), ppvObject );
-    if(GetClassNameW(hwnd, class_name, sizeof(class_name)/sizeof(WCHAR)))
-        FIXME("unhandled window class: %s\n", debugstr_w(class_name));
 
     switch(idObject) {
     case OBJID_CLIENT:
+        create = get_builtin_accessible_obj(hwnd, idObject);
+        if(create) return create(hwnd, riidInterface, ppvObject);
         return create_client_object(hwnd, riidInterface, ppvObject);
     case OBJID_WINDOW:
+        create = get_builtin_accessible_obj(hwnd, idObject);
+        if(create) return create(hwnd, riidInterface, ppvObject);
         return create_window_object(hwnd, riidInterface, ppvObject);
     default:
         FIXME("unhandled object id: %d\n", idObject);




More information about the wine-cvs mailing list