- Continued on the new C parser.
[wine/hacks.git] / tools / winapi / winapi_module_user.pm
blobbe853c5a9aa5aece5e96909a6296708db6ea57e9
1 package winapi_module_user;
3 use strict;
5 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
6 require Exporter;
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
20 use config qw($wine_dir);
21 use options qw($options);
22 use output qw($output);
24 use c_parser;
26 ########################################################################
28 my $message;
30 ########################################################################
31 # is_user_function
33 sub is_user_function {
34 my $name = shift;
35 if($name =~ /^(?:DefWindowProc|SendMessage)[AW]?$/) {
39 ########################################################################
40 # $message
42 $message = {
43 WM_ACTIVATE => {
44 id => 0, result => "void", wparam => ["", ""], lparam => "HWND" },
45 WM_ACTIVATEAPP => {
46 id => 0, result => "void", wparam => "BOOL", lparam => "LPARAM" },
48 WM_BEGINDRAG => {
49 id => 0, result => "", wparam => "", lparam => "" },
51 WM_CANCELMODE => {
52 id => 0, result => "void", wparam => "void", lparam => "void" },
53 WM_CHAR => {
54 id => 0, result => "void", wparam => "TCHAR", lparam => ["", ""] },
55 WM_CHARTOITEM => {
56 id => 0x002f, result => "void", wparam => ["UINT", "int"], lparam => "HWND" },
57 WM_CLOSE => {
58 id => 0, result => "void", wparam => "void", lparam => "void" },
59 WM_COMMAND => {
60 id => 0, result => "void", wparam => ["int", "UINT"], lparam => "HWND" },
61 WM_COPY => {
62 id => 0x0301, result => "void", wparam => "void", lparam => "void" },
63 WM_COMPACTING => {
64 id => 0, result => "void", wparam => "UINT", lparam => "void" },
65 WM_COMPAREITEM => {
66 id => 0, result => "int", wparam => "UINT", lparam => "const COMPAREITEMSTRUCT *" },
68 WM_CREATE => {
69 id => 0, result => "BOOL", wparam => "void", lparam => "LPCREATESTRUCT" },
70 WM_CTLCOLORBTN => {
71 id => 0x0135, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
72 WM_CTLCOLORDLG => {
73 id => 0x136, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
74 WM_CTLCOLOREDIT => {
75 id => 0x133, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
76 WM_CTLCOLORLISTBOX => {
77 id => 0x134, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
78 WM_CTLCOLORMSGBOX => {
79 id => 0x132, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
80 WM_CTLCOLORSCROLLBAR => {
81 id => 0x137, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
82 WM_CTLCOLORSTATIC => {
83 id => 0x138, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
85 WM_CUT => {
86 id => 0, result => "void", wparam => "void", lparam => "void" },
88 WM_DEADCHAR => {
89 id => 0, result => "void", wparam => "TCHAR", lparam => ["", ""] },
90 WM_DELETEITEM => {
91 id => 0, result => "void", wparam => "UINT", lparam => "const DELETEITEMSTRUCT *" },
92 WM_DEVMODECHANGE => {
93 id => 0, result => "void", wparam => "void", lparam => "LPCTSTR" },
94 WM_DESTROY => {
95 id => 0, result => "void", wparam => "void", lparam => "void" },
96 WM_DRAWITEM => {
97 id => 0, result => "void", wparam => "void", lparam => "const DRAWITEMSTRUCT *" },
98 WM_DROPFILES => {
99 id => 0, result => "void", wparam => "HDROP", lparam => "void" },
101 WM_ENABLE => {
102 id => 0, result => "void", wparam => "BOOL", lparam => "void" },
103 WM_ENDSESSION => {
104 id => 0, result => "void", wparam => "BOOL", lparam => "void" },
105 WM_ENTERIDLE => {
106 id => 0x0121, result => "void", wparam => "UINT", lparam => "HWND" },
107 WM_ENTERMENULOOP => {
108 id => 0x0211, result => "", wparam => "", lparam => "" },
109 WM_ERASEBKGND => {
110 id => 0, result => "BOOL", wparam => "HDC", lparam => "void" },
111 WM_EXITMENULOOP => {
112 id => 0x0212, result => "", wparam => "", lparam => "" },
114 WM_FONTCHANGE => {
115 id => 0, result => "void", wparam => "void", lparam => "void" },
117 WM_GETTEXT => {
118 id => 0, result => "int", wparam => "int", lparam => "LPTSTR" },
119 WM_GETTEXTLENGTH => {
120 id => 0, result => "int", wparam => "void", lparam => "void" },
122 WM_HELP => {
123 id => 0x0053, result => "", wparam => "", lparam => "" },
124 WM_HSCROLL => {
125 id => 0, result => "void", wparam => ["UINT", "int"], lparam => "HWND" },
127 WM_ICONERASEBKGND => {
128 id => 0, result => "BOOL", wparam => "HDC", lparam => "void" },
129 WM_INITMENU => {
130 id => 0, result => "void", wparam => "HMENU", lparam => "void" },
131 WM_INITMENUPOPUP => {
132 id => 0, result => "void", wparam => "HMENU", lparam => ["UINT", "BOOL"] },
133 WM_ISACTIVEICON => {
134 id => 0, result => "", wparam => "", lparam => "" },
136 WM_KEYDOWN => {
137 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
138 WM_KEYUP => {
139 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
140 WM_KILLFOCUS => {
141 id => 0, result => "void", wparam => "HWND", lparam => "void" },
143 WM_LBTRACKPOINT => {
144 id => 0, result => "", wparam => "", lparam => "" },
145 WM_LBUTTONDBLCLK => {
146 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
147 WM_LBUTTONDOWN => {
148 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
149 WM_LBUTTONUP => {
150 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
152 WM_MBUTTONDBLCLK => {
153 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
154 WM_MBUTTONDOWN => {
155 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
156 WM_MBUTTONUP => {
157 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
158 WM_MEASUREITEM => {
159 id => 0, result => "void", wparam => "UINT", lparam => "MEASUREITEMSTRUCT *" },
160 WM_MENUSELECT => {
161 id => 0, result => "void", wparam => ["", ""], lparam => "HMENU" },
162 WM_MENUCHAR => {
163 id => 0, result => "DWORD", wparam => ["", ""], lparam => "HMENU" },
164 WM_MOUSEACTIVATE => {
165 id => 0, result => "int", wparam => "HWND", lparam => ["", ""] },
166 WM_MOUSEMOVE => {
167 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
168 WM_MOVE => {
169 id => 0, result => "void", wparam => "void", lparam => ["", ""] },
171 WM_NCACTIVATE => {
172 id => 0, result => "BOOL", wparam => "BOOL", lparam => "void" },
173 WM_NCLBUTTONDBLCLK => {
174 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
175 WM_NCLBUTTONDOWN => {
176 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
177 WM_NCLBUTTONUP => {
178 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
179 WM_NCMOUSEMOVE => {
180 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
181 WM_NCMBUTTONDBLCLK => {
182 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
183 WM_NCMBUTTONDOWN => {
184 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
185 WM_NCMBUTTONUP => {
186 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
187 WM_NCRBUTTONDBLCLK => {
188 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
189 WM_NCRBUTTONDOWN => {
190 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
191 WM_NCRBUTTONUP => {
192 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
193 WM_NCCALCSIZE => {
194 id => 0, result => "UINT", wparam => "void", lparam => "LPARAM" },
195 WM_NCCREATE => {
196 id => 0, result => "BOOL", wparam => "void", lparam => "LPCREATESTRUCT" },
197 WM_NCDESTROY => {
198 id => 0, result => "void", wparam => "void", lparam => "void" },
199 WM_NCPAINT => {
200 id => 0, result => "void", wparam => "HRGN", lparam => "void" },
201 WM_NEXTMENU => {
202 id => 0x0213, result => "", wparam => "", lparam => "" },
203 WM_NOTIFY => {
204 id => 0x004e, result => "LRESULT", wparam => "int", lparam => "NMHDR *" },
207 WM_PALETTEISCHANGING => {
208 id => 0, result => "void", wparam => "HWND", lparam => "void" },
209 WM_PALETTECHANGED => {
210 id => 0, result => "void", wparam => "HWND", lparam => "void" },
211 WM_PAINT => {
212 id => 0, result => "void", wparam => "void", lparam => "void" },
213 WM_PASTE => {
214 id => 0x0302, result => "void", wparam => "void", lparam => "void" },
215 WM_POWER => {
216 id => 0, result => "void", wparam => "int", lparam => "void" },
218 WM_QUERYDRAGICON => {
219 id => 0, result => "HICON", wparam => "void", lparam => "void" },
220 WM_QUERYENDSESSION => {
221 id => 0, result => "BOOL", wparam => "void", lparam => "void" },
222 WM_QUERYNEWPALETTE => {
223 id => 0, result => "BOOL", wparam => "void", lparam => "void" },
224 WM_QUERYOPEN => {
225 id => 0, result => "BOOL", wparam => "void", lparam => "void" },
226 WM_QUIT => {
227 id => 0, result => "void", wparam => "WPARAM", lparam => "void" },
229 WM_RBUTTONDBLCLK => {
230 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
231 WM_RBUTTONDOWN => {
232 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
233 WM_RBUTTONUP => {
234 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
236 WM_SETCURSOR => {
237 id => 0x0020, result => "", wparam => "HWND", lparam => ["UINT", "UINT"] },
238 WM_SETFOCUS => {
239 id => 0, result => "void", wparam => "HWND", lparam => "void" },
240 WM_SETFONT => {
241 id => 0x0030, result => "void", wparam => "HFONT", lparam => "BOOL" },
242 WM_SETREDRAW => {
243 id => 0, result => "void", wparam => "BOOL", lparam => "void" },
244 WM_SETTEXT => {
245 id => 0, result => "void", wparam => "void", lparam => "LPCTSTR" },
246 WM_SHOWWINDOW => {
247 id => 0, result => "void", wparam => "BOOL", lparam => "UINT" },
248 WM_SIZE => {
249 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
250 WM_SPOOLERSTATUS => {
251 id => 0, result => "void", wparam => "WPARAM", lparam => ["", ""] },
252 WM_SYSCHAR => {
253 id => 0, result => "void", wparam => "TCHAR", lparam => ["", ""] },
254 WM_SYSCOLORCHANGE => {
255 id => 0, result => "void", wparam => "void", lparam => "void" },
256 WM_SYSDEADCHAR => {
257 id => 0, result => "void", wparam => "TCHAR", lparam => ["", ""] },
258 WM_SYSKEYDOWN => {
259 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
260 WM_SYSKEYUP => {
261 id => 0, result => "void", wparam => "UINT", lparam => ["", ""] },
263 WM_TIMECHANGE => {
264 id => 0, result => "void", wparam => "void", lparam => "void" },
266 WM_VKEYTOITEM => {
267 id => 0x002e, result => "void", wparam => ["UINT", "int"], lparam => "HWND" },
268 WM_VSCROLL => {
269 id => 0, result => "void", wparam => ["UINT", "int"], lparam => "HWND" },
271 WM_WINDOWPOSCHANGING => {
272 id => 0, result => "BOOL", wparam => "void", lparam => "LPWINDOWPOS" },
273 WM_WINDOWPOSCHANGED => {
274 id => 0, result => "void", wparam => "void", lparam => "LPARAM" },
275 WM_WININICHANGE => {
276 id => 0, result => "void", wparam => "void", lparam => "LPCTSTR" }
279 ########################################################################
280 # _get_kind
282 sub _get_kind {
283 local $_ = shift;
285 if(!defined($_)) {
286 return undef;
287 } elsif(/^(?:HBRUSH|HDC|HFONT|HMENU|HRGN|HWND)$/ || /\*$/ ||
288 /^LP(?!ARAM)/)
290 return "ptr";
291 } else {
292 return "long";
296 ########################################################################
297 # get_message_result_type
299 sub get_message_result_type {
300 my $name = shift;
301 return $$message{$name}{result};
304 ########################################################################
305 # get_message_result_kind
307 sub get_message_result_kind {
308 return _get_kind(get_message_result_type(@_));
311 ########################################################################
312 # get_message_wparam_type
314 sub get_message_wparam_type {
315 my $name = shift;
316 return $$message{$name}{wparam};
319 ########################################################################
320 # get_message_wparam_kind
322 sub get_message_wparam_kind {
323 return _get_kind(get_message_wparam_type(@_));
326 ########################################################################
327 # get_message_lparam_type
329 sub get_message_lparam_type {
330 my $name = shift;
331 return $$message{$name}{lparam};
334 ########################################################################
335 # get_message_lparam_kind
337 sub get_message_lparam_kind {
338 return _get_kind(get_message_lparam_type(@_));
341 ########################################################################
342 # _parse_windowsx_h
344 sub _parse_windowsx_h {
345 my $file = "$wine_dir/include/windowsx.h";
347 open(IN, "< $file");
348 local $/ = undef;
349 $_ = <IN>;
350 close(IN);
353 my $parser = new c_parser($file);
355 my $found_preprocessor = sub {
356 my $begin_line = shift;
357 my $begin_column = shift;
358 local $_ = shift;
360 if(!s/^\#\s*define\s*// || !/^FORWARD_WM_/) {
361 return 1;
364 my $msg;
365 if(s/^FORWARD_(\w+)\([^\)]*\)\s*(.*?)\s*$/$2/s) {
366 $msg = $1;
369 if($msg eq "WM_SYSTEMERROR") {
370 return 1;
373 my $return_type;
374 if(s/^\(\s*(\w+)\s*\)(?:\(\s*\w+\s*\))*\(\s*\w+\s*\)\(\s*(?:hwnd|\(hwnd\))\s*,\s*(.*?)\s*\)$/$2/) {
375 $return_type = $1;
376 } else {
377 die "$msg: '$_'";
380 my @msgs = ();
381 if(s/^$msg\s*,\s*//) {
382 @msgs = $msg;
383 } elsif(s/^\(\w+\)\s*\?\s*(\w+)\s*:\s*(\w+)\s*,\s*//s) {
384 @msgs = ($1, $2);
385 } else {
386 die "$msg: '$_'";
389 my $wparam;
390 if(s/^\(WPARAM\)(?:\(\s*(\w+)\s*\))*\((.*?)\)\s*,\s*//) {
391 if(defined($1)) {
392 $wparam = $1;
393 } else {
394 $wparam = "WPARAM";
396 } elsif(s/^MAKEWPARAM\(\s*(.*?)\s*,\s*(.*?)\s*\)\s*,\s*//) {
397 $wparam = "(,)"; # "($1, $2)";
398 } elsif(s/^\((.*?)\)$//) {
399 $wparam = "WPARAM";
400 } elsif(s/^0L\s*,\s*//) {
401 $wparam = "void";
402 } else {
403 die "$msg: '$_'";
406 my $lparam;
407 if(s/^\(LPARAM\)(?:\(\s*(\w+)\s*\))*\((.*?)\)$//) {
408 if(defined($1)) {
409 $lparam = $1;
410 } else {
411 $lparam = "LPARAM";
413 } elsif(s/^MAKELPARAM\(\s*(.*?)\s*,\s*(.*?)\s*\)$//) {
414 $lparam = "(,)"; # "($1, $2)";
415 } elsif(s/^\((.*?)\)$//) {
416 $lparam = "LPARAM";
417 } elsif(s/^0L$//) {
418 $lparam = "void";
419 } else {
420 die "$msg: '$_'";
423 foreach my $msg (@msgs) {
424 $output->write("$msg => { result => \"$return_type\", wparam => \"$wparam\", lparam => \"$lparam\" },\n");
427 return 1;
430 $parser->set_found_preprocessor_callback($found_preprocessor);
432 my $line = 1;
433 my $column = 0;
435 my $old_prefix = $output->prefix;
436 $output->progress("$file");
437 $output->prefix("$file: ");
439 if(!$parser->parse_c_file(\$_, \$line, \$column)) {
440 $output->write("can't parse file\n");
443 $output->prefix($old_prefix);