Fixed GetClassLong to return full 32 bits for all items.
Removed GCW_* definitions that don't exist in Win32.
diff --git a/windows/class.c b/windows/class.c
index 5bce63d..83998bc 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -48,7 +48,6 @@
HCURSOR hCursor; /* Default cursor */
HBRUSH hbrBackground; /* Default background */
ATOM atomName; /* Name of the class */
- LONG wExtra[1]; /* Class extra bytes */
} CLASS;
static CLASS *firstClass;
@@ -324,8 +323,7 @@
/* Create the class */
- classPtr = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof(CLASS) + classExtra - sizeof(classPtr->wExtra) );
+ classPtr = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CLASS) + classExtra );
if (!classPtr) return NULL;
classPtr->style = style;
classPtr->cbWndExtra = winExtra;
@@ -723,26 +721,23 @@
{
if (offset <= wndPtr->class->cbClsExtra - sizeof(WORD))
{
- retvalue = GET_WORD(((char *)wndPtr->class->wExtra) + offset);
+ retvalue = GET_WORD((char *)(wndPtr->class + 1) + offset);
goto END;
}
}
else switch(offset)
{
- case GCW_HBRBACKGROUND: retvalue = wndPtr->class->hbrBackground;
- goto END;
- case GCW_HCURSOR: retvalue = wndPtr->class->hCursor;
- goto END;
- case GCW_HICON: retvalue = wndPtr->class->hIcon;
- goto END;
- case GCW_HICONSM: retvalue = wndPtr->class->hIconSm;
- goto END;
- case GCW_ATOM: retvalue = wndPtr->class->atomName;
- goto END;
- case GCW_STYLE:
- case GCW_CBWNDEXTRA:
- case GCW_CBCLSEXTRA:
- case GCW_HMODULE:
+ case GCW_ATOM:
+ retvalue = wndPtr->class->atomName;
+ goto END;
+ case GCL_HBRBACKGROUND:
+ case GCL_HCURSOR:
+ case GCL_HICON:
+ case GCL_HICONSM:
+ case GCL_STYLE:
+ case GCL_CBWNDEXTRA:
+ case GCL_CBCLSEXTRA:
+ case GCL_HMODULE:
retvalue = (WORD)GetClassLongA( hwnd, offset );
goto END;
}
@@ -795,21 +790,37 @@
{
if (offset <= wndPtr->class->cbClsExtra - sizeof(LONG))
{
- retvalue = GET_DWORD(((char *)wndPtr->class->wExtra) + offset);
+ retvalue = GET_DWORD((char *)(wndPtr->class + 1) + offset);
goto END;
}
}
-
+
switch(offset)
{
- case GCL_STYLE: retvalue = (LONG)wndPtr->class->style;
- goto END;
- case GCL_CBWNDEXTRA: retvalue = (LONG)wndPtr->class->cbWndExtra;
- goto END;
- case GCL_CBCLSEXTRA: retvalue = (LONG)wndPtr->class->cbClsExtra;
- goto END;
- case GCL_HMODULE: retvalue = (LONG)wndPtr->class->hInstance;
- goto END;
+ case GCL_HBRBACKGROUND:
+ retvalue = (LONG)wndPtr->class->hbrBackground;
+ goto END;
+ case GCL_HCURSOR:
+ retvalue = (LONG)wndPtr->class->hCursor;
+ goto END;
+ case GCL_HICON:
+ retvalue = (LONG)wndPtr->class->hIcon;
+ goto END;
+ case GCL_HICONSM:
+ retvalue = (LONG)wndPtr->class->hIconSm;
+ goto END;
+ case GCL_STYLE:
+ retvalue = (LONG)wndPtr->class->style;
+ goto END;
+ case GCL_CBWNDEXTRA:
+ retvalue = (LONG)wndPtr->class->cbWndExtra;
+ goto END;
+ case GCL_CBCLSEXTRA:
+ retvalue = (LONG)wndPtr->class->cbClsExtra;
+ goto END;
+ case GCL_HMODULE:
+ retvalue = (LONG)wndPtr->class->hInstance;
+ goto END;
case GCL_WNDPROC:
retvalue = (LONG)CLASS_GetProc( wndPtr->class, WIN_PROC_32A );
goto END;
@@ -817,10 +828,6 @@
retvalue = (LONG)CLASS_GetMenuNameA( wndPtr->class );
goto END;
case GCW_ATOM:
- case GCL_HBRBACKGROUND:
- case GCL_HCURSOR:
- case GCL_HICON:
- case GCL_HICONSM:
retvalue = GetClassWord( hwnd, offset );
goto END;
}
@@ -884,7 +891,7 @@
if (offset >= 0)
{
if (offset + sizeof(WORD) <= wndPtr->class->cbClsExtra)
- ptr = ((char *)wndPtr->class->wExtra) + offset;
+ ptr = (char *)(wndPtr->class + 1) + offset;
else
{
WARN("Invalid offset %d\n", offset );
@@ -894,17 +901,19 @@
}
else switch(offset)
{
- case GCW_STYLE:
- case GCW_CBWNDEXTRA:
- case GCW_CBCLSEXTRA:
- case GCW_HMODULE:
+ case GCL_HBRBACKGROUND:
+ case GCL_HCURSOR:
+ case GCL_HICON:
+ case GCL_HICONSM:
+ case GCL_STYLE:
+ case GCL_CBWNDEXTRA:
+ case GCL_CBCLSEXTRA:
+ case GCL_HMODULE:
WIN_ReleaseWndPtr(wndPtr);
return (WORD)SetClassLongA( hwnd, offset, (LONG)newval );
- case GCW_HBRBACKGROUND: ptr = &wndPtr->class->hbrBackground; break;
- case GCW_HCURSOR: ptr = &wndPtr->class->hCursor; break;
- case GCW_HICON: ptr = &wndPtr->class->hIcon; break;
- case GCW_HICONSM: ptr = &wndPtr->class->hIconSm; break;
- case GCW_ATOM: ptr = &wndPtr->class->atomName; break;
+ case GCW_ATOM:
+ ptr = &wndPtr->class->atomName;
+ break;
default:
WARN("Invalid offset %d\n", offset);
WIN_ReleaseWndPtr(wndPtr);
@@ -957,7 +966,7 @@
if (offset >= 0)
{
if (offset + sizeof(LONG) <= wndPtr->class->cbClsExtra)
- ptr = ((char *)wndPtr->class->wExtra) + offset;
+ ptr = (char *)(wndPtr->class + 1) + offset;
else
{
WARN("Invalid offset %d\n", offset );
@@ -975,15 +984,32 @@
retval = (LONG)CLASS_SetProc( wndPtr->class, (WNDPROC)newval, WIN_PROC_32A );
goto END;
case GCL_HBRBACKGROUND:
+ ptr = &wndPtr->class->hbrBackground;
+ break;
case GCL_HCURSOR:
+ ptr = &wndPtr->class->hCursor;
+ break;
case GCL_HICON:
+ ptr = &wndPtr->class->hIcon;
+ break;
case GCL_HICONSM:
- retval = SetClassWord( hwnd, offset, (WORD)newval );
- goto END;
- case GCL_STYLE: ptr = &wndPtr->class->style; break;
- case GCL_CBWNDEXTRA: ptr = &wndPtr->class->cbWndExtra; break;
- case GCL_CBCLSEXTRA: ptr = &wndPtr->class->cbClsExtra; break;
- case GCL_HMODULE: ptr = &wndPtr->class->hInstance; break;
+ ptr = &wndPtr->class->hIconSm;
+ break;
+ case GCL_STYLE:
+ ptr = &wndPtr->class->style;
+ break;
+ case GCL_CBWNDEXTRA:
+ ptr = &wndPtr->class->cbWndExtra;
+ break;
+ case GCL_CBCLSEXTRA:
+ ptr = &wndPtr->class->cbClsExtra;
+ break;
+ case GCL_HMODULE:
+ ptr = &wndPtr->class->hInstance;
+ break;
+ case GCW_ATOM:
+ WIN_ReleaseWndPtr(wndPtr);
+ return SetClassWord( hwnd, offset, newval );
default:
WARN("Invalid offset %d\n", offset );
retval = 0;