Added code to manage Ascii and WideChar class names, and to return the

names in the GetClassInfo functions.
This commit is contained in:
Gavriel State 1998-11-15 09:21:17 +00:00 committed by Alexandre Julliard
parent a143963a50
commit c77c5928d2
2 changed files with 106 additions and 8 deletions

View File

@ -32,6 +32,8 @@ typedef struct tagCLASS
HCURSOR16 hCursor; /* Default cursor */
HBRUSH16 hbrBackground; /* Default background */
ATOM atomName; /* Name of the class */
LPSTR classNameA; /* Class name (ASCII string) */
LPWSTR classNameW; /* Class name (Unicode) */
LONG wExtra[1]; /* Class extra bytes */
} CLASS;

View File

@ -36,7 +36,7 @@ static CLASS *firstClass = NULL;
*/
void CLASS_DumpClass( CLASS *ptr )
{
char className[80];
char className[MAX_CLASSNAME+1];
int i;
if (ptr->magic != CLASS_MAGIC)
@ -74,7 +74,7 @@ void CLASS_DumpClass( CLASS *ptr )
void CLASS_WalkClasses(void)
{
CLASS *ptr;
char className[80];
char className[MAX_CLASSNAME+1];
DUMP( " Class Name Style WndProc\n" );
for (ptr = firstClass; ptr; ptr = ptr->next)
@ -157,6 +157,75 @@ static void CLASS_SetMenuNameW( CLASS *classPtr, LPCWSTR name )
}
/***********************************************************************
* CLASS_GetClassNameA
*
* Get the clas name as a ASCII string.
*/
static LPSTR CLASS_GetClassNameA( CLASS *classPtr )
{
if (!classPtr->classNameA && classPtr->classNameW)
{
/* We need to copy the Unicode string */
classPtr->classNameA = SEGPTR_STRDUP_WtoA( classPtr->classNameW );
}
return classPtr->classNameA;
}
/***********************************************************************
* CLASS_GetClassNameW
*
* Get the class name as a Unicode string.
*/
static LPWSTR CLASS_GetClassNameW( CLASS *classPtr )
{
if (!classPtr->classNameW && classPtr->classNameA)
{
if (!HIWORD(classPtr->classNameA))
return (LPWSTR)classPtr->classNameA;
/* Now we need to copy the ASCII string */
classPtr->classNameW = HEAP_strdupAtoW( SystemHeap, 0,
classPtr->classNameA );
}
return classPtr->classNameW;
}
/***********************************************************************
* CLASS_SetClassNameA
*
* Set the class name in a class structure by copying the string.
*/
static void CLASS_SetClassNameA( CLASS *classPtr, LPCSTR name )
{
if (HIWORD(classPtr->classNameA)) SEGPTR_FREE( classPtr->classNameA );
if (classPtr->classNameW) HeapFree( SystemHeap, 0, classPtr->classNameW );
classPtr->classNameA = SEGPTR_STRDUP( name );
classPtr->classNameW = 0;
}
/***********************************************************************
* CLASS_SetClassNameW
*
* Set the class name in a class structure by copying the string.
*/
static void CLASS_SetClassNameW( CLASS *classPtr, LPCWSTR name )
{
if (!HIWORD(name))
{
CLASS_SetClassNameA( classPtr, (LPCSTR)name );
return;
}
if (HIWORD(classPtr->classNameA)) SEGPTR_FREE( classPtr->classNameA );
if (classPtr->classNameW) HeapFree( SystemHeap, 0, classPtr->classNameW );
if ((classPtr->classNameW = HeapAlloc( SystemHeap, 0,
(lstrlen32W(name)+1)*sizeof(WCHAR) )))
lstrcpy32W( classPtr->classNameW, name );
classPtr->classNameA = 0;
}
/***********************************************************************
* CLASS_FreeClass
*
@ -188,6 +257,7 @@ static BOOL32 CLASS_FreeClass( CLASS *classPtr )
if (classPtr->hbrBackground) DeleteObject32( classPtr->hbrBackground );
GlobalDeleteAtom( classPtr->atomName );
CLASS_SetMenuNameA( classPtr, NULL );
CLASS_SetClassNameA( classPtr, NULL );
WINPROC_FreeProc( classPtr->winproc, WIN_PROC_CLASS );
HeapFree( SystemHeap, 0, classPtr );
return TRUE;
@ -317,10 +387,12 @@ static CLASS *CLASS_RegisterClass( ATOM atom, HINSTANCE32 hInstance,
classPtr->atomName = atom;
classPtr->menuNameA = 0;
classPtr->menuNameW = 0;
classPtr->classNameA = 0;
classPtr->classNameA = 0;
classPtr->dce = (style & CS_CLASSDC) ?
DCE_AllocDCE( 0, DCE_CLASS_DC ) : NULL;
WINPROC_SetProc( &classPtr->winproc, wndProc, wndProcType, WIN_PROC_CLASS);
WINPROC_SetProc( &classPtr->winproc, wndProc, wndProcType, WIN_PROC_CLASS);
/* Other values must be set by caller */
@ -363,6 +435,9 @@ bg=%04x style=%08x clsExt=%d winExt=%d class=%p name='%s'\n",
CLASS_SetMenuNameA( classPtr, HIWORD(wc->lpszMenuName) ?
PTR_SEG_TO_LIN(wc->lpszMenuName) : (LPCSTR)wc->lpszMenuName );
CLASS_SetClassNameA( classPtr, HIWORD(wc->lpszClassName) ?
PTR_SEG_TO_LIN(wc->lpszClassName) : (LPCSTR)wc->lpszClassName );
return atom;
}
@ -403,7 +478,9 @@ ATOM WINAPI RegisterClass32A(
classPtr->hIconSm = 0;
classPtr->hCursor = (HCURSOR16)wc->hCursor;
classPtr->hbrBackground = (HBRUSH16)wc->hbrBackground;
CLASS_SetMenuNameA( classPtr, wc->lpszMenuName );
CLASS_SetClassNameA( classPtr, wc->lpszClassName );
return atom;
}
@ -440,7 +517,9 @@ ATOM WINAPI RegisterClass32W( const WNDCLASS32W* wc )
classPtr->hIconSm = 0;
classPtr->hCursor = (HCURSOR16)wc->hCursor;
classPtr->hbrBackground = (HBRUSH16)wc->hbrBackground;
CLASS_SetMenuNameW( classPtr, wc->lpszMenuName );
CLASS_SetClassNameW( classPtr, wc->lpszClassName );
return atom;
}
@ -475,6 +554,8 @@ ATOM WINAPI RegisterClassEx16( const WNDCLASSEX16 *wc )
CLASS_SetMenuNameA( classPtr, HIWORD(wc->lpszMenuName) ?
PTR_SEG_TO_LIN(wc->lpszMenuName) : (LPCSTR)wc->lpszMenuName );
CLASS_SetClassNameA( classPtr, HIWORD(wc->lpszClassName) ?
PTR_SEG_TO_LIN(wc->lpszClassName) : (LPCSTR)wc->lpszClassName );
return atom;
}
@ -512,6 +593,7 @@ ATOM WINAPI RegisterClassEx32A( const WNDCLASSEX32A* wc )
classPtr->hCursor = (HCURSOR16)wc->hCursor;
classPtr->hbrBackground = (HBRUSH16)wc->hbrBackground;
CLASS_SetMenuNameA( classPtr, wc->lpszMenuName );
CLASS_SetClassNameA( classPtr, wc->lpszClassName );
return atom;
}
@ -549,6 +631,7 @@ ATOM WINAPI RegisterClassEx32W( const WNDCLASSEX32W* wc )
classPtr->hCursor = (HCURSOR16)wc->hCursor;
classPtr->hbrBackground = (HBRUSH16)wc->hbrBackground;
CLASS_SetMenuNameW( classPtr, wc->lpszMenuName );
CLASS_SetClassNameW( classPtr, wc->lpszClassName );
return atom;
}
@ -797,6 +880,16 @@ WORD WINAPI SetClassWord32( HWND32 hwnd, INT32 offset, WORD newval )
}
retval = GET_WORD(ptr);
PUT_WORD( ptr, newval );
/* Note: If the GCW_ATOM was changed, this means that the WNDCLASS className fields
need to be updated as well. Problem is that we can't tell whether the atom is
using wide or narrow characters. For now, we'll just NULL out the className
fields, and emit a FIXME. */
if (offset == GCW_ATOM)
{
CLASS_SetClassNameA( wndPtr->class, NULL );
FIXME(class,"GCW_ATOM changed for a class. Not updating className, so GetClassInfoEx may not return correct className!\n");
}
return retval;
}
@ -975,7 +1068,7 @@ BOOL16 WINAPI GetClassInfo16( HINSTANCE16 hInstance, SEGPTR name,
wc->hIcon = classPtr->hIcon;
wc->hCursor = classPtr->hCursor;
wc->hbrBackground = classPtr->hbrBackground;
wc->lpszClassName = (SEGPTR)0;
wc->lpszClassName = (SEGPTR)CLASS_GetClassNameA( classPtr );;
wc->lpszMenuName = (SEGPTR)CLASS_GetMenuNameA( classPtr );
if (HIWORD(wc->lpszMenuName)) /* Make it a SEGPTR */
wc->lpszMenuName = SEGPTR_GET( (LPSTR)wc->lpszMenuName );
@ -1019,7 +1112,7 @@ BOOL32 WINAPI GetClassInfo32A( HINSTANCE32 hInstance, LPCSTR name,
wc->hCursor = (HCURSOR32)classPtr->hCursor;
wc->hbrBackground = (HBRUSH32)classPtr->hbrBackground;
wc->lpszMenuName = CLASS_GetMenuNameA( classPtr );
wc->lpszClassName = NULL;
wc->lpszClassName = CLASS_GetClassNameA( classPtr );
return TRUE;
}
@ -1050,7 +1143,7 @@ BOOL32 WINAPI GetClassInfo32W( HINSTANCE32 hInstance, LPCWSTR name,
wc->hCursor = (HCURSOR32)classPtr->hCursor;
wc->hbrBackground = (HBRUSH32)classPtr->hbrBackground;
wc->lpszMenuName = CLASS_GetMenuNameW( classPtr );
wc->lpszClassName = NULL;
wc->lpszClassName = CLASS_GetClassNameW( classPtr );
return TRUE;
}
@ -1086,6 +1179,9 @@ BOOL16 WINAPI GetClassInfoEx16( HINSTANCE16 hInstance, SEGPTR name,
wc->lpszMenuName = (SEGPTR)CLASS_GetMenuNameA( classPtr );
if (HIWORD(wc->lpszMenuName)) /* Make it a SEGPTR */
wc->lpszMenuName = SEGPTR_GET( (LPSTR)wc->lpszMenuName );
wc->lpszClassName = (SEGPTR)CLASS_GetClassNameA( classPtr );
if (HIWORD(wc->lpszClassName)) /* Make it a SEGPTR */
wc->lpszClassName = SEGPTR_GET( (LPSTR)wc->lpszClassName );
return TRUE;
}
@ -1115,7 +1211,7 @@ BOOL32 WINAPI GetClassInfoEx32A( HINSTANCE32 hInstance, LPCSTR name,
wc->hCursor = (HCURSOR32)classPtr->hCursor;
wc->hbrBackground = (HBRUSH32)classPtr->hbrBackground;
wc->lpszMenuName = CLASS_GetMenuNameA( classPtr );
wc->lpszClassName = NULL;
wc->lpszClassName = CLASS_GetClassNameA( classPtr );
return TRUE;
}
@ -1145,7 +1241,7 @@ BOOL32 WINAPI GetClassInfoEx32W( HINSTANCE32 hInstance, LPCWSTR name,
wc->hCursor = (HCURSOR32)classPtr->hCursor;
wc->hbrBackground = (HBRUSH32)classPtr->hbrBackground;
wc->lpszMenuName = CLASS_GetMenuNameW( classPtr );
wc->lpszClassName = NULL;
wc->lpszClassName = CLASS_GetClassNameW( classPtr );;
return TRUE;
}