blob: ddd8efe2c4546f67a9b8dc62d1553098839a39e1 [file] [log] [blame]
Alexandre Julliard401710d1993-09-04 10:09:32 +00001/*
2 * Window classes functions
3 *
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00004 * Copyright 1993, 1996 Alexandre Julliard
Alexandre Julliard767e6f61998-08-09 12:47:43 +00005 * 1998 Juergen Schmied (jsch)
Alexandre Julliard21979011997-03-05 08:22:35 +00006 *
7 * FIXME: In win32 all classes are local. They are registered at
8 * program start. Processes CANNOT share classes. (Source: some
9 * win31->NT migration book)
Alexandre Julliard767e6f61998-08-09 12:47:43 +000010 *
11 * FIXME: There seems to be a general problem with hInstance in WINE
12 * classes are getting registred with wrong hInstance.
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +000013 */
Alexandre Julliard401710d1993-09-04 10:09:32 +000014
Alexandre Julliard8d24ae61994-04-05 21:42:43 +000015#include <stdlib.h>
Alexandre Julliard8d24ae61994-04-05 21:42:43 +000016#include <string.h>
Alexandre Julliard401710d1993-09-04 10:09:32 +000017#include "class.h"
Alexandre Julliard1285c2f1996-05-06 16:06:24 +000018#include "heap.h"
Alexandre Julliard401710d1993-09-04 10:09:32 +000019#include "win.h"
Alexandre Julliard5f721f81994-01-04 20:14:34 +000020#include "dce.h"
Alexandre Julliard808cb041995-08-17 17:11:36 +000021#include "ldt.h"
Alexandre Julliarde2abbb11995-03-19 17:39:39 +000022#include "toolhelp.h"
Alexandre Julliard2d93d001996-05-21 15:01:41 +000023#include "winproc.h"
Alexandre Julliardaca05781994-10-17 18:12:41 +000024#include "debug.h"
Alexandre Julliard767e6f61998-08-09 12:47:43 +000025#include "winerror.h"
Michael Vekslerca1bc861999-01-01 18:57:33 +000026#include "wine/winuser16.h"
Alexandre Julliard8d24ae61994-04-05 21:42:43 +000027
Alexandre Julliard401710d1993-09-04 10:09:32 +000028
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000029static CLASS *firstClass = NULL;
Alexandre Julliard401710d1993-09-04 10:09:32 +000030
31
32/***********************************************************************
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000033 * CLASS_DumpClass
34 *
35 * Dump the content of a class structure to stderr.
36 */
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000037void CLASS_DumpClass( CLASS *ptr )
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000038{
Gavriel Statec77c5921998-11-15 09:21:17 +000039 char className[MAX_CLASSNAME+1];
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000040 int i;
41
Alexandre Julliard1285c2f1996-05-06 16:06:24 +000042 if (ptr->magic != CLASS_MAGIC)
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000043 {
Alexandre Julliarda845b881998-06-01 10:44:35 +000044 DUMP("%p is not a class\n", ptr );
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000045 return;
46 }
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000047
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +000048 GlobalGetAtomName32A( ptr->atomName, className, sizeof(className) );
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000049
Alexandre Julliarda845b881998-06-01 10:44:35 +000050 DUMP( "Class %p:\n", ptr );
51 DUMP( "next=%p name=%04x '%s' style=%08x wndProc=%08x\n"
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +000052 "inst=%04x dce=%08x icon=%04x cursor=%04x bkgnd=%04x\n"
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000053 "clsExtra=%d winExtra=%d #windows=%d\n",
Alexandre Julliard1285c2f1996-05-06 16:06:24 +000054 ptr->next, ptr->atomName, className, ptr->style,
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +000055 (UINT32)ptr->winproc, ptr->hInstance, (UINT32)ptr->dce,
Alexandre Julliard1285c2f1996-05-06 16:06:24 +000056 ptr->hIcon, ptr->hCursor, ptr->hbrBackground,
57 ptr->cbClsExtra, ptr->cbWndExtra, ptr->cWindows );
58 if (ptr->cbClsExtra)
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000059 {
Alexandre Julliarda845b881998-06-01 10:44:35 +000060 DUMP( "extra bytes:" );
Alexandre Julliard1285c2f1996-05-06 16:06:24 +000061 for (i = 0; i < ptr->cbClsExtra; i++)
Alexandre Julliarda845b881998-06-01 10:44:35 +000062 DUMP( " %02x", *((BYTE *)ptr->wExtra+i) );
63 DUMP( "\n" );
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000064 }
Alexandre Julliarda845b881998-06-01 10:44:35 +000065 DUMP( "\n" );
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000066}
67
68
69/***********************************************************************
70 * CLASS_WalkClasses
71 *
72 * Walk the class list and print each class on stderr.
73 */
74void CLASS_WalkClasses(void)
75{
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000076 CLASS *ptr;
Gavriel Statec77c5921998-11-15 09:21:17 +000077 char className[MAX_CLASSNAME+1];
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000078
Alexandre Julliarda845b881998-06-01 10:44:35 +000079 DUMP( " Class Name Style WndProc\n" );
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000080 for (ptr = firstClass; ptr; ptr = ptr->next)
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000081 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +000082 GlobalGetAtomName32A( ptr->atomName, className, sizeof(className) );
Alexandre Julliarda845b881998-06-01 10:44:35 +000083 DUMP( "%08x %-20.20s %08x %08x\n", (UINT32)ptr, className,
Alexandre Julliard3051b641996-07-05 17:14:13 +000084 ptr->style, (UINT32)ptr->winproc );
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000085 }
Alexandre Julliarda845b881998-06-01 10:44:35 +000086 DUMP( "\n" );
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000087}
88
89
90/***********************************************************************
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +000091 * CLASS_GetMenuNameA
92 *
93 * Get the menu name as a ASCII string.
94 */
95static LPSTR CLASS_GetMenuNameA( CLASS *classPtr )
96{
97 if (!classPtr->menuNameA && classPtr->menuNameW)
98 {
99 /* We need to copy the Unicode string */
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000100 classPtr->menuNameA = SEGPTR_STRDUP_WtoA( classPtr->menuNameW );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000101 }
102 return classPtr->menuNameA;
103}
104
105
106/***********************************************************************
107 * CLASS_GetMenuNameW
108 *
109 * Get the menu name as a Unicode string.
110 */
111static LPWSTR CLASS_GetMenuNameW( CLASS *classPtr )
112{
113 if (!classPtr->menuNameW && classPtr->menuNameA)
114 {
115 if (!HIWORD(classPtr->menuNameA))
116 return (LPWSTR)classPtr->menuNameA;
117 /* Now we need to copy the ASCII string */
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000118 classPtr->menuNameW = HEAP_strdupAtoW( SystemHeap, 0,
119 classPtr->menuNameA );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000120 }
121 return classPtr->menuNameW;
122}
123
124
125/***********************************************************************
126 * CLASS_SetMenuNameA
127 *
128 * Set the menu name in a class structure by copying the string.
129 */
130static void CLASS_SetMenuNameA( CLASS *classPtr, LPCSTR name )
131{
132 if (HIWORD(classPtr->menuNameA)) SEGPTR_FREE( classPtr->menuNameA );
133 if (classPtr->menuNameW) HeapFree( SystemHeap, 0, classPtr->menuNameW );
134 classPtr->menuNameA = SEGPTR_STRDUP( name );
135 classPtr->menuNameW = 0;
136}
137
138
139/***********************************************************************
140 * CLASS_SetMenuNameW
141 *
142 * Set the menu name in a class structure by copying the string.
143 */
144static void CLASS_SetMenuNameW( CLASS *classPtr, LPCWSTR name )
145{
146 if (!HIWORD(name))
147 {
148 CLASS_SetMenuNameA( classPtr, (LPCSTR)name );
149 return;
150 }
151 if (HIWORD(classPtr->menuNameA)) SEGPTR_FREE( classPtr->menuNameA );
152 if (classPtr->menuNameW) HeapFree( SystemHeap, 0, classPtr->menuNameW );
153 if ((classPtr->menuNameW = HeapAlloc( SystemHeap, 0,
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000154 (lstrlen32W(name)+1)*sizeof(WCHAR) )))
155 lstrcpy32W( classPtr->menuNameW, name );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000156 classPtr->menuNameA = 0;
157}
158
159
160/***********************************************************************
Gavriel Statec77c5921998-11-15 09:21:17 +0000161 * CLASS_GetClassNameA
162 *
163 * Get the clas name as a ASCII string.
164 */
165static LPSTR CLASS_GetClassNameA( CLASS *classPtr )
166{
167 if (!classPtr->classNameA && classPtr->classNameW)
168 {
169 /* We need to copy the Unicode string */
170 classPtr->classNameA = SEGPTR_STRDUP_WtoA( classPtr->classNameW );
171 }
172 return classPtr->classNameA;
173}
174
175
176/***********************************************************************
177 * CLASS_GetClassNameW
178 *
179 * Get the class name as a Unicode string.
180 */
181static LPWSTR CLASS_GetClassNameW( CLASS *classPtr )
182{
183 if (!classPtr->classNameW && classPtr->classNameA)
184 {
185 if (!HIWORD(classPtr->classNameA))
186 return (LPWSTR)classPtr->classNameA;
187 /* Now we need to copy the ASCII string */
188 classPtr->classNameW = HEAP_strdupAtoW( SystemHeap, 0,
189 classPtr->classNameA );
190 }
191 return classPtr->classNameW;
192}
193
194/***********************************************************************
195 * CLASS_SetClassNameA
196 *
197 * Set the class name in a class structure by copying the string.
198 */
199static void CLASS_SetClassNameA( CLASS *classPtr, LPCSTR name )
200{
201 if (HIWORD(classPtr->classNameA)) SEGPTR_FREE( classPtr->classNameA );
202 if (classPtr->classNameW) HeapFree( SystemHeap, 0, classPtr->classNameW );
203 classPtr->classNameA = SEGPTR_STRDUP( name );
204 classPtr->classNameW = 0;
205}
206
207
208/***********************************************************************
209 * CLASS_SetClassNameW
210 *
211 * Set the class name in a class structure by copying the string.
212 */
213static void CLASS_SetClassNameW( CLASS *classPtr, LPCWSTR name )
214{
215 if (!HIWORD(name))
216 {
217 CLASS_SetClassNameA( classPtr, (LPCSTR)name );
218 return;
219 }
220 if (HIWORD(classPtr->classNameA)) SEGPTR_FREE( classPtr->classNameA );
221 if (classPtr->classNameW) HeapFree( SystemHeap, 0, classPtr->classNameW );
222 if ((classPtr->classNameW = HeapAlloc( SystemHeap, 0,
223 (lstrlen32W(name)+1)*sizeof(WCHAR) )))
224 lstrcpy32W( classPtr->classNameW, name );
225 classPtr->classNameA = 0;
226}
227
228
229/***********************************************************************
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000230 * CLASS_FreeClass
231 *
232 * Free a class structure.
233 */
Alexandre Julliard21979011997-03-05 08:22:35 +0000234static BOOL32 CLASS_FreeClass( CLASS *classPtr )
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000235{
236 CLASS **ppClass;
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000237 TRACE(class,"%p \n", classPtr);
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000238
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000239 /* Check if we can remove this class */
240
241 if (classPtr->cWindows > 0) return FALSE;
242
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000243 /* Remove the class from the linked list */
244
245 for (ppClass = &firstClass; *ppClass; ppClass = &(*ppClass)->next)
246 if (*ppClass == classPtr) break;
247 if (!*ppClass)
248 {
Alexandre Julliarda845b881998-06-01 10:44:35 +0000249 ERR( class, "Class list corrupted\n" );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000250 return FALSE;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000251 }
252 *ppClass = classPtr->next;
253
254 /* Delete the class */
255
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000256 if (classPtr->dce) DCE_FreeDCE( classPtr->dce );
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000257 if (classPtr->hbrBackground) DeleteObject32( classPtr->hbrBackground );
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000258 GlobalDeleteAtom( classPtr->atomName );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000259 CLASS_SetMenuNameA( classPtr, NULL );
Gavriel Statec77c5921998-11-15 09:21:17 +0000260 CLASS_SetClassNameA( classPtr, NULL );
Alexandre Julliarddf2673b1997-03-29 17:20:20 +0000261 WINPROC_FreeProc( classPtr->winproc, WIN_PROC_CLASS );
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000262 HeapFree( SystemHeap, 0, classPtr );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000263 return TRUE;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000264}
265
266
267/***********************************************************************
268 * CLASS_FreeModuleClasses
269 */
Alexandre Julliard3051b641996-07-05 17:14:13 +0000270void CLASS_FreeModuleClasses( HMODULE16 hModule )
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000271{
272 CLASS *ptr, *next;
273
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000274 TRACE(class,"0x%08x \n", hModule);
275
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000276 for (ptr = firstClass; ptr; ptr = next)
277 {
278 next = ptr->next;
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000279 if (ptr->hInstance == hModule) CLASS_FreeClass( ptr );
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000280 }
281}
282
283
284/***********************************************************************
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000285 * CLASS_FindClassByAtom
286 *
287 * Return a pointer to the class.
Alexandre Julliard77b99181997-09-14 17:17:23 +0000288 * hinstance has been normalized by the caller.
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000289 *
290 * NOTES
291 * 980805 a local class will be found now if registred with hInst=0
292 * and looed up with a hInst!=0. msmoney does it (jsch)
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000293 */
Alexandre Julliard77b99181997-09-14 17:17:23 +0000294CLASS *CLASS_FindClassByAtom( ATOM atom, HINSTANCE32 hinstance )
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000295{ CLASS * class, *tclass=0;
296
297 TRACE(class,"0x%08x 0x%08x\n", atom, hinstance);
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000298
Alexandre Julliard77b99181997-09-14 17:17:23 +0000299 /* First search task-specific classes */
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000300
301 for (class = firstClass; (class); class = class->next)
302 {
303 if (class->style & CS_GLOBALCLASS) continue;
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000304 if (class->atomName == atom)
305 {
306 if (hinstance==class->hInstance || hinstance==0xffff )
307 {
308 TRACE(class,"-- found local %p\n", class);
309 return class;
310 }
311 if (class->hInstance==0) tclass = class;
312 }
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000313 }
314
315 /* Then search global classes */
316
317 for (class = firstClass; (class); class = class->next)
318 {
319 if (!(class->style & CS_GLOBALCLASS)) continue;
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000320 if (class->atomName == atom)
321 {
322 TRACE(class,"-- found global %p\n", class);
323 return class;
324 }
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000325 }
326
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000327 /* Then check if there was a local class with hInst=0*/
328 if ( tclass )
329 {
330 WARN(class,"-- found local Class registred with hInst=0\n");
331 return tclass;
332 }
333
334 TRACE(class,"-- not found\n");
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000335 return 0;
336}
337
338
339/***********************************************************************
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000340 * CLASS_RegisterClass
341 *
342 * The real RegisterClass() functionality.
343 */
344static CLASS *CLASS_RegisterClass( ATOM atom, HINSTANCE32 hInstance,
345 DWORD style, INT32 classExtra,
Alexandre Julliard3051b641996-07-05 17:14:13 +0000346 INT32 winExtra, WNDPROC16 wndProc,
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000347 WINDOWPROCTYPE wndProcType )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000348{
349 CLASS *classPtr;
350
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000351 TRACE(class,"atom=0x%x hinst=0x%x style=0x%lx clExtr=0x%x winExtr=0x%x wndProc=0x%p ProcType=0x%x\n",
352 atom, hInstance, style, classExtra, winExtra, wndProc, wndProcType);
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000353
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000354 /* Check if a class with this name already exists */
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000355 classPtr = CLASS_FindClassByAtom( atom, hInstance );
356 if (classPtr)
357 {
358 /* Class can be created only if it is local and */
359 /* if the class with the same name is global. */
360
361 if (style & CS_GLOBALCLASS) return NULL;
362 if (!(classPtr->style & CS_GLOBALCLASS)) return NULL;
363 }
364
365 /* Fix the extra bytes value */
366
367 if (classExtra < 0) classExtra = 0;
368 else if (classExtra > 40) /* Extra bytes are limited to 40 in Win32 */
Alexandre Julliarda845b881998-06-01 10:44:35 +0000369 WARN(class, "Class extra bytes %d is > 40\n", classExtra);
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000370 if (winExtra < 0) winExtra = 0;
371 else if (winExtra > 40) /* Extra bytes are limited to 40 in Win32 */
Alexandre Julliarda845b881998-06-01 10:44:35 +0000372 WARN(class, "Win extra bytes %d is > 40\n", winExtra );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000373
374 /* Create the class */
375
376 classPtr = (CLASS *)HeapAlloc( SystemHeap, 0, sizeof(CLASS) +
377 classExtra - sizeof(classPtr->wExtra) );
378 if (!classPtr) return NULL;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000379 classPtr->next = firstClass;
380 classPtr->magic = CLASS_MAGIC;
381 classPtr->cWindows = 0;
382 classPtr->style = style;
Alexandre Julliard3051b641996-07-05 17:14:13 +0000383 classPtr->winproc = (HWINDOWPROC)0;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000384 classPtr->cbWndExtra = winExtra;
385 classPtr->cbClsExtra = classExtra;
386 classPtr->hInstance = hInstance;
387 classPtr->atomName = atom;
388 classPtr->menuNameA = 0;
389 classPtr->menuNameW = 0;
Rein Klazescb37dfd1998-11-22 14:13:47 +0000390 classPtr->classNameA = 0;
391 classPtr->classNameW = 0;
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000392 classPtr->dce = (style & CS_CLASSDC) ?
393 DCE_AllocDCE( 0, DCE_CLASS_DC ) : NULL;
394
Gavriel Statec77c5921998-11-15 09:21:17 +0000395 WINPROC_SetProc( &classPtr->winproc, wndProc, wndProcType, WIN_PROC_CLASS);
Alexandre Julliard3051b641996-07-05 17:14:13 +0000396
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000397 /* Other values must be set by caller */
398
399 if (classExtra) memset( classPtr->wExtra, 0, classExtra );
400 firstClass = classPtr;
401 return classPtr;
402}
403
404
405/***********************************************************************
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000406 * RegisterClass16 (USER.57)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000407 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000408ATOM WINAPI RegisterClass16( const WNDCLASS16 *wc )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000409{
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000410 ATOM atom;
411 CLASS *classPtr;
Alexandre Julliard77b99181997-09-14 17:17:23 +0000412 HINSTANCE16 hInstance=GetExePtr(wc->hInstance);
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000413
414 if (!(atom = GlobalAddAtom16( wc->lpszClassName ))) return 0;
415 if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000416 wc->cbClsExtra, wc->cbWndExtra,
Alexandre Julliard3051b641996-07-05 17:14:13 +0000417 wc->lpfnWndProc, WIN_PROC_16 )))
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000418 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000419 GlobalDeleteAtom( atom );
420 return 0;
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000421 }
422
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000423 TRACE(class, "atom=%04x wndproc=%08lx hinst=%04x
Alexandre Julliard641ee761997-08-04 16:34:36 +0000424bg=%04x style=%08x clsExt=%d winExt=%d class=%p name='%s'\n",
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000425 atom, (DWORD)wc->lpfnWndProc, hInstance,
426 wc->hbrBackground, wc->style, wc->cbClsExtra,
Alexandre Julliard641ee761997-08-04 16:34:36 +0000427 wc->cbWndExtra, classPtr,
428 HIWORD(wc->lpszClassName) ?
429 (char *)PTR_SEG_TO_LIN(wc->lpszClassName) : "" );
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000430
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000431 classPtr->hIcon = wc->hIcon;
432 classPtr->hIconSm = 0;
433 classPtr->hCursor = wc->hCursor;
434 classPtr->hbrBackground = wc->hbrBackground;
Alexandre Julliardf0b23541993-09-29 12:21:49 +0000435
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000436 CLASS_SetMenuNameA( classPtr, HIWORD(wc->lpszMenuName) ?
437 PTR_SEG_TO_LIN(wc->lpszMenuName) : (LPCSTR)wc->lpszMenuName );
Gavriel Statec77c5921998-11-15 09:21:17 +0000438 CLASS_SetClassNameA( classPtr, HIWORD(wc->lpszClassName) ?
439 PTR_SEG_TO_LIN(wc->lpszClassName) : (LPCSTR)wc->lpszClassName );
440
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000441 return atom;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000442}
443
444
445/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +0000446 * RegisterClass32A (USER32.427)
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000447 * RETURNS
448 * >0: Unique identifier
449 * 0: Failure
Alexandre Julliard401710d1993-09-04 10:09:32 +0000450 */
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000451ATOM WINAPI RegisterClass32A(
452 const WNDCLASS32A* wc /* Address of structure with class data */
453) {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000454 ATOM atom;
455 CLASS *classPtr;
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000456
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000457 if (!(atom = GlobalAddAtom32A( wc->lpszClassName )))
458 {
459 SetLastError(ERROR_CLASS_ALREADY_EXISTS);
460 return FALSE;
461 }
Alexandre Julliard77b99181997-09-14 17:17:23 +0000462 if (!(classPtr = CLASS_RegisterClass( atom, wc->hInstance, wc->style,
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000463 wc->cbClsExtra, wc->cbWndExtra,
Alexandre Julliard3051b641996-07-05 17:14:13 +0000464 (WNDPROC16)wc->lpfnWndProc,
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000465 WIN_PROC_32A )))
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000466 { GlobalDeleteAtom( atom );
467 SetLastError(ERROR_CLASS_ALREADY_EXISTS);
468 return FALSE;
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000469 }
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000470
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000471 TRACE(class, "atom=%04x wndproc=%08lx hinst=%04x bg=%04x style=%08x clsExt=%d winExt=%d class=%p name='%s'\n",
Alexandre Julliard77b99181997-09-14 17:17:23 +0000472 atom, (DWORD)wc->lpfnWndProc, wc->hInstance,
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000473 wc->hbrBackground, wc->style, wc->cbClsExtra,
Alexandre Julliard641ee761997-08-04 16:34:36 +0000474 wc->cbWndExtra, classPtr,
475 HIWORD(wc->lpszClassName) ? wc->lpszClassName : "" );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000476
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000477 classPtr->hIcon = (HICON16)wc->hIcon;
478 classPtr->hIconSm = 0;
479 classPtr->hCursor = (HCURSOR16)wc->hCursor;
480 classPtr->hbrBackground = (HBRUSH16)wc->hbrBackground;
Gavriel Statec77c5921998-11-15 09:21:17 +0000481
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000482 CLASS_SetMenuNameA( classPtr, wc->lpszMenuName );
Gavriel Statec77c5921998-11-15 09:21:17 +0000483 CLASS_SetClassNameA( classPtr, wc->lpszClassName );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000484 return atom;
485}
486
487
488/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +0000489 * RegisterClass32W (USER32.430)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000490 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000491ATOM WINAPI RegisterClass32W( const WNDCLASS32W* wc )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000492{
493 ATOM atom;
494 CLASS *classPtr;
495
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000496 if (!(atom = GlobalAddAtom32W( wc->lpszClassName )))
497 {
498 SetLastError(ERROR_CLASS_ALREADY_EXISTS);
499 return FALSE;
500 }
Alexandre Julliard77b99181997-09-14 17:17:23 +0000501 if (!(classPtr = CLASS_RegisterClass( atom, wc->hInstance, wc->style,
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000502 wc->cbClsExtra, wc->cbWndExtra,
Alexandre Julliard3051b641996-07-05 17:14:13 +0000503 (WNDPROC16)wc->lpfnWndProc,
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000504 WIN_PROC_32W )))
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000505 {
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000506 SetLastError(ERROR_CLASS_ALREADY_EXISTS);
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000507 GlobalDeleteAtom( atom );
508 return 0;
509 }
510
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000511 TRACE(class, "atom=%04x wndproc=%08lx hinst=%04x bg=%04x style=%08x clsExt=%d winExt=%d class=%p\n",
Alexandre Julliard77b99181997-09-14 17:17:23 +0000512 atom, (DWORD)wc->lpfnWndProc, wc->hInstance,
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000513 wc->hbrBackground, wc->style, wc->cbClsExtra,
514 wc->cbWndExtra, classPtr );
515
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000516 classPtr->hIcon = (HICON16)wc->hIcon;
517 classPtr->hIconSm = 0;
518 classPtr->hCursor = (HCURSOR16)wc->hCursor;
519 classPtr->hbrBackground = (HBRUSH16)wc->hbrBackground;
Gavriel Statec77c5921998-11-15 09:21:17 +0000520
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000521 CLASS_SetMenuNameW( classPtr, wc->lpszMenuName );
Gavriel Statec77c5921998-11-15 09:21:17 +0000522 CLASS_SetClassNameW( classPtr, wc->lpszClassName );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000523 return atom;
524}
525
526
527/***********************************************************************
528 * RegisterClassEx16 (USER.397)
529 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000530ATOM WINAPI RegisterClassEx16( const WNDCLASSEX16 *wc )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000531{
532 ATOM atom;
533 CLASS *classPtr;
Alexandre Julliard77b99181997-09-14 17:17:23 +0000534 HINSTANCE16 hInstance = GetExePtr( wc->hInstance );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000535
536 if (!(atom = GlobalAddAtom16( wc->lpszClassName ))) return 0;
537 if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000538 wc->cbClsExtra, wc->cbWndExtra,
Alexandre Julliard3051b641996-07-05 17:14:13 +0000539 wc->lpfnWndProc, WIN_PROC_16 )))
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000540 {
541 GlobalDeleteAtom( atom );
542 return 0;
543 }
544
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000545 TRACE(class, "atom=%04x wndproc=%08lx hinst=%04x bg=%04x style=%08x clsExt=%d winExt=%d class=%p\n",
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000546 atom, (DWORD)wc->lpfnWndProc, hInstance,
547 wc->hbrBackground, wc->style, wc->cbClsExtra,
548 wc->cbWndExtra, classPtr );
549
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000550 classPtr->hIcon = wc->hIcon;
551 classPtr->hIconSm = wc->hIconSm;
552 classPtr->hCursor = wc->hCursor;
553 classPtr->hbrBackground = wc->hbrBackground;
554
555 CLASS_SetMenuNameA( classPtr, HIWORD(wc->lpszMenuName) ?
556 PTR_SEG_TO_LIN(wc->lpszMenuName) : (LPCSTR)wc->lpszMenuName );
Gavriel Statec77c5921998-11-15 09:21:17 +0000557 CLASS_SetClassNameA( classPtr, HIWORD(wc->lpszClassName) ?
558 PTR_SEG_TO_LIN(wc->lpszClassName) : (LPCSTR)wc->lpszClassName );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000559 return atom;
560}
561
562
563/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +0000564 * RegisterClassEx32A (USER32.428)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000565 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000566ATOM WINAPI RegisterClassEx32A( const WNDCLASSEX32A* wc )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000567{
568 ATOM atom;
569 CLASS *classPtr;
570
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000571 if (!(atom = GlobalAddAtom32A( wc->lpszClassName )))
572 {
573 SetLastError(ERROR_CLASS_ALREADY_EXISTS);
574 return FALSE;
575 }
Alexandre Julliard77b99181997-09-14 17:17:23 +0000576 if (!(classPtr = CLASS_RegisterClass( atom, wc->hInstance, wc->style,
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000577 wc->cbClsExtra, wc->cbWndExtra,
Alexandre Julliard3051b641996-07-05 17:14:13 +0000578 (WNDPROC16)wc->lpfnWndProc,
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000579 WIN_PROC_32A )))
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000580 {
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000581 SetLastError(ERROR_CLASS_ALREADY_EXISTS);
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000582 GlobalDeleteAtom( atom );
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000583 return FALSE;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000584 }
585
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000586 TRACE(class, "atom=%04x wndproc=%08lx hinst=%04x bg=%04x style=%08x clsExt=%d winExt=%d class=%p\n",
Alexandre Julliard77b99181997-09-14 17:17:23 +0000587 atom, (DWORD)wc->lpfnWndProc, wc->hInstance,
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000588 wc->hbrBackground, wc->style, wc->cbClsExtra,
589 wc->cbWndExtra, classPtr );
590
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000591 classPtr->hIcon = (HICON16)wc->hIcon;
592 classPtr->hIconSm = (HICON16)wc->hIconSm;
593 classPtr->hCursor = (HCURSOR16)wc->hCursor;
594 classPtr->hbrBackground = (HBRUSH16)wc->hbrBackground;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000595 CLASS_SetMenuNameA( classPtr, wc->lpszMenuName );
Gavriel Statec77c5921998-11-15 09:21:17 +0000596 CLASS_SetClassNameA( classPtr, wc->lpszClassName );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000597 return atom;
598}
599
600
601/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +0000602 * RegisterClassEx32W (USER32.429)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000603 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000604ATOM WINAPI RegisterClassEx32W( const WNDCLASSEX32W* wc )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000605{
606 ATOM atom;
607 CLASS *classPtr;
608
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000609 if (!(atom = GlobalAddAtom32W( wc->lpszClassName )))
610 {
611 SetLastError(ERROR_CLASS_ALREADY_EXISTS);
612 return 0;
613 }
Alexandre Julliard77b99181997-09-14 17:17:23 +0000614 if (!(classPtr = CLASS_RegisterClass( atom, wc->hInstance, wc->style,
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000615 wc->cbClsExtra, wc->cbWndExtra,
Alexandre Julliard3051b641996-07-05 17:14:13 +0000616 (WNDPROC16)wc->lpfnWndProc,
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000617 WIN_PROC_32W )))
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000618 {
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000619 SetLastError(ERROR_CLASS_ALREADY_EXISTS);
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000620 GlobalDeleteAtom( atom );
621 return 0;
622 }
623
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000624 TRACE(class, "atom=%04x wndproc=%08lx hinst=%04x bg=%04x style=%08x clsExt=%d winExt=%d class=%p\n",
Alexandre Julliard77b99181997-09-14 17:17:23 +0000625 atom, (DWORD)wc->lpfnWndProc, wc->hInstance,
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000626 wc->hbrBackground, wc->style, wc->cbClsExtra,
627 wc->cbWndExtra, classPtr );
628
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000629 classPtr->hIcon = (HICON16)wc->hIcon;
630 classPtr->hIconSm = (HICON16)wc->hIconSm;
631 classPtr->hCursor = (HCURSOR16)wc->hCursor;
632 classPtr->hbrBackground = (HBRUSH16)wc->hbrBackground;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000633 CLASS_SetMenuNameW( classPtr, wc->lpszMenuName );
Gavriel Statec77c5921998-11-15 09:21:17 +0000634 CLASS_SetClassNameW( classPtr, wc->lpszClassName );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000635 return atom;
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000636}
637
638
639/***********************************************************************
640 * UnregisterClass16 (USER.403)
641 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000642BOOL16 WINAPI UnregisterClass16( SEGPTR className, HINSTANCE16 hInstance )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000643{
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000644 CLASS *classPtr;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000645 ATOM atom;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000646
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000647 hInstance = GetExePtr( hInstance );
648 if (!(atom = GlobalFindAtom16( className ))) return FALSE;
649 if (!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
650 (classPtr->hInstance != hInstance)) return FALSE;
651 return CLASS_FreeClass( classPtr );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000652}
653
654
655/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +0000656 * UnregisterClass32A (USER32.563)
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000657 *
Alexandre Julliard401710d1993-09-04 10:09:32 +0000658 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000659BOOL32 WINAPI UnregisterClass32A( LPCSTR className, HINSTANCE32 hInstance )
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000660{ CLASS *classPtr;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000661 ATOM atom;
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000662 BOOL32 ret;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000663
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000664 TRACE(class,"%s %x\n",className, hInstance);
665
666 if (!(atom = GlobalFindAtom32A( className )))
667 {
668 SetLastError(ERROR_CLASS_DOES_NOT_EXIST);
669 return FALSE;
670 }
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000671 if (!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000672 (classPtr->hInstance != hInstance))
673 {
674 SetLastError(ERROR_CLASS_DOES_NOT_EXIST);
675 return FALSE;
676 }
677 if (!(ret = CLASS_FreeClass( classPtr )))
678 SetLastError(ERROR_CLASS_HAS_WINDOWS);
679 return ret;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000680}
681
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000682/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +0000683 * UnregisterClass32W (USER32.564)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000684 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000685BOOL32 WINAPI UnregisterClass32W( LPCWSTR className, HINSTANCE32 hInstance )
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000686{ CLASS *classPtr;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000687 ATOM atom;
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000688 BOOL32 ret;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000689
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000690 TRACE(class,"%s %x\n",debugstr_w(className), hInstance);
691
692 if (!(atom = GlobalFindAtom32W( className )))
693 {
694 SetLastError(ERROR_CLASS_DOES_NOT_EXIST);
695 return FALSE;
696 }
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000697 if (!(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000698 (classPtr->hInstance != hInstance))
699 {
700 SetLastError(ERROR_CLASS_DOES_NOT_EXIST);
701 return FALSE;
702 }
703 if (!(ret = CLASS_FreeClass( classPtr )))
704 SetLastError(ERROR_CLASS_HAS_WINDOWS);
705 return ret;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000706}
707
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000708/***********************************************************************
Alexandre Julliard21979011997-03-05 08:22:35 +0000709 * GetClassWord16 (USER.129)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000710 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000711WORD WINAPI GetClassWord16( HWND16 hwnd, INT16 offset )
Alexandre Julliard21979011997-03-05 08:22:35 +0000712{
713 return GetClassWord32( hwnd, offset );
714}
715
716
717/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +0000718 * GetClassWord32 (USER32.219)
Alexandre Julliard21979011997-03-05 08:22:35 +0000719 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000720WORD WINAPI GetClassWord32( HWND32 hwnd, INT32 offset )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000721{
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000722 WND * wndPtr;
723
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000724 TRACE(class,"%x %x\n",hwnd, offset);
725
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000726 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
727 if (offset >= 0)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000728 {
729 if (offset <= wndPtr->class->cbClsExtra - sizeof(WORD))
730 return GET_WORD(((char *)wndPtr->class->wExtra) + offset);
731 }
732 else switch(offset)
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000733 {
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000734 case GCW_HBRBACKGROUND: return wndPtr->class->hbrBackground;
735 case GCW_HCURSOR: return wndPtr->class->hCursor;
736 case GCW_HICON: return wndPtr->class->hIcon;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000737 case GCW_HICONSM: return wndPtr->class->hIconSm;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000738 case GCW_ATOM: return wndPtr->class->atomName;
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000739 case GCW_STYLE:
740 case GCW_CBWNDEXTRA:
741 case GCW_CBCLSEXTRA:
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000742 case GCW_HMODULE:
743 return (WORD)GetClassLong32A( hwnd, offset );
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000744 }
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000745
Alexandre Julliarda845b881998-06-01 10:44:35 +0000746 WARN(class, "Invalid offset %d\n", offset);
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000747 return 0;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000748}
749
750
751/***********************************************************************
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000752 * GetClassLong16 (USER.131)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000753 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000754LONG WINAPI GetClassLong16( HWND16 hwnd, INT16 offset )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000755{
Alexandre Julliard3051b641996-07-05 17:14:13 +0000756 WND *wndPtr;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000757 LONG ret;
758
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000759 TRACE(class,"%x %x\n",hwnd, offset);
760
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000761 switch( offset )
762 {
Alexandre Julliard3051b641996-07-05 17:14:13 +0000763 case GCL_WNDPROC:
764 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
765 return (LONG)WINPROC_GetProc( wndPtr->class->winproc, WIN_PROC_16 );
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000766 case GCL_MENUNAME:
767 ret = GetClassLong32A( hwnd, offset );
768 return (LONG)SEGPTR_GET( (void *)ret );
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000769 default:
770 return GetClassLong32A( hwnd, offset );
771 }
Alexandre Julliard401710d1993-09-04 10:09:32 +0000772}
773
774
775/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +0000776 * GetClassLong32A (USER32.215)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000777 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000778LONG WINAPI GetClassLong32A( HWND32 hwnd, INT32 offset )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000779{
Alexandre Julliard401710d1993-09-04 10:09:32 +0000780 WND * wndPtr;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000781
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000782 TRACE(class,"%x %x\n",hwnd, offset);
783
Alexandre Julliard401710d1993-09-04 10:09:32 +0000784 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000785 if (offset >= 0)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000786 {
787 if (offset <= wndPtr->class->cbClsExtra - sizeof(LONG))
788 return GET_DWORD(((char *)wndPtr->class->wExtra) + offset);
789 }
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000790 switch(offset)
791 {
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000792 case GCL_STYLE: return (LONG)wndPtr->class->style;
793 case GCL_CBWNDEXTRA: return (LONG)wndPtr->class->cbWndExtra;
794 case GCL_CBCLSEXTRA: return (LONG)wndPtr->class->cbClsExtra;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000795 case GCL_HMODULE: return (LONG)wndPtr->class->hInstance;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000796 case GCL_WNDPROC:
Alexandre Julliard3051b641996-07-05 17:14:13 +0000797 return (LONG)WINPROC_GetProc(wndPtr->class->winproc, WIN_PROC_32A);
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000798 case GCL_MENUNAME:
799 return (LONG)CLASS_GetMenuNameA( wndPtr->class );
NF Stevensbe156661998-12-07 12:48:16 +0000800 case GCW_ATOM:
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000801 case GCL_HBRBACKGROUND:
802 case GCL_HCURSOR:
803 case GCL_HICON:
804 case GCL_HICONSM:
Alexandre Julliard21979011997-03-05 08:22:35 +0000805 return GetClassWord32( hwnd, offset );
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000806 }
Alexandre Julliarda845b881998-06-01 10:44:35 +0000807 WARN(class, "Invalid offset %d\n", offset);
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000808 return 0;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000809}
810
811
812/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +0000813 * GetClassLong32W (USER32.216)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000814 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000815LONG WINAPI GetClassLong32W( HWND32 hwnd, INT32 offset )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000816{
Alexandre Julliard401710d1993-09-04 10:09:32 +0000817 WND * wndPtr;
Alexandre Julliard3051b641996-07-05 17:14:13 +0000818
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000819 TRACE(class,"%x %x\n",hwnd, offset);
820
Alexandre Julliard3051b641996-07-05 17:14:13 +0000821 switch(offset)
822 {
823 case GCL_WNDPROC:
824 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
825 return (LONG)WINPROC_GetProc( wndPtr->class->winproc, WIN_PROC_32W );
826 case GCL_MENUNAME:
827 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
828 return (LONG)CLASS_GetMenuNameW( wndPtr->class );
829 default:
830 return GetClassLong32A( hwnd, offset );
831 }
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000832}
833
834
835/***********************************************************************
Alexandre Julliard21979011997-03-05 08:22:35 +0000836 * SetClassWord16 (USER.130)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000837 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000838WORD WINAPI SetClassWord16( HWND16 hwnd, INT16 offset, WORD newval )
Alexandre Julliard21979011997-03-05 08:22:35 +0000839{
840 return SetClassWord32( hwnd, offset, newval );
841}
842
843
844/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +0000845 * SetClassWord32 (USER32.469)
Alexandre Julliard21979011997-03-05 08:22:35 +0000846 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000847WORD WINAPI SetClassWord32( HWND32 hwnd, INT32 offset, WORD newval )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000848{
849 WND * wndPtr;
850 WORD retval = 0;
851 void *ptr;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000852
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000853 TRACE(class,"%x %x %x\n",hwnd, offset, newval);
854
Alexandre Julliard401710d1993-09-04 10:09:32 +0000855 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000856 if (offset >= 0)
857 {
Alexandre Julliard3051b641996-07-05 17:14:13 +0000858 if (offset + sizeof(WORD) <= wndPtr->class->cbClsExtra)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000859 ptr = ((char *)wndPtr->class->wExtra) + offset;
Alexandre Julliard3051b641996-07-05 17:14:13 +0000860 else
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000861 {
Alexandre Julliarda845b881998-06-01 10:44:35 +0000862 WARN( class, "Invalid offset %d\n", offset );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000863 return 0;
864 }
865 }
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000866 else switch(offset)
867 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000868 case GCW_STYLE:
869 case GCW_CBWNDEXTRA:
870 case GCW_CBCLSEXTRA:
871 case GCW_HMODULE:
872 return (WORD)SetClassLong32A( hwnd, offset, (LONG)newval );
873 case GCW_HBRBACKGROUND: ptr = &wndPtr->class->hbrBackground; break;
874 case GCW_HCURSOR: ptr = &wndPtr->class->hCursor; break;
875 case GCW_HICON: ptr = &wndPtr->class->hIcon; break;
876 case GCW_HICONSM: ptr = &wndPtr->class->hIconSm; break;
877 case GCW_ATOM: ptr = &wndPtr->class->atomName; break;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000878 default:
Alexandre Julliarda845b881998-06-01 10:44:35 +0000879 WARN( class, "Invalid offset %d\n", offset);
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000880 return 0;
881 }
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000882 retval = GET_WORD(ptr);
883 PUT_WORD( ptr, newval );
Gavriel Statec77c5921998-11-15 09:21:17 +0000884
885 /* Note: If the GCW_ATOM was changed, this means that the WNDCLASS className fields
886 need to be updated as well. Problem is that we can't tell whether the atom is
887 using wide or narrow characters. For now, we'll just NULL out the className
888 fields, and emit a FIXME. */
889 if (offset == GCW_ATOM)
890 {
891 CLASS_SetClassNameA( wndPtr->class, NULL );
892 FIXME(class,"GCW_ATOM changed for a class. Not updating className, so GetClassInfoEx may not return correct className!\n");
893 }
Alexandre Julliard401710d1993-09-04 10:09:32 +0000894 return retval;
895}
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000896
897
898/***********************************************************************
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000899 * SetClassLong16 (USER.132)
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000900 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000901LONG WINAPI SetClassLong16( HWND16 hwnd, INT16 offset, LONG newval )
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000902{
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000903 WND *wndPtr;
Alexandre Julliard3051b641996-07-05 17:14:13 +0000904 LONG retval;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000905
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000906 TRACE(class,"%x %x %lx\n",hwnd, offset, newval);
907
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000908 switch(offset)
909 {
910 case GCL_WNDPROC:
911 if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
Alexandre Julliard3051b641996-07-05 17:14:13 +0000912 retval = (LONG)WINPROC_GetProc( wndPtr->class->winproc, WIN_PROC_16 );
913 WINPROC_SetProc( &wndPtr->class->winproc, (WNDPROC16)newval,
Alexandre Julliarddf2673b1997-03-29 17:20:20 +0000914 WIN_PROC_16, WIN_PROC_CLASS );
Alexandre Julliard3051b641996-07-05 17:14:13 +0000915 return retval;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000916 case GCL_MENUNAME:
917 return SetClassLong32A( hwnd, offset, (LONG)PTR_SEG_TO_LIN(newval) );
918 default:
919 return SetClassLong32A( hwnd, offset, newval );
920 }
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000921}
922
923
924/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +0000925 * SetClassLong32A (USER32.467)
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000926 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000927LONG WINAPI SetClassLong32A( HWND32 hwnd, INT32 offset, LONG newval )
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000928{
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000929 WND * wndPtr;
930 LONG retval = 0;
931 void *ptr;
932
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000933 TRACE(class,"%x %x %lx\n",hwnd, offset, newval);
934
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000935 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
936 if (offset >= 0)
937 {
Alexandre Julliard3051b641996-07-05 17:14:13 +0000938 if (offset + sizeof(LONG) <= wndPtr->class->cbClsExtra)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000939 ptr = ((char *)wndPtr->class->wExtra) + offset;
940 else
941 {
Alexandre Julliarda845b881998-06-01 10:44:35 +0000942 WARN( class, "Invalid offset %d\n", offset );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000943 return 0;
944 }
945 }
946 else switch(offset)
947 {
948 case GCL_MENUNAME:
949 CLASS_SetMenuNameA( wndPtr->class, (LPCSTR)newval );
950 return 0; /* Old value is now meaningless anyway */
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000951 case GCL_WNDPROC:
Alexandre Julliard3051b641996-07-05 17:14:13 +0000952 retval = (LONG)WINPROC_GetProc( wndPtr->class->winproc,
953 WIN_PROC_32A );
954 WINPROC_SetProc( &wndPtr->class->winproc, (WNDPROC16)newval,
Alexandre Julliarddf2673b1997-03-29 17:20:20 +0000955 WIN_PROC_32A, WIN_PROC_CLASS );
Alexandre Julliard3051b641996-07-05 17:14:13 +0000956 return retval;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000957 case GCL_HBRBACKGROUND:
958 case GCL_HCURSOR:
959 case GCL_HICON:
960 case GCL_HICONSM:
Alexandre Julliard21979011997-03-05 08:22:35 +0000961 return SetClassWord32( hwnd, offset, (WORD)newval );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000962 case GCL_STYLE: ptr = &wndPtr->class->style; break;
963 case GCL_CBWNDEXTRA: ptr = &wndPtr->class->cbWndExtra; break;
964 case GCL_CBCLSEXTRA: ptr = &wndPtr->class->cbClsExtra; break;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000965 case GCL_HMODULE: ptr = &wndPtr->class->hInstance; break;
966 default:
Alexandre Julliarda845b881998-06-01 10:44:35 +0000967 WARN( class, "Invalid offset %d\n", offset );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000968 return 0;
969 }
970 retval = GET_DWORD(ptr);
971 PUT_DWORD( ptr, newval );
972 return retval;
973}
974
975
976/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +0000977 * SetClassLong32W (USER32.468)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000978 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000979LONG WINAPI SetClassLong32W( HWND32 hwnd, INT32 offset, LONG newval )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000980{
981 WND *wndPtr;
Alexandre Julliard3051b641996-07-05 17:14:13 +0000982 LONG retval;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000983
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000984 TRACE(class,"%x %x %lx\n",hwnd, offset, newval);
985
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000986 switch(offset)
987 {
988 case GCL_WNDPROC:
Alexandre Julliard3051b641996-07-05 17:14:13 +0000989 if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
990 retval = (LONG)WINPROC_GetProc( wndPtr->class->winproc, WIN_PROC_32W );
991 WINPROC_SetProc( &wndPtr->class->winproc, (WNDPROC16)newval,
Alexandre Julliarddf2673b1997-03-29 17:20:20 +0000992 WIN_PROC_32W, WIN_PROC_CLASS );
Alexandre Julliard3051b641996-07-05 17:14:13 +0000993 return retval;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000994 case GCL_MENUNAME:
Alexandre Julliard3051b641996-07-05 17:14:13 +0000995 if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000996 CLASS_SetMenuNameW( wndPtr->class, (LPCWSTR)newval );
997 return 0; /* Old value is now meaningless anyway */
998 default:
999 return SetClassLong32A( hwnd, offset, newval );
1000 }
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001001}
1002
1003
1004/***********************************************************************
1005 * GetClassName16 (USER.58)
1006 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001007INT16 WINAPI GetClassName16( HWND16 hwnd, LPSTR buffer, INT16 count )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001008{
1009 WND *wndPtr;
1010 if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
1011 return GlobalGetAtomName16( wndPtr->class->atomName, buffer, count );
1012}
1013
1014
1015/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +00001016 * GetClassName32A (USER32.217)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001017 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001018INT32 WINAPI GetClassName32A( HWND32 hwnd, LPSTR buffer, INT32 count )
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001019{ INT32 ret;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001020 WND *wndPtr;
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001021
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001022 if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001023 ret = GlobalGetAtomName32A( wndPtr->class->atomName, buffer, count );
1024
1025 TRACE(class,"%x %s %x\n",hwnd, buffer, count);
1026 return ret;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001027}
1028
1029
1030/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +00001031 * GetClassName32W (USER32.218)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001032 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001033INT32 WINAPI GetClassName32W( HWND32 hwnd, LPWSTR buffer, INT32 count )
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001034{ INT32 ret;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001035 WND *wndPtr;
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001036
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001037 if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001038 ret = GlobalGetAtomName32W( wndPtr->class->atomName, buffer, count );
1039
1040 TRACE(class,"%x %s %x\n",hwnd, debugstr_w(buffer), count);
1041
1042 return ret;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001043}
1044
1045
1046/***********************************************************************
1047 * GetClassInfo16 (USER.404)
1048 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001049BOOL16 WINAPI GetClassInfo16( HINSTANCE16 hInstance, SEGPTR name,
1050 WNDCLASS16 *wc )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001051{
1052 ATOM atom;
Alexandre Julliard5f721f81994-01-04 20:14:34 +00001053 CLASS *classPtr;
Alexandre Julliard3ed37e01994-11-07 18:20:42 +00001054
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001055 TRACE(class,"%x %p %p\n",hInstance, PTR_SEG_TO_LIN (name), wc);
1056
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001057 hInstance = GetExePtr( hInstance );
1058 if (!(atom = GlobalFindAtom16( name )) ||
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001059 !(classPtr = CLASS_FindClassByAtom( atom, hInstance )))
1060 return FALSE;
1061 if ((hInstance != classPtr->hInstance) &&
1062 !(classPtr->style & CS_GLOBALCLASS)) /*BWCC likes to pass hInstance=0*/
1063 return FALSE;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001064 wc->style = (UINT16)classPtr->style;
Alexandre Julliard3051b641996-07-05 17:14:13 +00001065 wc->lpfnWndProc = WINPROC_GetProc( classPtr->winproc, WIN_PROC_16 );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001066 wc->cbClsExtra = (INT16)classPtr->cbClsExtra;
1067 wc->cbWndExtra = (INT16)classPtr->cbWndExtra;
1068 wc->hInstance = (HINSTANCE16)classPtr->hInstance;
1069 wc->hIcon = classPtr->hIcon;
1070 wc->hCursor = classPtr->hCursor;
1071 wc->hbrBackground = classPtr->hbrBackground;
Gavriel Statec77c5921998-11-15 09:21:17 +00001072 wc->lpszClassName = (SEGPTR)CLASS_GetClassNameA( classPtr );;
NF Stevensa4066821998-12-01 08:29:29 +00001073 if (HIWORD(wc->lpszClassName)) /* Make it a SEGPTR */
1074 wc->lpszClassName = SEGPTR_GET( (LPSTR)wc->lpszClassName );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001075 wc->lpszMenuName = (SEGPTR)CLASS_GetMenuNameA( classPtr );
1076 if (HIWORD(wc->lpszMenuName)) /* Make it a SEGPTR */
1077 wc->lpszMenuName = SEGPTR_GET( (LPSTR)wc->lpszMenuName );
1078 return TRUE;
1079}
1080
1081
1082/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +00001083 * GetClassInfo32A (USER32.211)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001084 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001085BOOL32 WINAPI GetClassInfo32A( HINSTANCE32 hInstance, LPCSTR name,
1086 WNDCLASS32A *wc )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001087{
1088 ATOM atom;
1089 CLASS *classPtr;
1090
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001091 TRACE(class,"%x %p %p\n",hInstance, name, wc);
1092
1093 /* workaround: if hInstance=NULL you expect to get the system classes
1094 but this classes (as example from comctl32.dll SysListView) won't be
1095 registred with hInstance=NULL in WINE because of the late loading
1096 of this dll. fixes file dialogs in WinWord95 (jsch)*/
1097
1098 if (!(atom=GlobalFindAtom32A(name)) || !(classPtr=CLASS_FindClassByAtom(atom,hInstance)))
Alexandre Julliard21979011997-03-05 08:22:35 +00001099 return FALSE;
1100
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001101 if (classPtr->hInstance && (hInstance != classPtr->hInstance))
1102 {
1103 if (hInstance) return FALSE;
1104 else
1105 WARN(class,"systemclass %s (hInst=0) demanded but only class with hInst!=0 found\n",name);
1106 }
1107
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001108 wc->style = classPtr->style;
Alexandre Julliard3051b641996-07-05 17:14:13 +00001109 wc->lpfnWndProc = (WNDPROC32)WINPROC_GetProc( classPtr->winproc,
1110 WIN_PROC_32A );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001111 wc->cbClsExtra = classPtr->cbClsExtra;
1112 wc->cbWndExtra = classPtr->cbWndExtra;
1113 wc->hInstance = classPtr->hInstance;
1114 wc->hIcon = (HICON32)classPtr->hIcon;
1115 wc->hCursor = (HCURSOR32)classPtr->hCursor;
1116 wc->hbrBackground = (HBRUSH32)classPtr->hbrBackground;
1117 wc->lpszMenuName = CLASS_GetMenuNameA( classPtr );
Gavriel Statec77c5921998-11-15 09:21:17 +00001118 wc->lpszClassName = CLASS_GetClassNameA( classPtr );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001119 return TRUE;
1120}
1121
1122
1123/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +00001124 * GetClassInfo32W (USER32.214)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001125 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001126BOOL32 WINAPI GetClassInfo32W( HINSTANCE32 hInstance, LPCWSTR name,
1127 WNDCLASS32W *wc )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001128{
1129 ATOM atom;
1130 CLASS *classPtr;
1131
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001132 TRACE(class,"%x %p %p\n",hInstance, name, wc);
1133
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001134 if (!(atom = GlobalFindAtom32W( name )) ||
1135 !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
Alexandre Julliard21979011997-03-05 08:22:35 +00001136 (classPtr->hInstance && (hInstance != classPtr->hInstance)))
1137 return FALSE;
1138
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001139 wc->style = classPtr->style;
Alexandre Julliard3051b641996-07-05 17:14:13 +00001140 wc->lpfnWndProc = (WNDPROC32)WINPROC_GetProc( classPtr->winproc,
1141 WIN_PROC_32W );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001142 wc->cbClsExtra = classPtr->cbClsExtra;
1143 wc->cbWndExtra = classPtr->cbWndExtra;
1144 wc->hInstance = classPtr->hInstance;
1145 wc->hIcon = (HICON32)classPtr->hIcon;
1146 wc->hCursor = (HCURSOR32)classPtr->hCursor;
1147 wc->hbrBackground = (HBRUSH32)classPtr->hbrBackground;
1148 wc->lpszMenuName = CLASS_GetMenuNameW( classPtr );
Gavriel Statec77c5921998-11-15 09:21:17 +00001149 wc->lpszClassName = CLASS_GetClassNameW( classPtr );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001150 return TRUE;
1151}
1152
1153
1154/***********************************************************************
1155 * GetClassInfoEx16 (USER.398)
1156 *
1157 * FIXME: this is just a guess, I have no idea if GetClassInfoEx() is the
1158 * same in Win16 as in Win32. --AJ
1159 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001160BOOL16 WINAPI GetClassInfoEx16( HINSTANCE16 hInstance, SEGPTR name,
1161 WNDCLASSEX16 *wc )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001162{
1163 ATOM atom;
1164 CLASS *classPtr;
Alexandre Julliard808cb041995-08-17 17:11:36 +00001165
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001166 TRACE(class,"%x %p %p\n",hInstance,PTR_SEG_TO_LIN( name ), wc);
1167
Alexandre Julliard808cb041995-08-17 17:11:36 +00001168 hInstance = GetExePtr( hInstance );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001169 if (!(atom = GlobalFindAtom16( name )) ||
1170 !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
1171 (hInstance != classPtr->hInstance)) return FALSE;
1172 wc->style = classPtr->style;
Alexandre Julliard3051b641996-07-05 17:14:13 +00001173 wc->lpfnWndProc = WINPROC_GetProc( classPtr->winproc, WIN_PROC_16 );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001174 wc->cbClsExtra = (INT16)classPtr->cbClsExtra;
1175 wc->cbWndExtra = (INT16)classPtr->cbWndExtra;
1176 wc->hInstance = (HINSTANCE16)classPtr->hInstance;
1177 wc->hIcon = classPtr->hIcon;
1178 wc->hIconSm = classPtr->hIconSm;
1179 wc->hCursor = classPtr->hCursor;
1180 wc->hbrBackground = classPtr->hbrBackground;
1181 wc->lpszClassName = (SEGPTR)0;
1182 wc->lpszMenuName = (SEGPTR)CLASS_GetMenuNameA( classPtr );
1183 if (HIWORD(wc->lpszMenuName)) /* Make it a SEGPTR */
1184 wc->lpszMenuName = SEGPTR_GET( (LPSTR)wc->lpszMenuName );
Gavriel Statec77c5921998-11-15 09:21:17 +00001185 wc->lpszClassName = (SEGPTR)CLASS_GetClassNameA( classPtr );
1186 if (HIWORD(wc->lpszClassName)) /* Make it a SEGPTR */
1187 wc->lpszClassName = SEGPTR_GET( (LPSTR)wc->lpszClassName );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001188 return TRUE;
1189}
Alexandre Julliard5f721f81994-01-04 20:14:34 +00001190
Alexandre Julliard1285c2f1996-05-06 16:06:24 +00001191
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001192/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +00001193 * GetClassInfoEx32A (USER32.212)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001194 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001195BOOL32 WINAPI GetClassInfoEx32A( HINSTANCE32 hInstance, LPCSTR name,
1196 WNDCLASSEX32A *wc )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001197{
1198 ATOM atom;
1199 CLASS *classPtr;
1200
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001201 TRACE(class,"%x %p %p\n",hInstance, name, wc);
1202
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001203 if (!(atom = GlobalFindAtom32A( name )) ||
Alexandre Julliarda0d77311998-09-13 16:32:00 +00001204 !(classPtr = CLASS_FindClassByAtom( atom, hInstance ))
1205 /*|| (hInstance != classPtr->hInstance) */ ) return FALSE;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001206 wc->style = classPtr->style;
Alexandre Julliard3051b641996-07-05 17:14:13 +00001207 wc->lpfnWndProc = (WNDPROC32)WINPROC_GetProc( classPtr->winproc,
1208 WIN_PROC_32A );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001209 wc->cbClsExtra = classPtr->cbClsExtra;
1210 wc->cbWndExtra = classPtr->cbWndExtra;
1211 wc->hInstance = classPtr->hInstance;
1212 wc->hIcon = (HICON32)classPtr->hIcon;
1213 wc->hIconSm = (HICON32)classPtr->hIconSm;
1214 wc->hCursor = (HCURSOR32)classPtr->hCursor;
1215 wc->hbrBackground = (HBRUSH32)classPtr->hbrBackground;
1216 wc->lpszMenuName = CLASS_GetMenuNameA( classPtr );
Gavriel Statec77c5921998-11-15 09:21:17 +00001217 wc->lpszClassName = CLASS_GetClassNameA( classPtr );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001218 return TRUE;
1219}
1220
1221
1222/***********************************************************************
Alexandre Julliard54c27111998-03-29 19:44:57 +00001223 * GetClassInfoEx32W (USER32.213)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001224 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001225BOOL32 WINAPI GetClassInfoEx32W( HINSTANCE32 hInstance, LPCWSTR name,
1226 WNDCLASSEX32W *wc )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001227{
1228 ATOM atom;
1229 CLASS *classPtr;
1230
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001231 TRACE(class,"%x %p %p\n",hInstance, name, wc);
1232
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001233 if (!(atom = GlobalFindAtom32W( name )) ||
1234 !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
1235 (hInstance != classPtr->hInstance)) return FALSE;
1236 wc->style = classPtr->style;
Alexandre Julliard3051b641996-07-05 17:14:13 +00001237 wc->lpfnWndProc = (WNDPROC32)WINPROC_GetProc( classPtr->winproc,
1238 WIN_PROC_32W );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001239 wc->cbClsExtra = classPtr->cbClsExtra;
1240 wc->cbWndExtra = classPtr->cbWndExtra;
1241 wc->hInstance = classPtr->hInstance;
1242 wc->hIcon = (HICON32)classPtr->hIcon;
1243 wc->hIconSm = (HICON32)classPtr->hIconSm;
1244 wc->hCursor = (HCURSOR32)classPtr->hCursor;
1245 wc->hbrBackground = (HBRUSH32)classPtr->hbrBackground;
1246 wc->lpszMenuName = CLASS_GetMenuNameW( classPtr );
Gavriel Statec77c5921998-11-15 09:21:17 +00001247 wc->lpszClassName = CLASS_GetClassNameW( classPtr );;
Alexandre Julliard5f721f81994-01-04 20:14:34 +00001248 return TRUE;
1249}
Alexandre Julliarde2abbb11995-03-19 17:39:39 +00001250
1251
1252/***********************************************************************
1253 * ClassFirst (TOOLHELP.69)
1254 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001255BOOL16 WINAPI ClassFirst( CLASSENTRY *pClassEntry )
Alexandre Julliarde2abbb11995-03-19 17:39:39 +00001256{
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001257 TRACE(class,"%p\n",pClassEntry);
Alexandre Julliard2ace16a1996-04-28 15:09:19 +00001258 pClassEntry->wNext = 1;
Alexandre Julliarde2abbb11995-03-19 17:39:39 +00001259 return ClassNext( pClassEntry );
1260}
1261
1262
1263/***********************************************************************
1264 * ClassNext (TOOLHELP.70)
1265 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001266BOOL16 WINAPI ClassNext( CLASSENTRY *pClassEntry )
Alexandre Julliarde2abbb11995-03-19 17:39:39 +00001267{
Alexandre Julliard2ace16a1996-04-28 15:09:19 +00001268 int i;
1269 CLASS *class = firstClass;
Alexandre Julliarde2abbb11995-03-19 17:39:39 +00001270
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001271 TRACE(class,"%p\n",pClassEntry);
1272
Alexandre Julliard2ace16a1996-04-28 15:09:19 +00001273 if (!pClassEntry->wNext) return FALSE;
1274 for (i = 1; (i < pClassEntry->wNext) && class; i++) class = class->next;
1275 if (!class)
1276 {
1277 pClassEntry->wNext = 0;
1278 return FALSE;
1279 }
Alexandre Julliard1285c2f1996-05-06 16:06:24 +00001280 pClassEntry->hInst = class->hInstance;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +00001281 pClassEntry->wNext++;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001282 GlobalGetAtomName32A( class->atomName, pClassEntry->szClassName,
1283 sizeof(pClassEntry->szClassName) );
Alexandre Julliarde2abbb11995-03-19 17:39:39 +00001284 return TRUE;
1285}