4 * Copyright 1995, 1996 Alexandre Julliard
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) */
22 /***********************************************************************
25 static PROPERTY
*PROP_FindProp( HWND32 hwnd
, LPCSTR str
)
29 WND
*pWnd
= WIN_FindWndPtr( hwnd
);
31 if (!pWnd
) return NULL
;
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
;
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
;
60 /***********************************************************************
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
);
77 dprintf_prop( stddeb
, "GetProp(%08x,'%s'): returning %08x\n",
78 hwnd
, str
, prop
? prop
->handle
: 0 );
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
)
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
);
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
)
120 dprintf_prop( stddeb
, "SetProp: %04x '%s' %08x\n", hwnd
, str
, handle
);
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
);
136 prop
->next
= pWnd
->pProp
;
139 prop
->handle
= handle
;
144 /***********************************************************************
145 * SetProp32W (USER32.497)
147 BOOL32 WINAPI
SetProp32W( HWND32 hwnd
, LPCWSTR str
, HANDLE32 handle
)
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
);
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
)
177 PROPERTY
**pprop
, *prop
;
178 WND
*pWnd
= WIN_FindWndPtr( hwnd
);
181 dprintf_prop( stddeb
, "RemoveProp: %04x '%s'\n", hwnd
, str
);
183 dprintf_prop( stddeb
, "RemoveProp: %04x #%04x\n", hwnd
, LOWORD(str
));
186 if (!pWnd
) return NULL
;
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;
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;
213 handle
= prop
->handle
;
215 SEGPTR_FREE(prop
->string
);
216 HeapFree( SystemHeap
, 0, prop
);
221 /***********************************************************************
222 * RemoveProp32W (USER32.442)
224 HANDLE32 WINAPI
RemoveProp32W( HWND32 hwnd
, LPCWSTR 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
);
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
)
250 SEGPTR_FREE( prop
->string
);
251 HeapFree( SystemHeap
, 0, prop
);
257 /***********************************************************************
258 * EnumProps16 (USER.27)
260 INT16 WINAPI
EnumProps16( HWND16 hwnd
, PROPENUMPROC16 func
)
262 PROPERTY
*prop
, *next
;
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. */
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
);
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
;
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. */
319 dprintf_prop( stddeb
, " Callback: handle=%08x str='%s'\n",
320 prop
->handle
, prop
->string
);
321 ret
= func( hwnd
, prop
->string
, prop
->handle
, lParam
);
328 /***********************************************************************
329 * EnumPropsEx32W (USER32.187)
331 INT32 WINAPI
EnumPropsEx32W(HWND32 hwnd
, PROPENUMPROCEX32W func
, LPARAM lParam
)
333 PROPERTY
*prop
, *next
;
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. */
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
);
355 ret
= func( hwnd
, (LPCWSTR
)(UINT32
)LOWORD( prop
->string
),
356 prop
->handle
, lParam
);