[PATCH v4 1/8] oleacc: Reorganize class specific behaviour handling.

Piotr Caban piotr.caban at gmail.com
Mon Sep 27 09:17:01 CDT 2021


Hi Connor,

I've sent another version of these patches.

Changes:
  - added test for first patch, removed SysMonthCal32 from client list 
and dialog class from window list
  - some minor style tweaks
  - moved SendMessage calls to get_name and get_kbd_shortcut helpers

Thanks,
Piotr

On 9/24/21 10:52 PM, Connor McAdams wrote:
> From: Piotr Caban <piotr at codeweavers.com>
> 
> ---
> -v4: Restore previously deleted class check for default window object,
>   and add dialog window class to window object class table.
> 
>   dlls/oleacc/client.c         | 36 ++++++++++++++++
>   dlls/oleacc/main.c           | 82 +++++-------------------------------
>   dlls/oleacc/oleacc_private.h |  7 +++
>   dlls/oleacc/window.c         | 10 +++++
>   4 files changed, 63 insertions(+), 72 deletions(-)
> 
> diff --git a/dlls/oleacc/client.c b/dlls/oleacc/client.c
> index 93f6b590f78..333a95dc388 100644
> --- a/dlls/oleacc/client.c
> +++ b/dlls/oleacc/client.c
> @@ -19,6 +19,7 @@
>   #define COBJMACROS
>   
>   #include "oleacc_private.h"
> +#include "commctrl.h"
>   
>   #include "wine/debug.h"
>   #include "wine/heap.h"
> @@ -650,6 +651,39 @@ static const IEnumVARIANTVtbl ClientEnumVARIANTVtbl = {
>       Client_EnumVARIANT_Clone
>   };
>   
> +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_COMBOBOXW,          0x10005, TRUE},
> +    {L"#32770",             0x10006, TRUE}, /* dialog */
> +    {L"#32771",             0x10007, TRUE}, /* winswitcher */
> +    {L"MDIClient",          0x10008, TRUE},
> +    {L"#32769",             0x10009, TRUE}, /* desktop */
> +    {WC_SCROLLBARW,         0x1000a, TRUE},
> +    {STATUSCLASSNAMEW,      0x1000b, TRUE},
> +    {TOOLBARCLASSNAMEW,     0x1000c, TRUE},
> +    {PROGRESS_CLASSW,       0x1000d, TRUE},
> +    {ANIMATE_CLASSW,        0x1000e, TRUE},
> +    {WC_TABCONTROLW,        0x1000f, TRUE},
> +    {HOTKEY_CLASSW,         0x10010, TRUE},
> +    {WC_HEADERW,            0x10011, TRUE},
> +    {TRACKBAR_CLASSW,       0x10012, TRUE},
> +    {WC_LISTVIEWW,          0x10013, TRUE},
> +    {UPDOWN_CLASSW,         0x10016, TRUE},
> +    {TOOLTIPS_CLASSW,       0x10018, TRUE},
> +    {WC_TREEVIEWW,          0x10019, TRUE},
> +    {MONTHCAL_CLASSW,       0, TRUE},
> +    {DATETIMEPICK_CLASSW,   0, TRUE},
> +    {WC_IPADDRESSW,         0, TRUE},
> +    {L"RICHEDIT",           0x1001c, TRUE},
> +    {L"RichEdit20A",        0, TRUE},
> +    {L"RichEdit20W",        0, TRUE},
> +    {NULL}
> +};
> +
>   HRESULT create_client_object(HWND hwnd, const IID *iid, void **obj)
>   {
>       Client *client;
> @@ -662,6 +696,8 @@ HRESULT create_client_object(HWND hwnd, const IID *iid, void **obj)
>       if(!client)
>           return E_OUTOFMEMORY;
>   
> +    find_class_data(hwnd, classes);
> +
>       client->IAccessible_iface.lpVtbl = &ClientVtbl;
>       client->IOleWindow_iface.lpVtbl = &ClientOleWindowVtbl;
>       client->IEnumVARIANT_iface.lpVtbl = &ClientEnumVARIANTVtbl;
> diff --git a/dlls/oleacc/main.c b/dlls/oleacc/main.c
> index db9f646988c..3ce616ae0c1 100644
> --- a/dlls/oleacc/main.c
> +++ b/dlls/oleacc/main.c
> @@ -20,13 +20,6 @@
>   
>   #define COBJMACROS
>   
> -#include <stdarg.h>
> -#include "windef.h"
> -#include "winbase.h"
> -#include "ole2.h"
> -#include "commctrl.h"
> -#include "rpcproxy.h"
> -
>   #include "initguid.h"
>   #include "oleacc_private.h"
>   #include "resource.h"
> @@ -37,50 +30,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(oleacc);
>   
>   static const WCHAR lresult_atom_prefix[] = {'w','i','n','e','_','o','l','e','a','c','c',':'};
>   
> -typedef HRESULT (*accessible_create)(HWND, const IID*, void**);
> -
>   extern HRESULT WINAPI OLEACC_DllGetClassObject(REFCLSID, REFIID, void**) DECLSPEC_HIDDEN;
>   extern BOOL WINAPI OLEACC_DllMain(HINSTANCE, DWORD, void*) DECLSPEC_HIDDEN;
>   extern HRESULT WINAPI OLEACC_DllRegisterServer(void) DECLSPEC_HIDDEN;
>   extern HRESULT WINAPI OLEACC_DllUnregisterServer(void) DECLSPEC_HIDDEN;
>   
> -static struct {
> -    const WCHAR *name;
> -    DWORD idx;
> -    accessible_create create_client;
> -    accessible_create create_window;
> -} builtin_classes[] = {
> -    {WC_LISTBOXW,           0x10000, NULL, NULL},
> -    {L"#32768",             0x10001, NULL, NULL}, /* menu */
> -    {WC_BUTTONW,            0x10002, NULL, NULL},
> -    {WC_STATICW,            0x10003, NULL, NULL},
> -    {WC_EDITW,              0x10004, NULL, NULL},
> -    {WC_COMBOBOXW,          0x10005, NULL, NULL},
> -    {L"#32770",             0x10006, NULL, NULL}, /* dialog */
> -    {L"#32771",             0x10007, NULL, NULL}, /* winswitcher */
> -    {L"MDIClient",          0x10008, NULL, NULL},
> -    {L"#32769",             0x10009, NULL, NULL}, /* desktop */
> -    {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},
> -    {L"RICHEDIT",           0x1001c, NULL, NULL},
> -    {L"RichEdit20A",        0,       NULL, NULL},
> -    {L"RichEdit20W",        0,       NULL, NULL},
> -};
> -
>   static HINSTANCE oleacc_handle = 0;
>   
>   int convert_child_id(VARIANT *v)
> @@ -94,7 +48,7 @@ int convert_child_id(VARIANT *v)
>       }
>   }
>   
> -static accessible_create get_builtin_accessible_obj(HWND hwnd, LONG objid)
> +const struct win_class_data* find_class_data(HWND hwnd, const struct win_class_data *classes)
>   {
>       WCHAR class_name[64];
>       int i, idx;
> @@ -103,31 +57,21 @@ static accessible_create get_builtin_accessible_obj(HWND hwnd, LONG objid)
>           return NULL;
>       TRACE("got window class: %s\n", debugstr_w(class_name));
>   
> -    for(i=0; i<ARRAY_SIZE(builtin_classes); i++) {
> -        if(!wcsicmp(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)
> +    for(i=0; classes[i].name; i++) {
> +        if(!wcsicmp(class_name, classes[i].name)) {
> +            if(classes[i].stub)
>                   FIXME("unhandled window class: %s\n", debugstr_w(class_name));
> -            return ret;
> +            return &classes[i];
>           }
>       }
>   
>       idx = SendMessageW(hwnd, WM_GETOBJECT, 0, OBJID_QUERYCLASSNAMEIDX);
>       if(idx) {
> -        for(i=0; i<ARRAY_SIZE(builtin_classes); 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;
> +        for(i=0; classes[i].name; i++) {
> +            if(idx == classes[i].idx) {
> +                if(classes[i].stub)
> +                    FIXME("unhandled window class: %s\n", debugstr_w(class_name));
> +                return &classes[i];
>               }
>           }
>   
> @@ -140,19 +84,13 @@ static accessible_create get_builtin_accessible_obj(HWND hwnd, LONG objid)
>   HRESULT WINAPI CreateStdAccessibleObject( HWND hwnd, LONG idObject,
>           REFIID riidInterface, void** ppvObject )
>   {
> -    accessible_create create;
> -
>       TRACE("%p %d %s %p\n", hwnd, idObject,
>             debugstr_guid( riidInterface ), ppvObject );
>   
>       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);
> diff --git a/dlls/oleacc/oleacc_private.h b/dlls/oleacc/oleacc_private.h
> index 32561ef3d2f..64926b6abb7 100644
> --- a/dlls/oleacc/oleacc_private.h
> +++ b/dlls/oleacc/oleacc_private.h
> @@ -18,6 +18,13 @@
>   
>   #include "oleacc_classes.h"
>   
> +struct win_class_data {
> +    const WCHAR *name;
> +    DWORD idx;
> +    BOOL stub;
> +};
> +const struct win_class_data* find_class_data(HWND, const struct win_class_data*) DECLSPEC_HIDDEN;
> +
>   HRESULT create_client_object(HWND, const IID*, void**) DECLSPEC_HIDDEN;
>   HRESULT create_window_object(HWND, const IID*, void**) DECLSPEC_HIDDEN;
>   HRESULT get_accpropservices_factory(REFIID, void**) DECLSPEC_HIDDEN;
> diff --git a/dlls/oleacc/window.c b/dlls/oleacc/window.c
> index 387ed4bc9f7..75e5d592699 100644
> --- a/dlls/oleacc/window.c
> +++ b/dlls/oleacc/window.c
> @@ -19,6 +19,7 @@
>   #define COBJMACROS
>   
>   #include "oleacc_private.h"
> +#include "commctrl.h"
>   
>   #include "wine/debug.h"
>   #include "wine/heap.h"
> @@ -416,6 +417,13 @@ static const IEnumVARIANTVtbl WindowEnumVARIANTVtbl = {
>       Window_EnumVARIANT_Clone
>   };
>   
> +static const struct win_class_data classes[] = {
> +    {WC_LISTBOXW,           0x10000, TRUE},
> +    {L"#32768",             0x10001, TRUE}, /* menu */
> +    {L"#32770",             0x10006, TRUE}, /* dialog */
> +    {NULL}
> +};
> +
>   HRESULT create_window_object(HWND hwnd, const IID *iid, void **obj)
>   {
>       Window *window;
> @@ -428,6 +436,8 @@ HRESULT create_window_object(HWND hwnd, const IID *iid, void **obj)
>       if(!window)
>           return E_OUTOFMEMORY;
>   
> +    find_class_data(hwnd, classes);
> +
>       window->IAccessible_iface.lpVtbl = &WindowVtbl;
>       window->IOleWindow_iface.lpVtbl = &WindowOleWindowVtbl;
>       window->IEnumVARIANT_iface.lpVtbl = &WindowEnumVARIANTVtbl;
> 




More information about the wine-devel mailing list