~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Wine Cross Reference
wine/dlls/user32/property.c

Version: ~ [ wine-1.5.30 ] ~ [ wine-1.5.29 ] ~ [ wine-1.5.28 ] ~ [ wine-1.5.27 ] ~ [ wine-1.5.26 ] ~ [ wine-1.5.25 ] ~ [ wine-1.5.24 ] ~ [ wine-1.5.23 ] ~ [ wine-1.5.22 ] ~ [ wine-1.5.21 ] ~ [ wine-1.5.20 ] ~ [ wine-1.5.19 ] ~ [ wine-1.5.18 ] ~ [ wine-1.5.17 ] ~ [ wine-1.5.16 ] ~ [ wine-1.5.15 ] ~ [ wine-1.5.14 ] ~ [ wine-1.5.13 ] ~ [ wine-1.5.12 ] ~ [ wine-1.5.11 ] ~ [ wine-1.5.10 ] ~ [ wine-1.5.9 ] ~ [ wine-1.5.8 ] ~ [ wine-1.5.7 ] ~ [ wine-1.4.1 ] ~ [ wine-1.5.6 ] ~ [ wine-1.5.5 ] ~ [ wine-1.5.4 ] ~ [ wine-1.5.3 ] ~ [ wine-1.5.2 ] ~ [ wine-1.5.1 ] ~ [ wine-1.5.0 ] ~ [ wine-1.4 ] ~ [ wine-1.4-rc6 ] ~ [ wine-1.4-rc5 ] ~ [ wine-1.4-rc4 ] ~ [ wine-1.4-rc3 ] ~ [ wine-1.4-rc2 ] ~ [ wine-1.4-rc1 ] ~ [ wine-1.3.37 ] ~ [ wine-1.3.36 ] ~ [ wine-1.3.35 ] ~ [ wine-1.3.34 ] ~ [ wine-1.3.33 ] ~ [ wine-1.3.32 ] ~ [ wine-1.3.31 ] ~ [ wine-1.3.30 ] ~ [ wine-1.3.29 ] ~ [ wine-1.3.28 ] ~ [ wine-1.3.27 ] ~ [ wine-1.3.26 ] ~ [ wine-1.3.25 ] ~ [ wine-1.3.24 ] ~ [ wine-1.3.23 ] ~ [ wine-1.3.22 ] ~ [ wine-1.3.21 ] ~ [ wine-1.3.20 ] ~ [ wine-1.3.19 ] ~ [ wine-1.3.18 ] ~ [ wine-1.2.3 ] ~ [ wine-1.3.17 ] ~ [ wine-1.3.16 ] ~ [ wine-1.3.15 ] ~ [ wine-1.3.14 ] ~ [ wine-1.3.13 ] ~ [ wine-1.3.12 ] ~ [ wine-1.3.11 ] ~ [ wine-1.3.10 ] ~ [ wine-1.3.9 ] ~ [ wine-1.2.2 ] ~ [ wine-1.3.8 ] ~ [ wine-1.3.7 ] ~ [ wine-1.3.6 ] ~ [ wine-1.3.5 ] ~ [ wine-1.2.1 ] ~ [ wine-1.3.4 ] ~ [ wine-1.3.3 ] ~ [ wine-1.3.2 ] ~ [ wine-1.3.1 ] ~ [ wine-1.3.0 ] ~ [ wine-1.2 ] ~ [ wine-1.2-rc7 ] ~ [ wine-1.2-rc6 ] ~ [ wine-1.2-rc5 ] ~ [ wine-1.2-rc4 ] ~ [ wine-1.2-rc3 ] ~ [ wine-1.2-rc2 ] ~ [ wine-1.2-rc1 ] ~ [ wine-1.1.44 ] ~ [ wine-1.1.43 ] ~ [ wine-1.1.42 ] ~ [ wine-1.1.41 ] ~ [ wine-1.1.40 ] ~ [ wine-1.1.39 ] ~ [ wine-1.1.38 ] ~ [ wine-1.1.37 ] ~ [ wine-1.1.36 ] ~ [ wine-1.1.35 ] ~ [ wine-1.1.34 ] ~ [ wine-1.1.33 ] ~ [ wine-1.1.32 ] ~ [ wine-1.1.31 ] ~ [ wine-1.1.30 ] ~ [ wine-1.1.29 ] ~ [ wine-1.1.28 ] ~ [ wine-1.1.27 ] ~ [ wine-1.1.26 ] ~ [ wine-1.1.25 ] ~ [ wine-1.1.24 ] ~ [ wine-1.1.23 ] ~ [ wine-1.1.22 ] ~ [ wine-1.1.21 ] ~ [ wine-1.1.20 ] ~ [ wine-1.1.19 ] ~ [ wine-1.1.18 ] ~ [ wine-1.1.17 ] ~ [ wine-1.1.16 ] ~ [ wine-1.1.15 ] ~ [ wine-1.1.14 ] ~ [ wine-1.1.13 ] ~ [ wine-1.1.12 ] ~ [ wine-1.1.11 ] ~ [ wine-1.1.10 ] ~ [ wine-1.1.9 ] ~ [ wine-1.1.8 ] ~ [ wine-1.1.7 ] ~ [ wine-1.0.1 ] ~ [ wine-1.1.6 ] ~ [ wine-1.1.5 ] ~ [ wine-1.1.4 ] ~ [ wine-1.1.3 ] ~ [ wine-1.1.2 ] ~ [ wine-1.1.1 ] ~ [ wine-1.1.0 ] ~ [ wine-1.0 ] ~

  1 /*
  2  * Window properties
  3  *
  4  * Copyright 1995, 1996, 2001 Alexandre Julliard
  5  *
  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.
 10  *
 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.
 15  *
 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 19  */
 20 
 21 #include "config.h"
 22 #include "wine/port.h"
 23 
 24 #include <stdarg.h>
 25 #include <string.h>
 26 
 27 #include "windef.h"
 28 #include "winbase.h"
 29 #include "wownt32.h"
 30 #include "wine/unicode.h"
 31 #include "wine/winuser16.h"
 32 #include "wine/server.h"
 33 
 34 /* size of buffer needed to store an atom string */
 35 #define ATOM_BUFFER_SIZE 256
 36 
 37 
 38 /***********************************************************************
 39  *              get_properties
 40  *
 41  * Retrieve the list of properties of a given window.
 42  * Returned buffer must be freed by caller.
 43  */
 44 static property_data_t *get_properties( HWND hwnd, int *count )
 45 {
 46     property_data_t *data;
 47     int total = 32;
 48 
 49     while (total)
 50     {
 51         int res = 0;
 52         if (!(data = HeapAlloc( GetProcessHeap(), 0, total * sizeof(*data) ))) break;
 53         *count = 0;
 54         SERVER_START_REQ( get_window_properties )
 55         {
 56             req->window = wine_server_user_handle( hwnd );
 57             wine_server_set_reply( req, data, total * sizeof(*data) );
 58             if (!wine_server_call( req )) res = reply->total;
 59         }
 60         SERVER_END_REQ;
 61         if (res && res <= total)
 62         {
 63             *count = res;
 64             return data;
 65         }
 66         HeapFree( GetProcessHeap(), 0, data );
 67         total = res;  /* restart with larger buffer */
 68     }
 69     return NULL;
 70 }
 71 
 72 
 73 /***********************************************************************
 74  *              EnumPropsA_relay
 75  *
 76  * relay to call the EnumProps callback function from EnumPropsEx
 77  */
 78 static BOOL CALLBACK EnumPropsA_relay( HWND hwnd, LPSTR str, HANDLE handle, ULONG_PTR lparam )
 79 {
 80     PROPENUMPROCA func = (PROPENUMPROCA)lparam;
 81     return func( hwnd, str, handle );
 82 }
 83 
 84 
 85 /***********************************************************************
 86  *              EnumPropsW_relay
 87  *
 88  * relay to call the EnumProps callback function from EnumPropsEx
 89  */
 90 static BOOL CALLBACK EnumPropsW_relay( HWND hwnd, LPWSTR str, HANDLE handle, ULONG_PTR lparam )
 91 {
 92     PROPENUMPROCW func = (PROPENUMPROCW)lparam;
 93     return func( hwnd, str, handle );
 94 }
 95 
 96 
 97 /***********************************************************************
 98  *              EnumPropsA   (USER32.@)
 99  */
