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
25 #include "wine/winuser16.h"
26 #include "wine/server.h"
28 /* size of buffer needed to store an atom string */
29 #define ATOM_BUFFER_SIZE 256
31 /* ### start build ### */
32 extern WORD CALLBACK
PROP_CallTo16_word_wlw(PROPENUMPROC16
,WORD
,LONG
,WORD
);
33 /* ### stop build ### */
35 /***********************************************************************
38 * Retrieve the list of properties of a given window.
39 * Returned buffer must be freed by caller.
41 static property_data_t
*get_properties( HWND hwnd
, int *count
)
43 property_data_t
*data
;
49 if (!(data
= HeapAlloc( GetProcessHeap(), 0, total
* sizeof(*data
) ))) break;
51 SERVER_START_REQ( get_window_properties
)
54 wine_server_add_data( req
, data
, total
* sizeof(*data
) );
55 if (!wine_server_call( req
)) res
= reply
->total
;
58 if (res
&& res
<= total
)
63 HeapFree( GetProcessHeap(), 0, data
);
64 total
= res
; /* restart with larger buffer */
70 /***********************************************************************
73 * relay to call the EnumProps callback function from EnumPropsEx
75 static BOOL CALLBACK
EnumPropsA_relay( HWND hwnd
, LPCSTR str
, HANDLE handle
, ULONG_PTR lparam
)
77 PROPENUMPROCA func
= (PROPENUMPROCA
)lparam
;
78 return func( hwnd
, str
, handle
);
82 /***********************************************************************
85 * relay to call the EnumProps callback function from EnumPropsEx
87 static BOOL CALLBACK
EnumPropsW_relay( HWND hwnd
, LPCWSTR str
, HANDLE handle
, ULONG_PTR lparam
)
89 PROPENUMPROCW func
= (PROPENUMPROCW
)lparam
;
90 return func( hwnd
, str
, handle
);
94 /***********************************************************************
95 * EnumPropsA (USER32.@)
97 INT WINAPI
EnumPropsA( HWND hwnd
, PROPENUMPROCA func
)
99 return EnumPropsExA( hwnd
, EnumPropsA_relay
, (LPARAM
)func
);
103 /***********************************************************************
104 * EnumPropsW (USER32.@)
106 INT WINAPI
EnumPropsW( HWND hwnd
, PROPENUMPROCW func
)
108 return EnumPropsExW( hwnd
, EnumPropsW_relay
, (LPARAM
)func
);
112 /***********************************************************************
113 * GetPropA (USER32.@)
115 HANDLE WINAPI
GetPropA( HWND hwnd
, LPCSTR str
)
120 if (!HIWORD(str
)) atom
= LOWORD(str
);
121 else if (!(atom
= GlobalFindAtomA( str
))) return 0;
123 SERVER_START_REQ( get_window_property
)
127 if (!wine_server_call_err( req
)) ret
= reply
->handle
;
134 /***********************************************************************
135 * GetPropW (USER32.@)
137 HANDLE WINAPI
GetPropW( HWND hwnd
, LPCWSTR str
)
142 if (!HIWORD(str
)) atom
= LOWORD(str
);
143 else if (!(atom
= GlobalFindAtomW( str
))) return 0;
145 SERVER_START_REQ( get_window_property
)
149 if (!wine_server_call_err( req
)) ret
= reply
->handle
;
156 /***********************************************************************
157 * SetPropA (USER32.@)
159 BOOL WINAPI
SetPropA( HWND hwnd
, LPCSTR str
, HANDLE handle
)
164 if (!HIWORD(str
)) atom
= LOWORD(str
);
165 else if (!(atom
= GlobalAddAtomA( str
))) return FALSE
;
167 SERVER_START_REQ( set_window_property
)
171 req
->string
= (HIWORD(str
) != 0);
172 req
->handle
= handle
;
173 ret
= !wine_server_call_err( req
);
177 if (HIWORD(str
)) GlobalDeleteAtom( atom
);
182 /***********************************************************************
183 * SetPropW (USER32.@)
185 BOOL WINAPI
SetPropW( HWND hwnd
, LPCWSTR str
, HANDLE handle
)
190 if (!HIWORD(str
)) atom
= LOWORD(str
);
191 else if (!(atom
= GlobalAddAtomW( str
))) return FALSE
;
193 SERVER_START_REQ( set_window_property
)
197 req
->string
= (HIWORD(str
) != 0);
198 req
->handle
= handle
;
199 ret
= !wine_server_call_err( req
);
203 if (HIWORD(str
)) GlobalDeleteAtom( atom
);
208 /***********************************************************************
209 * RemovePropA (USER32.@)
211 HANDLE WINAPI
RemovePropA( HWND hwnd
, LPCSTR str
)
216 if (!HIWORD(str
)) return RemovePropW( hwnd
, MAKEINTATOMW(LOWORD(str
)) );
218 if ((atom
= GlobalAddAtomA( str
)))
220 ret
= RemovePropW( hwnd
, MAKEINTATOMW(atom
) );
221 GlobalDeleteAtom( atom
);
227 /***********************************************************************
228 * RemovePropW (USER32.@)
230 HANDLE WINAPI
RemovePropW( HWND hwnd
, LPCWSTR str
)
235 if (!HIWORD(str
)) atom
= LOWORD(str
);
236 else if (!(atom
= GlobalAddAtomW( str
))) return 0;
238 SERVER_START_REQ( remove_window_property
)
242 if (!wine_server_call_err( req
)) ret
= reply
->handle
;
246 if (HIWORD(str
)) GlobalDeleteAtom( atom
);
251 /***********************************************************************
252 * EnumPropsExA (USER32.@)
254 INT WINAPI
EnumPropsExA(HWND hwnd
, PROPENUMPROCEXA func
, LPARAM lParam
)
256 int ret
= -1, i
, count
;
257 property_data_t
*list
= get_properties( hwnd
, &count
);
261 for (i
= 0; i
< count
; i
++)
263 char string
[ATOM_BUFFER_SIZE
];
264 if (!GlobalGetAtomNameA( list
[i
].atom
, string
, ATOM_BUFFER_SIZE
)) continue;
265 if (!(ret
= func( hwnd
, string
, list
[i
].handle
, lParam
))) break;
267 HeapFree( GetProcessHeap(), 0, list
);
273 /***********************************************************************
274 * EnumPropsExW (USER32.@)
276 INT WINAPI
EnumPropsExW(HWND hwnd
, PROPENUMPROCEXW func
, LPARAM lParam
)
278 int ret
= -1, i
, count
;
279 property_data_t
*list
= get_properties( hwnd
, &count
);
283 for (i
= 0; i
< count
; i
++)
285 WCHAR string
[ATOM_BUFFER_SIZE
];
286 if (!GlobalGetAtomNameW( list
[i
].atom
, string
, ATOM_BUFFER_SIZE
)) continue;
287 if (!(ret
= func( hwnd
, string
, list
[i
].handle
, lParam
))) break;
289 HeapFree( GetProcessHeap(), 0, list
);
295 /***********************************************************************
296 * EnumProps (USER.27)
298 INT16 WINAPI
EnumProps16( HWND16 hwnd
, PROPENUMPROC16 func
)
300 int ret
= -1, i
, count
;
301 property_data_t
*list
= get_properties( hwnd
, &count
);
305 char string
[ATOM_BUFFER_SIZE
];
306 SEGPTR segptr
= MapLS( string
);
307 for (i
= 0; i
< count
; i
++)
309 if (list
[i
].string
) /* it was a string originally */
311 if (!GlobalGetAtomNameA( list
[i
].atom
, string
, ATOM_BUFFER_SIZE
)) continue;
312 ret
= PROP_CallTo16_word_wlw( func
, hwnd
, segptr
, list
[i
].handle
);
315 ret
= PROP_CallTo16_word_wlw( func
, hwnd
, list
[i
].atom
, list
[i
].handle
);
319 HeapFree( GetProcessHeap(), 0, list
);