- Pass infoPtr around in month calendar control.
[wine/gsoc_dplay.git] / dlls / user / property.c
blob8d36dce86b0ae7b26b4563d092ffc7a595b657b4
1 /*
2 * Window properties
4 * Copyright 1995, 1996, 2001 Alexandre Julliard
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include "config.h"
22 #include "wine/port.h"
24 #include <stdarg.h>
25 #include <string.h>
27 #include "windef.h"
28 #include "winbase.h"
29 #include "wingdi.h"
30 #include "wownt32.h"
31 #include "wine/winuser16.h"
32 #include "wine/server.h"
33 #include "win.h"
35 /* size of buffer needed to store an atom string */
36 #define ATOM_BUFFER_SIZE 256
39 /***********************************************************************
40 * get_properties
42 * Retrieve the list of properties of a given window.
43 * Returned buffer must be freed by caller.
45 static property_data_t *get_properties( HWND hwnd, int *count )
47 property_data_t *data;
48 int total = 32;
50 while (total)
52 int res = 0;
53 if (!(data = HeapAlloc( GetProcessHeap(), 0, total * sizeof(*data) ))) break;
54 *count = 0;
55 SERVER_START_REQ( get_window_properties )
57 req->window = hwnd;
58 wine_server_add_data( req, data, total * sizeof(*data) );
59 if (!wine_server_call( req )) res = reply->total;
61 SERVER_END_REQ;
62 if (res && res <= total)
64 *count = res;
65 return data;
67 HeapFree( GetProcessHeap(), 0, data );
68 total = res; /* restart with larger buffer */
70 return NULL;
74 /***********************************************************************
75 * EnumPropsA_relay
77 * relay to call the EnumProps callback function from EnumPropsEx
79 static BOOL CALLBACK EnumPropsA_relay( HWND hwnd, LPCSTR str, HANDLE handle, ULONG_PTR lparam )
81 PROPENUMPROCA func = (PROPENUMPROCA)lparam;
82 return func( hwnd, str, handle );
86 /***********************************************************************
87 * EnumPropsW_relay
89 * relay to call the EnumProps callback function from EnumPropsEx
91 static BOOL CALLBACK EnumPropsW_relay( HWND hwnd, LPCWSTR str, HANDLE handle, ULONG_PTR lparam )
93 PROPENUMPROCW func = (PROPENUMPROCW)lparam;
94 return func( hwnd, str, handle );
98 /***********************************************************************
99 * EnumPropsA (USER32.@)
101 INT WINAPI EnumPropsA( HWND hwnd, PROPENUMPROCA func )
103 return EnumPropsExA( hwnd, EnumPropsA_relay, (LPARAM)func );
107 /***********************************************************************
108 * EnumPropsW (USER32.@)
110 INT WINAPI EnumPropsW( HWND hwnd, PROPENUMPROCW func )
112 return EnumPropsExW( hwnd, EnumPropsW_relay, (LPARAM)func );
116 /***********************************************************************
117 * GetPropA (USER32.@)
119 HANDLE WINAPI GetPropA( HWND hwnd, LPCSTR str )
121 ATOM atom;
122 HANDLE ret = 0;
124 if (!HIWORD(str)) atom = LOWORD(str);
125 else if (!(atom = GlobalFindAtomA( str ))) return 0;
127 SERVER_START_REQ( get_window_property )
129 req->window = hwnd;
130 req->atom = atom;
131 if (!wine_server_call_err( req )) ret = reply->handle;
133 SERVER_END_REQ;
134 return ret;
138 /***********************************************************************
139 * GetPropW (USER32.@)
141 HANDLE WINAPI GetPropW( HWND hwnd, LPCWSTR str )
143 ATOM atom;
144 HANDLE ret = 0;
146 if (!HIWORD(str)) atom = LOWORD(str);
147 else if (!(atom = GlobalFindAtomW( str ))) return 0;
149 SERVER_START_REQ( get_window_property )
151 req->window = hwnd;
152 req->atom = atom;
153 if (!wine_server_call_err( req )) ret = reply->handle;
155 SERVER_END_REQ;
156 return ret;
160 /***********************************************************************
161 * SetPropA (USER32.@)
163 BOOL WINAPI SetPropA( HWND hwnd, LPCSTR str, HANDLE handle )
165 ATOM atom;
166 BOOL ret;
168 if (!HIWORD(str)) atom = LOWORD(str);
169 else if (!(atom = GlobalAddAtomA( str ))) return FALSE;
171 SERVER_START_REQ( set_window_property )
173 req->window = hwnd;
174 req->atom = atom;
175 req->string = (HIWORD(str) != 0);
176 req->handle = handle;
177 ret = !wine_server_call_err( req );
179 SERVER_END_REQ;
181 if (HIWORD(str)) GlobalDeleteAtom( atom );
182 return ret;
186 /***********************************************************************
187 * SetPropW (USER32.@)
189 BOOL WINAPI SetPropW( HWND hwnd, LPCWSTR str, HANDLE handle )
191 ATOM atom;
192 BOOL ret;
194 if (!HIWORD(str)) atom = LOWORD(str);
195 else if (!(atom = GlobalAddAtomW( str ))) return FALSE;
197 SERVER_START_REQ( set_window_property )
199 req->window = hwnd;
200 req->atom = atom;
201 req->string = (HIWORD(str) != 0);
202 req->handle = handle;
203 ret = !wine_server_call_err( req );
205 SERVER_END_REQ;
207 if (HIWORD(str)) GlobalDeleteAtom( atom );
208 return ret;
212 /***********************************************************************
213 * RemovePropA (USER32.@)
215 HANDLE WINAPI RemovePropA( HWND hwnd, LPCSTR str )
217 ATOM atom;
218 HANDLE ret = 0;
220 if (!HIWORD(str)) return RemovePropW( hwnd, MAKEINTATOMW(LOWORD(str)) );
222 if ((atom = GlobalAddAtomA( str )))
224 ret = RemovePropW( hwnd, MAKEINTATOMW(atom) );
225 GlobalDeleteAtom( atom );
227 return ret;
231 /***********************************************************************
232 * RemovePropW (USER32.@)
234 HANDLE WINAPI RemovePropW( HWND hwnd, LPCWSTR str )
236 ATOM atom;
237 HANDLE ret = 0;
239 if (!HIWORD(str)) atom = LOWORD(str);
240 else if (!(atom = GlobalAddAtomW( str ))) return 0;
242 SERVER_START_REQ( remove_window_property )
244 req->window = hwnd;
245 req->atom = atom;
246 if (!wine_server_call_err( req )) ret = reply->handle;
248 SERVER_END_REQ;
250 if (HIWORD(str)) GlobalDeleteAtom( atom );
251 return ret;
255 /***********************************************************************
256 * EnumPropsExA (USER32.@)
258 INT WINAPI EnumPropsExA(HWND hwnd, PROPENUMPROCEXA func, LPARAM lParam)
260 int ret = -1, i, count;
261 property_data_t *list = get_properties( hwnd, &count );
263 if (list)
265 for (i = 0; i < count; i++)
267 char string[ATOM_BUFFER_SIZE];
268 if (!GlobalGetAtomNameA( list[i].atom, string, ATOM_BUFFER_SIZE )) continue;
269 if (!(ret = func( hwnd, string, list[i].handle, lParam ))) break;
271 HeapFree( GetProcessHeap(), 0, list );
273 return ret;
277 /***********************************************************************
278 * EnumPropsExW (USER32.@)
280 INT WINAPI EnumPropsExW(HWND hwnd, PROPENUMPROCEXW func, LPARAM lParam)
282 int ret = -1, i, count;
283 property_data_t *list = get_properties( hwnd, &count );
285 if (list)
287 for (i = 0; i < count; i++)
289 WCHAR string[ATOM_BUFFER_SIZE];
290 if (!GlobalGetAtomNameW( list[i].atom, string, ATOM_BUFFER_SIZE )) continue;
291 if (!(ret = func( hwnd, string, list[i].handle, lParam ))) break;
293 HeapFree( GetProcessHeap(), 0, list );
295 return ret;
299 /***********************************************************************
300 * EnumProps (USER.27)
302 INT16 WINAPI EnumProps16( HWND16 hwnd, PROPENUMPROC16 func )
304 int ret = -1, i, count;
305 property_data_t *list = get_properties( HWND_32(hwnd), &count );
307 if (list)
309 char string[ATOM_BUFFER_SIZE];
310 SEGPTR segptr = MapLS( string );
311 WORD args[4];
312 DWORD result;
314 for (i = 0; i < count; i++)
316 if (list[i].string) /* it was a string originally */
318 if (!GlobalGetAtomNameA( list[i].atom, string, ATOM_BUFFER_SIZE )) continue;
319 args[3] = hwnd;
320 args[2] = SELECTOROF(segptr);
321 args[1] = OFFSETOF(segptr);
322 args[0] = LOWORD(list[i].handle);
324 else
326 args[3] = hwnd;
327 args[2] = 0;
328 args[1] = list[i].atom;
329 args[0] = LOWORD(list[i].handle);
331 WOWCallback16Ex( (DWORD)func, WCB16_PASCAL, sizeof(args), args, &result );
332 if (!(ret = LOWORD(result))) break;
334 UnMapLS( segptr );
335 HeapFree( GetProcessHeap(), 0, list );
337 return ret;