100 INT WINAPI EnumPropsA( HWND hwnd, PROPENUMPROCA func )
101 {
102     return EnumPropsExA( hwnd, EnumPropsA_relay, (LPARAM)func );
103 }
104 
105 
106 /***********************************************************************
107  *              EnumPropsW   (USER32.@)
108  */
109 INT WINAPI EnumPropsW( HWND hwnd, PROPENUMPROCW func )
110 {
111     return EnumPropsExW( hwnd, EnumPropsW_relay, (LPARAM)func );
112 }
113 
114 
115 /***********************************************************************
116  *              GetPropA   (USER32.@)
117  */
118 HANDLE WINAPI GetPropA( HWND hwnd, LPCSTR str )
119 {
120     WCHAR buffer[ATOM_BUFFER_SIZE];
121 
122     if (!HIWORD(str)) return GetPropW( hwnd, (LPCWSTR)str );
123     if (!MultiByteToWideChar( CP_ACP, 0, str, -1, buffer, ATOM_BUFFER_SIZE )) return 0;
124     return GetPropW( hwnd, buffer );
125 }
126 
127 
128 /***********************************************************************
129  *              GetPropW   (USER32.@)
130  */
131 HANDLE WINAPI GetPropW( HWND hwnd, LPCWSTR str )
132 {
133     ULONG_PTR ret = 0;
134 
135     SERVER_START_REQ( get_window_property )
136     {
137         req->window = wine_server_user_handle( hwnd );
138         if (!HIWORD(str)) req->atom = LOWORD(str);
139         else wine_server_add_data( req, str, strlenW(str) * sizeof(WCHAR) );
140         if (!wine_server_call_err( req )) ret = reply->data;
141     }
142     SERVER_END_REQ;
143     return (HANDLE)ret;
144 }
145 
146 
147 /***********************************************************************
148  *              SetPropA   (USER32.@)
149  */
150 BOOL WINAPI SetPropA( HWND hwnd, LPCSTR str, HANDLE handle )
151 {
152     WCHAR buffer[ATOM_BUFFER_SIZE];
153 
154     if (!HIWORD(str)) return SetPropW( hwnd, (LPCWSTR)str, handle );
155     if (!MultiByteToWideChar( CP_ACP, 0, str, -1, buffer, ATOM_BUFFER_SIZE )) return FALSE;
156     return SetPropW( hwnd, buffer, handle );
157 }
158 
159 
160 /***********************************************************************
161  *              SetPropW   (USER32.@)
162  */
163 BOOL WINAPI SetPropW( HWND hwnd, LPCWSTR str, HANDLE handle )
164 {
165     BOOL ret;
166 
167     SERVER_START_REQ( set_window_property )
168     {
169         req->window = wine_server_user_handle( hwnd );
170         req->data   = (ULONG_PTR)handle;
171         if (!HIWORD(str)) req->atom = LOWORD(str);
172         else wine_server_add_data( req, str, strlenW(str) * sizeof(WCHAR) );
173         ret = !wine_server_call_err( req );
174     }
175     SERVER_END_REQ;
176     return ret;
177 }
178 
179 
180 /***********************************************************************
181  *              RemovePropA   (USER32.@)
182  */
183 HANDLE WINAPI RemovePropA( HWND hwnd, LPCSTR str )
184 {
185     WCHAR buffer[ATOM_BUFFER_SIZE];
186 
187     if (!HIWORD(str)) return RemovePropW( hwnd, (LPCWSTR)str );
188     if (!MultiByteToWideChar( CP_ACP, 0, str, -1, buffer, ATOM_BUFFER_SIZE )) return 0;
189     return RemovePropW( hwnd, buffer );
190 }
191 
192 
193 /***********************************************************************
194  *              RemovePropW   (USER32.@)
195  */
196 HANDLE WINAPI RemovePropW( HWND hwnd, LPCWSTR str )
197 {
198     ULONG_PTR ret = 0;
199 
200     SERVER_START_REQ( remove_window_property )
201     {
202         req->window = wine_server_user_handle( hwnd );
203         if (!HIWORD(str)) req->atom = LOWORD(str);
204         else wine_server_add_data( req, str, strlenW(str) * sizeof(WCHAR) );
205         if (!wine_server_call_err( req )) ret = reply->data;
206     }
207     SERVER_END_REQ;
208 
209     return (HANDLE)ret;
210 }
211 
212 
213 /***********************************************************************
214  *              EnumPropsExA   (USER32.@)
215  */
216 INT WINAPI EnumPropsExA(HWND hwnd, PROPENUMPROCEXA func, LPARAM lParam)
217 {
218     int ret = -1, i, count;
219     property_data_t *list = get_properties( hwnd, &count );
220 
221     if (list)
222     {
223         for (i = 0; i < count; i++)
224         {
225             char string[ATOM_BUFFER_SIZE];
226             if (!GlobalGetAtomNameA( list[i].atom, string, ATOM_BUFFER_SIZE )) continue;
227             if (!(ret = func( hwnd, string, (HANDLE)(ULONG_PTR)list[i].data, lParam ))) break;
228         }
229         HeapFree( GetProcessHeap(), 0, list );
230     }
231     return ret;
232 }
233 
234 
235 /***********************************************************************
236  *              EnumPropsExW   (USER32.@)
237  */
238 INT WINAPI EnumPropsExW(HWND hwnd, PROPENUMPROCEXW func, LPARAM lParam)
239 {
240     int ret = -1, i, count;
241     property_data_t *list = get_properties( hwnd, &count );
242 
243     if (list)
244     {
245         for (i = 0; i < count; i++)
246         {
247             WCHAR string[ATOM_BUFFER_SIZE];
248             if (!GlobalGetAtomNameW( list[i].atom, string, ATOM_BUFFER_SIZE )) continue;
249             if (!(ret = func( hwnd, string, (HANDLE)(ULONG_PTR)list[i].data, lParam ))) break;
250         }
251         HeapFree( GetProcessHeap(), 0, list );
252     }
253     return ret;
254 }
255 
256 
257 /***********************************************************************
258  *              EnumProps   (USER.27)
259  */
260 INT16 WINAPI EnumProps16( HWND16 hwnd, PROPENUMPROC16 func )
261 {
262     int ret = -1, i, count;
263     property_data_t *list = get_properties( HWND_32(hwnd), &count );
264 
265     if (list)
266     {
267         char string[ATOM_BUFFER_SIZE];
268         SEGPTR segptr = MapLS( string );
269         WORD args[4];
270         DWORD result;
271 
272         for (i = 0; i < count; i++)
273         {
274             if (list[i].string)  /* it was a string originally */
275             {
276                 if (!GlobalGetAtomNameA( list[i].atom, string, ATOM_BUFFER_SIZE )) continue;
277                 args[3] = hwnd;
278                 args[2] = SELECTOROF(segptr);
279                 args[1] = OFFSETOF(segptr);
280                 args[0] = LOWORD(list[i].data);
281             }
282             else
283             {
284                 args[3] = hwnd;
285                 args[2] = 0;
286                 args[1] = list[i].atom;
287                 args[0] = LOWORD(list[i].data);
288             }
289             WOWCallback16Ex( (DWORD)func, WCB16_PASCAL, sizeof(args), args, &result );
290             if (!(ret = LOWORD(result))) break;
291         }
292         UnMapLS( segptr );
293         HeapFree( GetProcessHeap(), 0, list );
294     }
295     return ret;
296 }
297 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.