Fixing bug #2181, standard EDIT class extra value

Dmitry Timoshkov dmitry at codeweavers.com
Wed Oct 7 22:35:17 CDT 2009


"Julius Schwartzenberg" <julius.schwartzenberg at gmail.com> wrote:

> static const WCHAR editW[] = {'E','d','i','t',0};
> +#ifdef _WIN64
> +#define EDIT_EXTRA_VALUE sizeof(EDITSTATE *)
> +#else
> +#define EDIT_EXTRA_VALUE 6 /* This has to be 6 for 32-bit, otherwise Civilization II crashes, bug #2181  */
> +#endif
> const struct builtin_class_descr EDIT_builtin_class =
> {
>     editW,                /* name */
>     CS_DBLCLKS | CS_PARENTDC,   /* style */
>     EditWndProcA,         /* procA */
>     EditWndProcW,         /* procW */
> -    sizeof(EDITSTATE *),  /* extra */
> +    EDIT_EXTRA_VALUE,     /* extra */
>     IDC_IBEAM,            /* cursor */
>     0                     /* brush */
> };
> +#undef EDIT_EXTRA_VALUE

It would be cleaner IMHO to have it the following way:

#ifdef _WIN64
#define EDIT_EXTRA_VALUE 0
#else
#define EDIT_EXTRA_VALUE 2
#endif

const struct builtin_class_descr EDIT_builtin_class =
{
    editW,                /* name */
    CS_DBLCLKS | CS_PARENTDC,   /* style */
    EditWndProcA,         /* procA */
    EditWndProcW,         /* procW */
    sizeof(EDITSTATE *) + EDIT_EXTRA_VALUE,  /* extra */
...

and completely omit the comment about the bug #, but explain that there are
applications (Civilization II is one of them) that depend on having 2 extra
bytes in the extra class storage.

> +static void test_extra_value()
> +{
> +todo_wine {
> +    WNDCLASSEX cls;
> +    GetClassInfoEx(NULL,"Edit",&cls);
> +    #ifdef _WIN64
> +    ok(cls.cbWndExtra == 8, "expected 6, got %d\n", cls.cbWndExtra);
> +    #else
> +    ok(cls.cbWndExtra == 6, "expected 6, got %d\n", cls.cbWndExtra);
> +    #endif
> +}
> +}

You should check the return value of GetClassInfoEx() and put todo_wine
only around the failing ok() call (otherwise it will fail under 64-bit).

-- 
Dmitry.



More information about the wine-devel mailing list