- FreeBSD now supported.
[wine] / tools / winapi / winapi_module_user.pm
1 package winapi_module_user;
2
3 use strict;
4
5 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
6 require Exporter;
7
8 @ISA = qw(Exporter);
9 @EXPORT = qw();
10 @EXPORT_OK = qw(
11     &is_user_function
12     &get_message_result_type
13     &get_message_result_kind
14     &get_message_wparam_type
15     &get_message_wparam_kind
16     &get_message_lparam_type
17     &get_message_lparam_kind
18 );
19
20 use config qw($wine_dir);
21 use options qw($options);
22 use output qw($output);
23
24 use c_parser;
25
26 ########################################################################
27
28 my $message;
29
30 ########################################################################
31 # is_user_function
32
33 sub is_user_function {
34     my $name = shift;
35     if($name =~ /^(?:DefWindowProc|SendMessage)[AW]?$/) {
36     }
37 }
38
39 ########################################################################
40 # $message
41
42 $message = {
43     WM_ACTIVATE => {
44         id => 0x0006, result => "void", wparam => ["", ""], lparam => "HWND" },
45     WM_ACTIVATEAPP => {
46         id => 0x001c, result => "void", wparam => "BOOL", lparam => "DWORD" },
47     WM_ACTIVATESHELLWINDOW => {
48         id => 0x003e, result => "", wparam => "", lparam => "" },
49     WM_ACTIVATETOPLEVEL => {
50         id => 0x036e, result => "", wparam => "", lparam => "" },
51     WM_ALTTABACTIVE => {
52         id => 0x0029, result => "", wparam => "", lparam => "" },
53     WM_APP => {
54         id => 0x8000, result => "", wparam => "", lparam => "" },
55     WM_ASKCBFORMATNAME => {
56         id => 0x030c, result => "void", wparam => "int", lparam => "LPTSTR" },
57
58     WM_BEGINDRAG => {
59         id => 0x022c, result => "", wparam => "", lparam => "" },
60
61     WM_CANCELMODE => {
62         id => 0x001f, result => "void", wparam => "void", lparam => "void" },
63     WM_CANCELJOURNAL => {
64         id => 0x004b, result => "", wparam => "", lparam => "" },
65     WM_CAPTURECHANGED => {
66         id => 0x0215, result => "void", wparam => "void", lparam => "HWND" },
67     WM_CHANGECBCHAIN => {
68         id => 0x030d, result => "void", wparam => "HWND", lparam => "HWND" },
69     WM_CHILDACTIVATE => {
70         id => 0x0022, result => "void", wparam => "void", lparam => "void" },
71     WM_CLEAR => {
72         id => 0x0303, result => "void", wparam => "void", lparam => "void" },
73     WM_CHAR => {
74         id => 0x0102, result => "void", wparam => "TCHAR", lparam => ["", ""] },
75     WM_CHARTOITEM => {
76         id => 0x002f, result => "int", wparam => ["UINT", "UINT"], lparam => "HWND" },
77     WM_CLOSE => {
78         id => 0x0010, result => "void", wparam => "void", lparam => "void" },
79     WM_COALESCE_FIRST => {
80         id => 0x0390, result => "", wparam => "", lparam => "" },
81     WM_COALESCE_LAST => {
82         id => 0x039f, result => "", wparam => "", lparam => "" },
83     WM_COMMAND => {
84         id => 0x0111, result => "void", wparam => ["UINT", "UINT"], lparam => "HWND" },
85     WM_COMMANDHELP => {
86         id => 0x0365, result => "", wparam => "", lparam => "" },
87     WM_COMMNOTIFY => {
88         id => 0x0044, result => "void", wparam => "int", lparam => ["", ""] },
89     WM_CONTEXTMENU => {
90         id => 0x007b, result => "void", wparam => "HWND", lparam => ["UINT", "UINT"] },
91     WM_COPY => {
92         id => 0x0301, result => "void", wparam => "void", lparam => "void" },
93     WM_COPYDATA => {
94         id => 0x004a, result => "", wparam => "", lparam => "" },
95     WM_COMPACTING => { 
96         id => 0x0041, result => "void", wparam => "UINT", lparam => "void" },
97     WM_COMPAREITEM => { 
98         id => 0x0039, result => "int", wparam => "UINT", lparam => "const COMPAREITEMSTRUCT *" },
99     WM_CREATE => {
100         id => 0x0001, result => "BOOL", wparam => "void", lparam => "LPCREATESTRUCT" },
101     WM_CTLCOLOR => {
102         id => 0x0019, result => "", wparam => "", lparam => "" },
103     WM_CTLCOLORBTN => {
104         id => 0x0135, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
105     WM_CTLCOLORDLG => {
106         id => 0x136, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
107     WM_CTLCOLOREDIT => {
108         id => 0x133, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
109     WM_CTLCOLORLISTBOX => {
110         id => 0x134, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
111     WM_CTLCOLORMSGBOX => {
112         id => 0x132, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
113     WM_CTLCOLORSCROLLBAR => {
114         id => 0x137, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
115     WM_CTLCOLORSTATIC => {
116         id => 0x138, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
117     WM_CUT => {
118         id => 0x0300, result => "void", wparam => "void", lparam => "void" },
119
120     WM_DDE_ACK => { # FIXME: Only correct if replying to WM_DDE_INITIATE
121         id => 0x03E4, result => "void", wparam => "HWND", lparam => ["ATOM", "ATOM"] },
122     WM_DDE_INITIATE => {
123         id => 0x03E0, result => "void", wparam => "HWND", lparam => ["ATOM", "ATOM"] },
124     WM_DEADCHAR => {
125         id => 0x0103, result => "void", wparam => "TCHAR", lparam => ["", ""] },
126     WM_DEVICECHANGE => {
127         id => 0x0219, result => "BOOL", wparam => "UINT", lparam => "DWORD" },
128     WM_DELETEITEM => { 
129         id => 0x002d, result => "void", wparam => "UINT", lparam => "const DELETEITEMSTRUCT *" },
130     WM_DEVMODECHANGE => {
131         id => 0x001b, result => "void", wparam => "void", lparam => "LPCTSTR" },
132     WM_DESTROY => {
133         id => 0x0002, result => "void", wparam => "void", lparam => "void" },
134     WM_DESTROYCLIPBOARD => {
135         id => 0x0307, result => "void", wparam => "void", lparam => "void" },
136     WM_DISABLEMODAL => {
137         id => 0x036c, result => "", wparam => "", lparam => "" },
138     WM_DISPLAYCHANGE => {
139         id => 0x007e, result => "void", wparam => "UINT", lparam => ["UINT", "UINT"] },
140     WM_DRAGLOOP => {
141         id => 0x022d, result => "", wparam => "", lparam => "" },
142     WM_DRAGMOVE => {
143         id => 0x022f, result => "", wparam => "", lparam => "" },
144     WM_DRAGSELECT => {
145         id => 0x022e, result => "", wparam => "", lparam => "" },
146     WM_DRAWCLIPBOARD => {
147         id => 0x0308, result => "void", wparam => "void", lparam => "void" },
148     WM_DRAWITEM => {
149         id => 0x002b, result => "void", wparam => "UINT", lparam => "const DRAWITEMSTRUCT *" },
150     WM_DROPFILES => {
151         id => 0x0233, result => "void", wparam => "HDROP", lparam => "void" },
152     WM_DROPOBJECT => {
153         id => 0x022a, result => "", wparam => "", lparam => "" },
154
155     WM_ENABLE => {
156         id => 0x000a, result => "void", wparam => "BOOL", lparam => "void" },
157     WM_ENDSESSION => {
158         id => 0x0016, result => "void", wparam => "BOOL", lparam => "void" },
159     WM_ENTERIDLE => {
160         id => 0x0121, result => "void", wparam => "UINT", lparam => "HWND" },
161     WM_ENTERSIZEMOVE => {
162         id => 0x0231, result => "", wparam => "", lparam => "" },
163     WM_ENTERMENULOOP => {
164         id => 0x0211, result => "", wparam => "", lparam => "" },
165     WM_ERASEBKGND => {
166         id => 0x0014, result => "BOOL", wparam => "HDC", lparam => "void" },
167     WM_EXITHELPMODE => {
168         id => 0x0367, result => "", wparam => "", lparam => "" },
169     WM_EXITMENULOOP => {
170         id => 0x0212, result => "", wparam => "", lparam => "" },
171     WM_EXITSIZEMOVE => {
172         id => 0x0232, result => "", wparam => "", lparam => "" },
173
174     WM_FILESYSCHANGE => {
175         id => 0x0034, result => "", wparam => "", lparam => "" },
176     WM_FLOATSTATUS => {
177         id => 0x036d, result => "", wparam => "", lparam => "" },
178     WM_FONTCHANGE => {
179         id => 0x001d, result => "void", wparam => "void", lparam => "void" },
180
181     WM_GETDLGCODE => {
182         id => 0x0087, result => "UINT", wparam => "WPARAM", lparam => "LPMSG" },
183     WM_GETFONT => {
184         id => 0x0031, result => "HFONT", wparam => "void", lparam => "void" },
185     WM_GETHOTKEY => {
186         id => 0x0033, result => "", wparam => "", lparam => "" },
187     WM_GETICON => {
188         id => 0x007f, result => "", wparam => "", lparam => "" },
189     WM_GETMINMAXINFO => {
190         id => 0x0024, result => "void", wparam => "void", lparam => "LPMINMAXINFO" },
191     WM_GETTEXT => {
192         id => 0x000d, result => "int", wparam => "int", lparam => "LPTSTR" },
193     WM_GETTEXTLENGTH => {
194         id => 0x000e, result => "int", wparam => "void", lparam => "void" },
195
196     WM_HELP => {
197         id => 0x0053, result => "void", wparam => "void", lparam => "LPHELPINFO" },
198     WM_HELPHITTEST => {
199         id => 0x0366, result => "", wparam => "", lparam => "" },
200     WM_HOTKEY => {
201         id => 0x0312, result => "", wparam => "", lparam => "" },
202     WM_HSCROLL => {
203         id => 0x0114, result => "void", wparam => ["int", "int"], lparam => "HWND" },
204     WM_HSCROLLCLIPBOARD => {
205         id => 0x030e, result => "void", wparam => "HWND", lparam => "" },
206
207     WM_ICONERASEBKGND => {
208         id => 0x0027, result => "BOOL", wparam => "HDC", lparam => "void" },
209     WM_IME_CHAR => {
210         id => 0x0286, result => "", wparam => "", lparam => "" },
211     WM_IME_COMPOSITION => {
212         id => 0x010f, result => "", wparam => "", lparam => "" },
213     WM_IME_COMPOSITIONFULL => {
214         id => 0x0284, result => "", wparam => "", lparam => "" },
215     WM_IME_CONTROL => {
216         id => 0x0283, result => "", wparam => "", lparam => "" },
217     WM_IME_ENDCOMPOSITION => {
218         id => 0x010e, result => "", wparam => "", lparam => "" },
219     WM_IME_KEYDOWN => {
220         id => 0x0290, result => "void", wparam => "UINT", lparam => ["int", "UINT"] },
221     WM_IME_KEYLAST => {
222         id => 0x010f, result => "", wparam => "", lparam => "" },
223     WM_IME_KEYUP => {
224         id => 0x0291, result => "void", wparam => "UINT", lparam => ["int", "UINT"] },
225     WM_IME_NOTIFY => {
226         id => 0x0282, result => "", wparam => "", lparam => "" },
227     WM_IME_REQUEST => {
228         id => 0x0288, result => "", wparam => "", lparam => "" },
229     WM_IME_SELECT => {
230         id => 0x0285, result => "", wparam => "", lparam => "" },
231     WM_IME_SETCONTEXT => {
232         id => 0x0281, result => "", wparam => "", lparam => "" },
233     WM_IME_STARTCOMPOSITION => {
234         id => 0x010d, result => "", wparam => "", lparam => "" },
235     WM_IDLEUPDATECMDUI => {
236         id => 0x0363, result => "", wparam => "", lparam => "" },
237     WM_INITDIALOG => {
238         id => 0x0110, result => "BOOL", wparam => "HWND", lparam => "LPARAM" },
239     WM_INITIALUPDATE => {
240         id => 0x0364, result => "", wparam => "", lparam => "" },
241     WM_INITMENU => {
242         id => 0x0116, result => "void", wparam => "HMENU", lparam => "void" },
243     WM_INITMENUPOPUP => {
244         id => 0x0117, result => "void", wparam => "HMENU", lparam => ["UINT", "BOOL"] },
245     WM_INPUTLANGCHANGE => {
246         id => 0x0051, result => "", wparam => "", lparam => "" },
247     WM_INPUTLANGCHANGEREQUEST => {
248         id => 0x0050, result => "", wparam => "", lparam => "" },
249     WM_ISACTIVEICON => {
250         id => 0x0035, result => "", wparam => "", lparam => "" },
251
252     WM_KEYDOWN => {
253         id => 0x0100, result => "void", wparam => "UINT", lparam => ["int", "UINT"] },
254     WM_KEYLAST => {
255         id => 0x0108, result => "", wparam => "", lparam => "" },
256     WM_KICKIDLE => {
257         id => 0x036a, result => "", wparam => "", lparam => "" },
258     WM_KEYUP => {
259         id => 0x0101, result => "void", wparam => "UINT", lparam => ["", ""] },
260     WM_KILLFOCUS => {
261         id => 0x0008, result => "void", wparam => "HWND", lparam => "void" },
262
263     WM_LBTRACKPOINT => {
264         id => 0x0131, result => "", wparam => "", lparam => "" },
265     WM_LBUTTONDBLCLK => {
266         id => 0x0203, result => "void", wparam => "UINT", lparam => ["", ""] },
267     WM_LBUTTONDOWN => {
268         id => 0x0201, result => "void", wparam => "UINT", lparam => ["", ""] },
269     WM_LBUTTONUP => {
270         id => 0x0202, result => "void", wparam => "UINT", lparam => ["", ""] },
271
272     WM_MBUTTONDBLCLK => {
273         id => 0x0209, result => "void", wparam => "UINT", lparam => ["", ""] },
274     WM_MBUTTONDOWN => {
275         id => 0x0207, result => "void", wparam => "UINT", lparam => ["", ""] },
276     WM_MBUTTONUP => {
277         id => 0x0208, result => "void", wparam => "UINT", lparam => ["", ""] },
278     WM_MDIACTIVATE => {
279         id => 0x0222, result => "void", wparam => "HWND", lparam => "HWND" },
280     WM_MDICASCADE => {
281         id => 0x0227, result => "BOOL", wparam => "UINT", lparam => "void" },
282     WM_MDICREATE => {
283         id => 0x0220, result => "HWND", wparam => "void", lparam => "const LPMDICREATESTRUCT" },
284     WM_MDIDESTROY => {
285         id => 0x0221, result => "void", wparam => "HWND", lparam => "void" },
286     WM_MDIGETACTIVE => {
287         id => 0x0229, result => "HWND", wparam => "void", lparam => "void" },
288     WM_MDIICONARRANGE => {
289         id => 0x0228, result => "void", wparam => "void", lparam => "void" },
290     WM_MDIMAXIMIZE => {
291         id => 0x0225, result => "void", wparam => "HWND", lparam => "void" },
292     WM_MDINEXT => {
293         id => 0x0224, result => "HWND", wparam => "HWND", lparam => "BOOL" },
294     WM_MDIREFRESHMENU => {
295         id => 0x0234, result => "", wparam => "", lparam => "" },
296     WM_MDIRESTORE => {
297         id => 0x0223, result => "void", wparam => "HWND", lparam => "void" },
298     WM_MDISETMENU => {
299         id => 0x0230, result => "HMENU", wparam => "BOOL", lparam => "HMENU" },
300     WM_MDITILE => {
301         id => 0x0226, result => "BOOL", wparam => "UINT", lparam => "void" },
302     WM_MEASUREITEM => {
303         id => 0x002c, result => "void", wparam => "UINT", lparam => "MEASUREITEMSTRUCT *" },
304     WM_MENUSELECT => {
305         id => 0x011f, result => "void", wparam => ["", ""], lparam => "HMENU" },
306     WM_MENUCHAR => {
307         id => 0x0120, result => "DWORD", wparam => ["", "WORD"], lparam => "HMENU" },
308     WM_MOUSEACTIVATE => {
309         id => 0x0021, result => "int", wparam => "HWND", lparam => ["", ""] },
310     WM_MOUSEMOVE => {
311         id => 0x0200, result => "void", wparam => "UINT", lparam => ["", ""] },
312     WM_MOUSEWHEEL => {
313         id => 0x020a, result => "void", wparam => ["DWORD", "int"], lparam => ["UINT", "UINT"] },
314     WM_MOVE => {
315         id => 0x0003, result => "void", wparam => "void", lparam => ["", ""] },
316     WM_MOVING => {
317         id => 0x0216, result => "", wparam => "", lparam => "" },
318
319     WM_NCACTIVATE => {
320         id => 0x0086, result => "BOOL", wparam => "BOOL", lparam => "void" },
321     WM_NCLBUTTONDBLCLK => {
322         id => 0x00a3, result => "void", wparam => "UINT", lparam => ["", ""] },
323     WM_NCLBUTTONDOWN => {
324         id => 0x00a1, result => "void", wparam => "UINT", lparam => ["", ""] },
325     WM_NCLBUTTONUP => {
326         id => 0x00a2, result => "void", wparam => "UINT", lparam => ["", ""] },
327     WM_NCMOUSEMOVE => {
328         id => 0x00a0, result => "void", wparam => "UINT", lparam => ["", ""] },
329     WM_NCMBUTTONDBLCLK => {
330         id => 0x00a9, result => "void", wparam => "UINT", lparam => ["", ""] },
331     WM_NCMBUTTONDOWN => {
332         id => 0x00a7, result => "void", wparam => "UINT", lparam => ["", ""] },
333     WM_NCMBUTTONUP => {
334         id => 0x00a8, result => "void", wparam => "UINT", lparam => ["", ""] },
335     WM_NCRBUTTONDBLCLK => {
336         id => 0x00a6, result => "void", wparam => "UINT", lparam => ["", ""] },
337     WM_NCRBUTTONDOWN => {
338         id => 0x00a4, result => "void", wparam => "UINT", lparam => ["", ""] },
339     WM_NCRBUTTONUP => {
340         id => 0x00a5, result => "void", wparam => "UINT", lparam => ["", ""] },
341     WM_NCCALCSIZE => {
342         id => 0x0083, result => "UINT", wparam => "void", lparam => "NCCALCSIZE_PARAMS *" },
343     WM_NCCREATE => {
344         id => 0x0081, result => "BOOL", wparam => "void", lparam => "LPCREATESTRUCT" },
345     WM_NCDESTROY => {
346         id => 0x0082, result => "void", wparam => "void", lparam => "void" },
347     WM_NCHITTEST => {
348         id => 0x0084, result => "UINT", wparam => "void", lparam => ["int", "int"] },
349     WM_NCPAINT => {
350         id => 0x0085, result => "void", wparam => "HRGN", lparam => "void" },
351     WM_NEXTDLGCTL => {
352         id => 0x0028, result => "HWND", wparam => "HWND", lparam => "BOOL" },
353     WM_NEXTMENU => {
354         id => 0x0213, result => "void", wparam => "UINT", lparam => "LPMDINEXTMENU" },
355     WM_NOTIFY => {
356         id => 0x004e, result => "LRESULT", wparam => "int", lparam => "NMHDR *" },
357     WM_NOTIFYFORMAT => {
358         id => 0x0055, result => "", wparam => "", lparam => "" },
359     WM_NULL => {
360         id => 0x0000, result => "", wparam => "", lparam => "" },
361
362     WM_OCC_INITNEW => {
363         id => 0x0378, result => "", wparam => "", lparam => "" },
364     WM_OCC_LOADFROMSTORAGE => {
365         id => 0x0377, result => "", wparam => "", lparam => "" },
366     WM_OCC_LOADFROMSTORAGE_EX => {
367         id => 0x037b, result => "", wparam => "", lparam => "" },
368     WM_OCC_LOADFROMSTREAM => {
369         id => 0x0376, result => "", wparam => "", lparam => "" },
370     WM_OCC_LOADFROMSTREAM_EX => {
371         id => 0x037a, result => "", wparam => "", lparam => "" },
372     WM_OTHERWINDOWCREATED => {
373         id => 0x003c, result => "", wparam => "", lparam => "" },
374     WM_OTHERWINDOWDESTROYED => {
375         id => 0x003d, result => "", wparam => "", lparam => "" },
376
377     WM_PAINT => {
378         id => 0x000f, result => "void", wparam => "void", lparam => "void" },
379     WM_PAINTCLIPBOARD => {
380         id => 0x0309, result => "void", wparam => "HWND", lparam => "const LPPAINTSTRUCT" },
381     WM_PAINTICON => {
382         id => 0x0026, result => "", wparam => "", lparam => "" },
383     WM_PALETTEISCHANGING => {
384         id => 0x0310, result => "void", wparam => "HWND", lparam => "void" },
385     WM_PALETTECHANGED => {
386         id => 0x0311, result => "void", wparam => "HWND", lparam => "void" },
387     WM_PARENTNOTIFY => {
388         id => 0x0210, result => "void", wparam => ["UINT", "int"], lparam => "HWND" },
389     WM_PASTE => {
390         id => 0x0302, result => "void", wparam => "void", lparam => "void" },
391     WM_PENWINFIRST => {
392         id => 0x0380, result => "", wparam => "", lparam => "" },
393     WM_PENWINLAST => {
394         id => 0x038f, result => "", wparam => "", lparam => "" },
395     WM_POPMESSAGESTRING => {
396         id => 0x0375, result => "", wparam => "", lparam => "" },
397     WM_POWER => {
398         id => 0x0048, result => "void", wparam => "int", lparam => "void" },
399     WM_POWERBROADCAST => {
400         id => 0x0218, result => "", wparam => "", lparam => "" },
401     WM_PRINT => {
402         id => 0x0317, result => "", wparam => "", lparam => "" },
403     WM_PRINTCLIENT => {
404         id => 0x0318, result => "void", wparam => "HDC", lparam => "DWORD" },
405
406     WM_QUERY3DCONTROLS => {
407         id => 0x036f, result => "", wparam => "", lparam => "" },
408     WM_QUERYAFXWNDPROC => {
409         id => 0x0360, result => "", wparam => "", lparam => "" },
410     WM_QUERYCENTERWND => {
411         id => 0x036b, result => "", wparam => "", lparam => "" },
412     WM_QUERYDRAGICON => {
413         id => 0x0037, result => "HICON", wparam => "void", lparam => "void" },
414     WM_QUERYDROPOBJECT => {
415         id => 0x022b, result => "", wparam => "", lparam => "" },
416     WM_QUERYENDSESSION => {
417         id => 0x0011, result => "BOOL", wparam => "void", lparam => "void" },
418     WM_QUERYNEWPALETTE => {
419         id => 0x030f, result => "BOOL", wparam => "void", lparam => "void" },
420     WM_QUERYOPEN => {
421         id => 0x0013, result => "BOOL", wparam => "void", lparam => "void" },
422     WM_QUERYPARKICON => {
423         id => 0x0036, result => "", wparam => "", lparam => "" },
424     WM_QUERYSAVESTATE => {
425         id => 0x0038, result => "", wparam => "", lparam => "" },
426     WM_QUEUESYNC => {
427         id => 0x0023, result => "void", wparam => "void", lparam => "void" },
428     WM_QUEUE_SENTINEL => {
429         id => 0x0379, result => "", wparam => "", lparam => "" },
430     WM_QUIT => {
431         id => 0x0012, result => "void", wparam => "int", lparam => "void" },
432
433     WM_RBUTTONDBLCLK => {
434         id => 0x0206, result => "void", wparam => "UINT", lparam => ["", ""] },
435     WM_RBUTTONDOWN => {
436         id => 0x0204, result => "void", wparam => "UINT", lparam => ["", ""] },
437     WM_RBUTTONUP => {
438         id => 0x0205, result => "void", wparam => "UINT", lparam => ["", ""] },
439     WM_RECALCPARENT => {
440         id => 0x0368, result => "", wparam => "", lparam => "" },
441     WM_RENDERALLFORMATS => {
442         id => 0x0306, result => "void", wparam => "void", lparam => "void" },
443     WM_RENDERFORMAT => {
444         id => 0x0305, result => "HANDLE", wparam => "UINT", lparam => "void" },
445
446     WM_SETCURSOR => {
447         id => 0x0020, result => "BOOL", wparam => "HWND", lparam => ["UINT", "UINT"] },
448     WM_SETFOCUS => {
449         id => 0x0007, result => "void", wparam => "HWND", lparam => "void" },
450     WM_SETFONT => {
451         id => 0x0030, result => "void", wparam => "HFONT", lparam => "BOOL" },
452     WM_SETHOTKEY => {
453         id => 0x0032, result => "", wparam => "", lparam => "" },
454     WM_SETICON => {
455         id => 0x0080, result => "HICON", wparam => "DWORD", lparam => "HICON" },
456     WM_SETMESSAGESTRING => {
457         id => 0x0362, result => "", wparam => "", lparam => "" },
458     WM_SETREDRAW => {
459         id => 0x000b, result => "void", wparam => "BOOL", lparam => "void" },
460     WM_SETTEXT => {
461         id => 0x000c, result => "void", wparam => "void", lparam => "LPCTSTR" },
462     WM_SETVISIBLE => {
463         id => 0x0009, result => "", wparam => "", lparam => "" },
464     WM_SHOWWINDOW => {
465         id => 0x0018, result => "void", wparam => "BOOL", lparam => "UINT" },
466     WM_SIZE => {
467         id => 0x0005, result => "void", wparam => "UINT", lparam => ["", ""] },
468     WM_SIZECHILD => {
469         id => 0x0369, result => "", wparam => "", lparam => "" },
470     WM_SIZECLIPBOARD => {
471         id => 0x030b, result => "void", wparam => "HWND", lparam => "const LPRECT" },
472     WM_SIZEPARENT => {
473         id => 0x0361, result => "", wparam => "", lparam => "" },
474     WM_SIZEWAIT => {
475         id => 0x0004, result => "", wparam => "", lparam => "" },
476     WM_SIZING => {
477         id => 0x0214, result => "", wparam => "", lparam => "" },
478     WM_SOCKET_DEAD => {
479         id => 0x0374, result => "", wparam => "", lparam => "" },
480     WM_SOCKET_NOTIFY => {
481         id => 0x0373, result => "", wparam => "", lparam => "" },
482     WM_SPOOLERSTATUS => {
483         id => 0x002a, result => "void", wparam => "UINT", lparam => ["", ""] },
484     WM_STYLECHANGED => {
485         id => 0x007d, result => "void", wparam => "DWORD", lparam => "LPSTYLESTRUCT" },
486     WM_STYLECHANGING => {
487         id => 0x007c, result => "void", wparam => "DWORD", lparam => "LPSTYLESTRUCT" },
488     WM_SYNCPAINT => {
489         id => 0x0088, result => "", wparam => "", lparam => "" },
490     WM_SYNCTASK => {
491         id => 0x0089, result => "", wparam => "", lparam => "" },
492     WM_SYSCHAR => {
493         id => 0x0106, result => "void", wparam => "TCHAR", lparam => ["", ""] },
494     WM_SYSCOLORCHANGE => {
495         id => 0x0015, result => "void", wparam => "void", lparam => "void" },
496     WM_SYSCOMMAND => {
497         id => 0x0112, result => "void", wparam => "UINT", lparam => "int" },
498     WM_SYSDEADCHAR => {
499         id => 0x0107, result => "void", wparam => "TCHAR", lparam => ["", ""] },
500     WM_SYSKEYDOWN => {
501         id => 0x0104, result => "void", wparam => "UINT", lparam => ["", ""] },
502     WM_SYSKEYUP => {
503         id => 0x0105, result => "void", wparam => "UINT", lparam => ["", ""] },
504     WM_SYSTEMERROR => {
505         id => 0x0017, result => "", wparam => "", lparam => "" },
506     WM_SYSTIMER => {
507         id => 0x0118, result => "", wparam => "", lparam => "" },
508
509     WM_TCARD => {
510         id => 0x0052, result => "", wparam => "", lparam => "" },
511     WM_TESTING => {
512         id => 0x003a, result => "", wparam => "", lparam => "" },
513     WM_TIMECHANGE => {
514         id => 0x001e, result => "void", wparam => "void", lparam => "void" },
515     WM_TIMER => {
516         id => 0x0113, result => "void", wparam => "UINT", lparam => "void" },
517
518     WM_UNDO => {
519         id => 0x0304, result => "void", wparam => "void", lparam => "void" },
520     WM_USER => {
521         id => 0x0400, result => "", wparam => "", lparam => "" },
522     WM_USERCHANGED => {
523         id => 0x0054, result => "", wparam => "", lparam => "" },
524
525     WM_VKEYTOITEM => {
526         id => 0x002e, result => "int", wparam => ["UINT", "int"], lparam => "HWND" },
527     WM_VSCROLL => {
528         id => 0x0115, result => "void", wparam => ["int", "int"], lparam => "HWND" },
529     WM_VSCROLLCLIPBOARD => {
530         id => 0x030a, result => "void", wparam => "HWND", lparam => ["", ""] },
531
532     WM_WINDOWPOSCHANGING => {
533         id => 0x0046, result => "BOOL", wparam => "void", lparam => "LPWINDOWPOS" },
534     WM_WINDOWPOSCHANGED => {
535         id => 0x0047, result => "void", wparam => "void", lparam => "const LPWINDOWPOS" },
536     WM_WININICHANGE => { 
537         id => 0x001a, result => "void", wparam => "void", lparam => "LPCTSTR" }
538 };
539
540 ########################################################################
541 # _get_kind
542
543 sub _get_kind {
544     local $_ = shift;
545
546     if(!$_) {
547         return undef;
548     } elsif(/^(?:HBRUSH|HDC|HFONT|HMENU|HRGN|HWND)$/ || /\*$/ ||
549             /^LP(?!ARAM)/)
550     {
551         return "ptr";
552     } else {
553         return "long";
554     }
555 }
556
557 ########################################################################
558 # get_message_result_type
559
560 sub get_message_result_type {
561     my $name = shift;
562     return $$message{$name}{result};
563 }
564
565 ########################################################################
566 # get_message_result_kind
567
568 sub get_message_result_kind {
569     return _get_kind(get_message_result_type(@_));
570 }
571
572 ########################################################################
573 # get_message_wparam_type
574
575 sub get_message_wparam_type {
576     my $name = shift;
577     return $$message{$name}{wparam};
578 }
579
580 ########################################################################
581 # get_message_wparam_kind
582
583 sub get_message_wparam_kind {
584     return _get_kind(get_message_wparam_type(@_));
585 }
586
587 ########################################################################
588 # get_message_lparam_type
589
590 sub get_message_lparam_type {
591     my $name = shift;
592     return $$message{$name}{lparam};
593 }
594
595 ########################################################################
596 # get_message_lparam_kind
597
598 sub get_message_lparam_kind {
599     return _get_kind(get_message_lparam_type(@_));
600 }
601
602 ########################################################################
603 # _parse_file
604
605 sub _parse_file {
606     my $file = shift;
607     my $found_preprocessor = shift;
608     my $found_comment = shift;
609
610     {
611         open(IN, "< $file");
612         local $/ = undef;
613         $_ = <IN>;
614         close(IN);
615     }
616
617     my @lines = split(/\n/, $_);
618     my $max_line = scalar(@lines);
619
620     my $parser = new c_parser($file);
621
622     $parser->set_found_preprocessor_callback($found_preprocessor);
623     $parser->set_found_comment_callback($found_comment);
624
625     my $found_line = sub {
626         my $line = shift;
627         local $_ = shift;
628
629         $output->progress("$file: line $line of $max_line");
630     };
631
632     $parser->set_found_line_callback($found_line);
633
634     my $line = 1;
635     my $column = 0;
636
637     my $old_prefix = $output->prefix;
638     $output->progress("$file");
639     $output->prefix("$file: ");
640
641     if(!$parser->parse_c_file(\$_, \$line, \$column)) {
642         $output->write("can't parse file\n");
643     }
644
645     $output->prefix($old_prefix);
646 }
647
648 ########################################################################
649 # _get_tuple_arguments
650
651 sub _get_tuple_arguments {
652     local $_ = shift;
653
654     my $parser = new c_parser;
655
656     my $line = 1;
657     my $column = 0;
658
659     my @arguments;
660     my @argument_lines;
661     my @argument_columns;
662     if(!$parser->parse_c_tuple(\$_, \$line, \$column, \@arguments, \@argument_lines, \@argument_columns)) {
663         return undef;
664     }
665
666     return @arguments;
667 }
668
669 ########################################################################
670 # _parse_windowsx_h
671
672
673 sub _parse_windowsx_h {
674     my $last_comment;
675
676     my $found_preprocessor = sub {
677         my $begin_line = shift;
678         my $begin_column = shift;
679         local $_ = shift;
680
681         if(!s/^\#\s*define\s*// || !/^FORWARD_WM_/) {
682             return 1;
683         }
684         
685         my $name;
686         if(s/^FORWARD_(\w+)\([^\)]*\)\s*(.*?)\s*$/$2/s) {
687             $name = $1;
688         }
689
690         if($name eq "WM_SYSTEMERROR") {
691             return 1;
692         }
693
694         my $result;
695         if(s/^\(\s*(\w+)\s*\)(?:\(\s*\w+\s*\))*\(\s*\w+\s*\)//) {
696             $result = $1;
697         } else {
698             die "$name: '$_'";
699         }
700
701         (undef, $_, my $wparam, my $lparam) = _get_tuple_arguments($_);
702
703         my @names = ();
704         if(/^$name$/) {
705             @names = $name;
706         } elsif(/^\(\w+\)\s*\?\s*(\w+)\s*:\s*(\w+)$/) {
707             @names = ($1, $2);
708         } else {
709             die "$name: '$_'";
710         }
711
712         local $_ = $last_comment;
713         s%^/\*\s*(.*?)\s*\*/$%$1%;
714
715         my %arguments;
716         if(s/^(\w+)\s+\w+\s*\(\s*(.*?)\s*\)$/$2/) {
717             my $result2 = $1;
718             if($result2 eq "INT") { $result2 = "int"; }
719             if($result ne $result2) {
720                 $output->write("message $name: result type mismatch '$result' != '$result2'\n");
721             }
722             foreach (split(/\s*,\s*/)) {
723                 if(/^((?:const\s+)?\w+(?:\s*\*\s*|\s+)?)(\w+)$/) {
724                     my $type = $1;
725                     my $name = $2;
726
727                     $type =~ s/^\s*(.*?)\s*$/$1/;
728
729                     $arguments{$name} = $type;
730                 } else {
731                     die "$name: '$_'";
732                 }
733             }
734             # $output->write("$1: $_\n");    
735         } else {
736             die "$name: '$_'";
737         }
738
739         my $find_inner_cast = sub {
740             local $_ = shift;
741             if(/^(?:\(\s*((?:const\s+)?\w+(?:\s*\*)?)\s*\))*\(.*?\)$/) {
742                 if(defined($1)) {
743                     return $1;
744                 } else {
745                     return "";
746                 }
747             }
748             
749         };
750
751         my @entries = (
752             [ \$wparam, "W", "w" ],
753             [ \$lparam, "L", "l" ]
754         );
755         foreach my $entry (@entries) {
756             (my $refparam, my $upper, my $lower) = @$entry;
757
758             local $_ = $$refparam;
759             if(s/^\(\s*$upper(?:)PARAM\s*\)\s*(?:\(\s*((?:const\s+)?\w+(?:\s*\*)?)\s*\))*\(\s*(.*?)\s*\)$/$2/) {
760                 if(defined($1)) {
761                     $$refparam = $1;
762                 } else {
763                     $$refparam = "";
764                 }
765
766                 if(/^\w+$/) {
767                     if(exists($arguments{$_})) {
768                         $$refparam = $arguments{$_};
769                     }
770                 } elsif(/^\(\s*(\w+)\s*\)\s*\?\s*\(\s*(\w+)\s*\)\s*:\s*(?:\(\s*(\w+)\s*\)|0)$/) {
771                     foreach ($1, $2, $3) {
772                         if(exists($arguments{$_})) {
773                             $$refparam = $arguments{$_};
774                             last;
775                         }
776                     }
777                 } elsif(/^\(\((?:const\s+)?\w+\s*(?:\*\s*)?\)\s*(?:\(\s*\w+\s*\)|\w+)\s*\)\s*\->\s*\w+$/) {
778                     $$refparam = "UINT";
779                 } else {
780                     die "$name: '$_'";
781                 }
782             } elsif(s/^(?:\(\s*$upper(?:)PARAM\s*\)\s*)?MAKE$upper(?:)PARAM\s*//) {
783                 (my $low, my $high) = _get_tuple_arguments($_);
784
785                 $low = &$find_inner_cast($low);
786                 $high = &$find_inner_cast($high);
787
788                 $$refparam = "($low,$high)";
789             } elsif(s/^\(.*?$lower(?:)Param.*?\)$//) {
790                 $$refparam = $upper . "PARAM";
791             } elsif(s/^\(\s*(.*?)\s*\)$//) {
792                 $$refparam = "$1";
793             } elsif(s/^0L$//) {
794                 $$refparam = "void";
795             } else {
796                 die "$name: '$_'";
797             }
798         } 
799
800         # $output->write("$result: '@names', '$wparam', '$lparam'\n");
801
802         foreach my $name (@names) {
803             my $result2 = $$message{$name}{result};
804             my $wparam2 = $$message{$name}{wparam};
805             my $lparam2 = $$message{$name}{lparam};
806
807             if(ref($wparam2)) {
808                 $wparam2 = "(" . join(",", @$wparam2) . ")";
809             }
810
811             if(ref($lparam2)) {
812                 $lparam2 = "(" . join(",", @$lparam2) . ")";
813             }
814
815             if($result ne $result2) {
816                 $output->write("message $name: wrong result type '$result2' should be '$result'\n");
817             }
818
819             if($wparam ne $wparam2) {
820                 # if($wparam ne "WPARAM" && $wparam ne "(,)") {
821                     $output->write("message $name: wrong wparam type '$wparam2' should be '$wparam'\n");
822                 # }
823             }
824
825             if($lparam ne $lparam2) {
826                 # if($lparam ne "LPARAM" && $lparam ne "(,)") {
827                     $output->write("message $name: wrong lparam type '$lparam2' should be '$lparam'\n");
828                 # }
829             }
830         }
831
832         return 1;
833     };
834
835     my $found_comment = sub {
836         my $begin_line = shift;
837         my $begin_column = shift;
838         my $comment = shift;
839
840         $last_comment = $comment;
841
842         return 1;
843     };
844
845     _parse_file("$wine_dir/include/windowsx.h", $found_preprocessor, $found_comment);
846 }
847
848
849 ########################################################################
850 # _parse_winuser_h
851
852 sub _parse_winuser_h {
853     my %not_found = ();
854
855     my $found_preprocessor = sub {
856         my $begin_line = shift;
857         my $begin_column = shift;
858         local $_ = shift;
859
860         if(/^\#\s*define\s+(WM_\w+)\s+(0x[0-9a-fA-F]+)\s*$/) {
861             my $name = $1;
862             my $id = lc($2);
863                 
864             if(exists($$message{$name})) {
865                 my $id2 = sprintf("0x%04x", $$message{$name}{id});
866                 if($id ne $id2) {
867                     $output->write("message $name: wrong value ($id2) should be $id\n");
868                 }
869             } else {
870                 $output->write("message $name: exists but is not supported\n");
871                 $not_found{$name} = $id;
872             }
873         }
874
875         return 1;
876     };
877
878     _parse_file("$wine_dir/include/winuser.h", $found_preprocessor);
879
880     foreach my $name (sort(keys(%not_found))) {
881         my $id = $not_found{$name};
882
883         print "    $name => {\n";
884         print "\tid => $id, result => \"\", wparam => \"\", lparam => \"\" },\n";
885     }
886 }
887
888 # _parse_windowsx_h;
889 # _parse_winuser_h;
890
891 1;