Release 980215
[wine.git] / windows / property.c
blobc44f8710bf1b0b9cb62f56b9e318ed495617997b
1 /*
2 * Window properties
4 * Copyright 1995, 1996 Alexandre Julliard
5 */
7 #include <string.h>
8 #include "win.h"
9 #include "heap.h"
10 #include "stddebug.h"
11 #include "debug.h"
14 typedef struct tagPROPERTY
16 struct tagPROPERTY *next; /* Next property in window list */
17 HANDLE32 handle; /* User's data */
18 LPSTR string; /* Property string (or atom) */
19 } PROPERTY;
22 /***********************************************************************
23 * PROP_FindProp
25 static PROPERTY *PROP_FindProp( HWND32 hwnd, LPCSTR str )
27 ATOM atom;
28 PROPERTY *prop;
29 WND *pWnd = WIN_FindWndPtr( hwnd );
31 if (!pWnd) return NULL;
32 if (HIWORD(str))
34 atom = GlobalFindAtom32A( str );
35 for (prop = pWnd->pProp; prop; prop = prop->next)
37 if (HIWORD(prop->string))
39 if (!lstrcmpi32A( prop->string, str )) return prop;
41 else if (LOWORD(prop->string) == atom) return prop;
44 else /* atom */
46 atom = LOWORD(str);
47 for (prop = pWnd->pProp; (prop); prop = prop->next)
49 if (HIWORD(prop->string))
51 if (GlobalFindAtom32A( prop->string ) == atom) return prop;
53 else if (LOWORD(prop->string) == atom) return prop;
56 return NULL;
60 /***********************************************************************
61 * GetProp16 (USER.25)
63 HANDLE16 WINAPI GetProp16( HWND16 hwnd, LPCSTR str )
65 return (HANDLE16)GetProp32A( hwnd, str );
69 /***********************************************************************
70 * GetProp32A (USER32.280)
72 HANDLE32 WINAPI GetProp32A( HWND32 hwnd, LPCSTR str )
74 PROPERTY *prop = PROP_FindProp( hwnd, str );
76 if (HIWORD(str))
77 dprintf_prop( stddeb, "GetProp(%08x,'%s'): returning %08x\n",
78 hwnd, str, prop ? prop->handle : 0 );
79 else
80 dprintf_prop( stddeb, "GetProp(%08x,#%04x): returning %08x\n",
81 hwnd, LOWORD(str), prop ? prop->handle : 0 );
83 return prop ? prop->handle : 0;
87 /***********************************************************************
88 * GetProp32W (USER32.281)
90 HANDLE32 WINAPI GetProp32W( HWND32 hwnd, LPCWSTR str )
92 LPSTR strA;
93 HANDLE32 ret;
95 if (!HIWORD(str)) return GetProp32A( hwnd, (LPCSTR)(UINT32)LOWORD(str) );
96 strA = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
97 ret = GetProp32A( hwnd, strA );
98 HeapFree( GetProcessHeap(), 0, strA );
99 return ret;
103 /***********************************************************************
104 * SetProp16 (USER.26)
106 BOOL16 WINAPI SetProp16( HWND16 hwnd, LPCSTR str, HANDLE16 handle )
108 return (BOOL16)SetProp32A( hwnd, str, handle );
112 /***********************************************************************
113 * SetProp32A (USER32.496)
115 BOOL32 WINAPI SetProp32A( HWND32 hwnd, LPCSTR str, HANDLE32 handle )
117 PROPERTY *prop;
119 if (HIWORD(str))
120 dprintf_prop( stddeb, "SetProp: %04x '%s' %08x\n", hwnd, str, handle );
121 else
122 dprintf_prop( stddeb, "SetProp: %04x #%04x %08x\n",
123 hwnd, LOWORD(str), handle );
125 if (!(prop = PROP_FindProp( hwnd, str )))
127 /* We need to create it */
128 WND *pWnd = WIN_FindWndPtr( hwnd );
129 if (!pWnd) return FALSE;
130 if (!(prop = HeapAlloc( SystemHeap, 0, sizeof(*prop) ))) return FALSE;
131 if (!(prop->string = SEGPTR_STRDUP(str)))
133 HeapFree( SystemHeap, 0, prop );
134 return FALSE;
136 prop->next = pWnd->pProp;
137 pWnd->pProp = prop;
139 prop->handle = handle;
140 return TRUE;
144 /***********************************************************************
145 * SetProp32W (USER32.497)
147 BOOL32 WINAPI SetProp32W( HWND32 hwnd, LPCWSTR str, HANDLE32 handle )
149 BOOL32 ret;
150 LPSTR strA;
152 if (!HIWORD(str))
153 return SetProp32A( hwnd, (LPCSTR)(UINT32)LOWORD(str), handle );
154 strA = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
155 ret = SetProp32A( hwnd, strA, handle );
156 HeapFree( GetProcessHeap(), 0, strA );
157 return ret;
161 /***********************************************************************
162 * RemoveProp16 (USER.24)
164 HANDLE16 WINAPI RemoveProp16( HWND16 hwnd, LPCSTR str )
166 return (HANDLE16)RemoveProp32A( hwnd, str );
170 /***********************************************************************
171 * RemoveProp32A (USER32.441)
173 HANDLE32 WINAPI RemoveProp32A( HWND32 hwnd, LPCSTR str )
175 ATOM atom;
176 HANDLE32 handle;
177 PROPERTY **pprop, *prop;
178 WND *pWnd = WIN_FindWndPtr( hwnd );
180 if (HIWORD(str))
181 dprintf_prop( stddeb, "RemoveProp: %04x '%s'\n", hwnd, str );
182 else
183 dprintf_prop( stddeb, "RemoveProp: %04x #%04x\n", hwnd, LOWORD(str));
186 if (!pWnd) return NULL;
187 if (HIWORD(str))
189 atom = GlobalFindAtom32A( str );
190 for (pprop=(PROPERTY**)&pWnd->pProp; (*pprop); pprop = &(*pprop)->next)
192 if (HIWORD((*pprop)->string))
194 if (!lstrcmpi32A( (*pprop)->string, str )) break;
196 else if (LOWORD((*pprop)->string) == atom) break;
199 else /* atom */
201 atom = LOWORD(str);
202 for (pprop=(PROPERTY**)&pWnd->pProp; (*pprop); pprop = &(*pprop)->next)
204 if (HIWORD((*pprop)->string))
206 if (GlobalFindAtom32A( (*pprop)->string ) == atom) break;
208 else if (LOWORD((*pprop)->string) == atom) break;
211 if (!*pprop) return 0;
212 prop = *pprop;
213 handle = prop->handle;
214 *pprop = prop->next;
215 SEGPTR_FREE(prop->string);
216 HeapFree( SystemHeap, 0, prop );
217 return handle;
221 /***********************************************************************
222 * RemoveProp32W (USER32.442)
224 HANDLE32 WINAPI RemoveProp32W( HWND32 hwnd, LPCWSTR str )
226 LPSTR strA;
227 HANDLE32 ret;
229 if (!HIWORD(str))
230 return RemoveProp32A( hwnd, (LPCSTR)(UINT32)LOWORD(str) );
231 strA = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
232 ret = RemoveProp32A( hwnd, strA );
233 HeapFree( GetProcessHeap(), 0, strA );
234 return ret;
238 /***********************************************************************
239 * PROPERTY_RemoveWindowProps
241 * Remove all properties of a window.
243 void PROPERTY_RemoveWindowProps( WND *pWnd )
245 PROPERTY *prop, *next;
247 for (prop = pWnd->pProp; (prop); prop = next)
249 next = prop->next;
250 SEGPTR_FREE( prop->string );
251 HeapFree( SystemHeap, 0, prop );
253 pWnd->pProp = NULL;
257 /***********************************************************************
258 * EnumProps16 (USER.27)
260 INT16 WINAPI EnumProps16( HWND16 hwnd, PROPENUMPROC16 func )
262 PROPERTY *prop, *next;
263 WND *pWnd;
264 INT16 ret = -1;
266 dprintf_prop( stddeb, "EnumProps: %04x %08x\n", hwnd, (UINT32)func );
267 if (!(pWnd = WIN_FindWndPtr( hwnd ))) return -1;
268 for (prop = pWnd->pProp; (prop); prop = next)
270 /* Already get the next in case the callback */
271 /* function removes the current property. */
272 next = prop->next;
274 dprintf_prop( stddeb, " Callback: handle=%08x str='%s'\n",
275 prop->handle, prop->string );
276 ret = func( hwnd, SEGPTR_GET(prop->string), prop->handle );
277 if (!ret) break;
279 return ret;
283 /***********************************************************************
284 * EnumProps32A (USER32.185)
286 INT32 WINAPI EnumProps32A( HWND32 hwnd, PROPENUMPROC32A func )
288 return EnumPropsEx32A( hwnd, (PROPENUMPROCEX32A)func, 0 );
292 /***********************************************************************
293 * EnumProps32W (USER32.188)
295 INT32 WINAPI EnumProps32W( HWND32 hwnd, PROPENUMPROC32W func )
297 return EnumPropsEx32W( hwnd, (PROPENUMPROCEX32W)func, 0 );
301 /***********************************************************************
302 * EnumPropsEx32A (USER32.186)
304 INT32 WINAPI EnumPropsEx32A(HWND32 hwnd, PROPENUMPROCEX32A func, LPARAM lParam)
306 PROPERTY *prop, *next;
307 WND *pWnd;
308 INT32 ret = -1;
310 dprintf_prop( stddeb, "EnumPropsEx32A: %04x %08x %08lx\n",
311 hwnd, (UINT32)func, lParam );
312 if (!(pWnd = WIN_FindWndPtr( hwnd ))) return -1;
313 for (prop = pWnd->pProp; (prop); prop = next)
315 /* Already get the next in case the callback */
316 /* function removes the current property. */
317 next = prop->next;
319 dprintf_prop( stddeb, " Callback: handle=%08x str='%s'\n",
320 prop->handle, prop->string );
321 ret = func( hwnd, prop->string, prop->handle, lParam );
322 if (!ret) break;
324 return ret;
328 /***********************************************************************
329 * EnumPropsEx32W (USER32.187)
331 INT32 WINAPI EnumPropsEx32W(HWND32 hwnd, PROPENUMPROCEX32W func, LPARAM lParam)
333 PROPERTY *prop, *next;
334 WND *pWnd;
335 INT32 ret = -1;
337 dprintf_prop( stddeb, "EnumPropsEx32W: %04x %08x %08lx\n",
338 hwnd, (UINT32)func, lParam );
339 if (!(pWnd = WIN_FindWndPtr( hwnd ))) return -1;
340 for (prop = pWnd->pProp; (prop); prop = next)
342 /* Already get the next in case the callback */
343 /* function removes the current property. */
344 next = prop->next;
346 dprintf_prop( stddeb, " Callback: handle=%08x str='%s'\n",
347 prop->handle, prop->string );
348 if (HIWORD(prop->string))
350 LPWSTR str = HEAP_strdupAtoW( GetProcessHeap(), 0, prop->string );
351 ret = func( hwnd, str, prop->handle, lParam );
352 HeapFree( GetProcessHeap(), 0, str );
354 else
355 ret = func( hwnd, (LPCWSTR)(UINT32)LOWORD( prop->string ),
356 prop->handle, lParam );
357 if (!ret) break;
359 return ret;