winapi_module_user.pm 31.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#
# Copyright 1999, 2000, 2001 Patrik Stridvall
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 18
#

19 20 21 22 23 24 25 26 27 28
package winapi_module_user;

use strict;

use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
require Exporter;

@ISA = qw(Exporter);
@EXPORT = qw();
@EXPORT_OK = qw(
29 30 31 32 33 34 35
    is_user_function
    get_message_result_type
    get_message_result_kind
    get_message_wparam_type
    get_message_wparam_kind
    get_message_lparam_type
    get_message_lparam_kind
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
);

use config qw($wine_dir);
use options qw($options);
use output qw($output);

use c_parser;

########################################################################

my $message;

########################################################################
# is_user_function

51
sub is_user_function($) {
52 53 54 55 56 57 58 59 60 61
    my $name = shift;
    if($name =~ /^(?:DefWindowProc|SendMessage)[AW]?$/) {
    }
}

########################################################################
# $message

$message = {
    WM_ACTIVATE => {
62
	id => 0x0006, result => "void", wparam => ["", ""], lparam => "HWND" },
63
    WM_ACTIVATEAPP => {
64 65 66 67 68 69 70 71 72 73 74
	id => 0x001c, result => "void", wparam => "BOOL", lparam => "DWORD" },
    WM_ACTIVATESHELLWINDOW => {
        id => 0x003e, result => "", wparam => "", lparam => "" },
    WM_ACTIVATETOPLEVEL => {
        id => 0x036e, result => "", wparam => "", lparam => "" },
    WM_ALTTABACTIVE => {
        id => 0x0029, result => "", wparam => "", lparam => "" },
    WM_APP => {
        id => 0x8000, result => "", wparam => "", lparam => "" },
    WM_ASKCBFORMATNAME => {
        id => 0x030c, result => "void", wparam => "int", lparam => "LPTSTR" },
75 76

    WM_BEGINDRAG => {
77
	id => 0x022c, result => "", wparam => "", lparam => "" },
78 79

    WM_CANCELMODE => {
80 81 82 83 84 85 86 87 88 89 90
	id => 0x001f, result => "void", wparam => "void", lparam => "void" },
    WM_CANCELJOURNAL => {
        id => 0x004b, result => "", wparam => "", lparam => "" },
    WM_CAPTURECHANGED => {
        id => 0x0215, result => "void", wparam => "void", lparam => "HWND" },
    WM_CHANGECBCHAIN => {
        id => 0x030d, result => "void", wparam => "HWND", lparam => "HWND" },
    WM_CHILDACTIVATE => {
        id => 0x0022, result => "void", wparam => "void", lparam => "void" },
    WM_CLEAR => {
        id => 0x0303, result => "void", wparam => "void", lparam => "void" },
91
    WM_CHAR => {
92
	id => 0x0102, result => "void", wparam => "TCHAR", lparam => ["", ""] },
93
    WM_CHARTOITEM => {
94
	id => 0x002f, result => "int", wparam => ["UINT", "UINT"], lparam => "HWND" },
95
    WM_CLOSE => {
96 97 98 99 100
	id => 0x0010, result => "void", wparam => "void", lparam => "void" },
    WM_COALESCE_FIRST => {
        id => 0x0390, result => "", wparam => "", lparam => "" },
    WM_COALESCE_LAST => {
        id => 0x039f, result => "", wparam => "", lparam => "" },
101
    WM_COMMAND => {
102 103 104 105 106 107 108
	id => 0x0111, result => "void", wparam => ["UINT", "UINT"], lparam => "HWND" },
    WM_COMMANDHELP => {
        id => 0x0365, result => "", wparam => "", lparam => "" },
    WM_COMMNOTIFY => {
        id => 0x0044, result => "void", wparam => "int", lparam => ["", ""] },
    WM_CONTEXTMENU => {
        id => 0x007b, result => "void", wparam => "HWND", lparam => ["UINT", "UINT"] },
109 110
    WM_COPY => {
	id => 0x0301, result => "void", wparam => "void", lparam => "void" },
111 112
    WM_COPYDATA => {
        id => 0x004a, result => "", wparam => "", lparam => "" },
113
    WM_COMPACTING => {
114
	id => 0x0041, result => "void", wparam => "UINT", lparam => "void" },
115
    WM_COMPAREITEM => {
116
	id => 0x0039, result => "int", wparam => "UINT", lparam => "const COMPAREITEMSTRUCT *" },
117
    WM_CREATE => {
118 119 120
	id => 0x0001, result => "BOOL", wparam => "void", lparam => "LPCREATESTRUCT" },
    WM_CTLCOLOR => {
        id => 0x0019, result => "", wparam => "", lparam => "" },
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
    WM_CTLCOLORBTN => {
	id => 0x0135, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
    WM_CTLCOLORDLG => {
	id => 0x136, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
    WM_CTLCOLOREDIT => {
	id => 0x133, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
    WM_CTLCOLORLISTBOX => {
	id => 0x134, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
    WM_CTLCOLORMSGBOX => {
	id => 0x132, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
    WM_CTLCOLORSCROLLBAR => {
	id => 0x137, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
    WM_CTLCOLORSTATIC => {
	id => 0x138, result => "HBRUSH", wparam => "HDC", lparam => "HWND" },
    WM_CUT => {
136
	id => 0x0300, result => "void", wparam => "void", lparam => "void" },
137

138 139 140 141
    WM_DDE_ACK => { # FIXME: Only correct if replying to WM_DDE_INITIATE
	id => 0x03E4, result => "void", wparam => "HWND", lparam => ["ATOM", "ATOM"] },
    WM_DDE_INITIATE => {
	id => 0x03E0, result => "void", wparam => "HWND", lparam => ["ATOM", "ATOM"] },
142
    WM_DEADCHAR => {
143 144 145
	id => 0x0103, result => "void", wparam => "TCHAR", lparam => ["", ""] },
    WM_DEVICECHANGE => {
        id => 0x0219, result => "BOOL", wparam => "UINT", lparam => "DWORD" },
146
    WM_DELETEITEM => {
147
	id => 0x002d, result => "void", wparam => "UINT", lparam => "const DELETEITEMSTRUCT *" },
148
    WM_DEVMODECHANGE => {
149
	id => 0x001b, result => "void", wparam => "void", lparam => "LPCTSTR" },
150
    WM_DESTROY => {
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
	id => 0x0002, result => "void", wparam => "void", lparam => "void" },
    WM_DESTROYCLIPBOARD => {
        id => 0x0307, result => "void", wparam => "void", lparam => "void" },
    WM_DISABLEMODAL => {
        id => 0x036c, result => "", wparam => "", lparam => "" },
    WM_DISPLAYCHANGE => {
        id => 0x007e, result => "void", wparam => "UINT", lparam => ["UINT", "UINT"] },
    WM_DRAGLOOP => {
        id => 0x022d, result => "", wparam => "", lparam => "" },
    WM_DRAGMOVE => {
        id => 0x022f, result => "", wparam => "", lparam => "" },
    WM_DRAGSELECT => {
        id => 0x022e, result => "", wparam => "", lparam => "" },
    WM_DRAWCLIPBOARD => {
        id => 0x0308, result => "void", wparam => "void", lparam => "void" },
166
    WM_DRAWITEM => {
167
	id => 0x002b, result => "void", wparam => "UINT", lparam => "const DRAWITEMSTRUCT *" },
168
    WM_DROPFILES => {
169 170 171
	id => 0x0233, result => "void", wparam => "HDROP", lparam => "void" },
    WM_DROPOBJECT => {
        id => 0x022a, result => "", wparam => "", lparam => "" },
172 173

    WM_ENABLE => {
174
	id => 0x000a, result => "void", wparam => "BOOL", lparam => "void" },
175
    WM_ENDSESSION => {
176
	id => 0x0016, result => "void", wparam => "BOOL", lparam => "void" },
177 178
    WM_ENTERIDLE => {
	id => 0x0121, result => "void", wparam => "UINT", lparam => "HWND" },
179 180
    WM_ENTERSIZEMOVE => {
        id => 0x0231, result => "", wparam => "", lparam => "" },
181 182 183
    WM_ENTERMENULOOP => {
	id => 0x0211, result => "", wparam => "", lparam => "" },
    WM_ERASEBKGND => {
184 185 186
	id => 0x0014, result => "BOOL", wparam => "HDC", lparam => "void" },
    WM_EXITHELPMODE => {
        id => 0x0367, result => "", wparam => "", lparam => "" },
187 188
    WM_EXITMENULOOP => {
	id => 0x0212, result => "", wparam => "", lparam => "" },
189 190
    WM_EXITSIZEMOVE => {
        id => 0x0232, result => "", wparam => "", lparam => "" },
191

192 193 194 195
    WM_FILESYSCHANGE => {
        id => 0x0034, result => "", wparam => "", lparam => "" },
    WM_FLOATSTATUS => {
        id => 0x036d, result => "", wparam => "", lparam => "" },
196
    WM_FONTCHANGE => {
197 198 199 200 201 202 203 204 205 206 207 208
	id => 0x001d, result => "void", wparam => "void", lparam => "void" },

    WM_GETDLGCODE => {
        id => 0x0087, result => "UINT", wparam => "WPARAM", lparam => "LPMSG" },
    WM_GETFONT => {
        id => 0x0031, result => "HFONT", wparam => "void", lparam => "void" },
    WM_GETHOTKEY => {
        id => 0x0033, result => "", wparam => "", lparam => "" },
    WM_GETICON => {
        id => 0x007f, result => "", wparam => "", lparam => "" },
    WM_GETMINMAXINFO => {
        id => 0x0024, result => "void", wparam => "void", lparam => "LPMINMAXINFO" },
209
    WM_GETTEXT => {
210
	id => 0x000d, result => "int", wparam => "int", lparam => "LPTSTR" },
211
    WM_GETTEXTLENGTH => {
212
	id => 0x000e, result => "int", wparam => "void", lparam => "void" },
213 214

    WM_HELP => {
215 216 217 218 219
	id => 0x0053, result => "void", wparam => "void", lparam => "LPHELPINFO" },
    WM_HELPHITTEST => {
        id => 0x0366, result => "", wparam => "", lparam => "" },
    WM_HOTKEY => {
        id => 0x0312, result => "", wparam => "", lparam => "" },
220
    WM_HSCROLL => {
221 222 223
	id => 0x0114, result => "void", wparam => ["int", "int"], lparam => "HWND" },
    WM_HSCROLLCLIPBOARD => {
        id => 0x030e, result => "void", wparam => "HWND", lparam => "" },
224 225

    WM_ICONERASEBKGND => {
226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
	id => 0x0027, result => "BOOL", wparam => "HDC", lparam => "void" },
    WM_IME_CHAR => {
        id => 0x0286, result => "", wparam => "", lparam => "" },
    WM_IME_COMPOSITION => {
        id => 0x010f, result => "", wparam => "", lparam => "" },
    WM_IME_COMPOSITIONFULL => {
        id => 0x0284, result => "", wparam => "", lparam => "" },
    WM_IME_CONTROL => {
        id => 0x0283, result => "", wparam => "", lparam => "" },
    WM_IME_ENDCOMPOSITION => {
        id => 0x010e, result => "", wparam => "", lparam => "" },
    WM_IME_KEYDOWN => {
	id => 0x0290, result => "void", wparam => "UINT", lparam => ["int", "UINT"] },
    WM_IME_KEYLAST => {
        id => 0x010f, result => "", wparam => "", lparam => "" },
    WM_IME_KEYUP => {
	id => 0x0291, result => "void", wparam => "UINT", lparam => ["int", "UINT"] },
    WM_IME_NOTIFY => {
        id => 0x0282, result => "", wparam => "", lparam => "" },
    WM_IME_REQUEST => {
        id => 0x0288, result => "", wparam => "", lparam => "" },
    WM_IME_SELECT => {
        id => 0x0285, result => "", wparam => "", lparam => "" },
    WM_IME_SETCONTEXT => {
        id => 0x0281, result => "", wparam => "", lparam => "" },
    WM_IME_STARTCOMPOSITION => {
        id => 0x010d, result => "", wparam => "", lparam => "" },
    WM_IDLEUPDATECMDUI => {
        id => 0x0363, result => "", wparam => "", lparam => "" },
    WM_INITDIALOG => {
        id => 0x0110, result => "BOOL", wparam => "HWND", lparam => "LPARAM" },
    WM_INITIALUPDATE => {
        id => 0x0364, result => "", wparam => "", lparam => "" },
259
    WM_INITMENU => {
260
	id => 0x0116, result => "void", wparam => "HMENU", lparam => "void" },
261
    WM_INITMENUPOPUP => {
262 263 264 265 266
	id => 0x0117, result => "void", wparam => "HMENU", lparam => ["UINT", "BOOL"] },
    WM_INPUTLANGCHANGE => {
        id => 0x0051, result => "", wparam => "", lparam => "" },
    WM_INPUTLANGCHANGEREQUEST => {
        id => 0x0050, result => "", wparam => "", lparam => "" },
267
    WM_ISACTIVEICON => {
268
	id => 0x0035, result => "", wparam => "", lparam => "" },
269 270

    WM_KEYDOWN => {
271 272 273 274 275
	id => 0x0100, result => "void", wparam => "UINT", lparam => ["int", "UINT"] },
    WM_KEYLAST => {
	id => 0x0108, result => "", wparam => "", lparam => "" },
    WM_KICKIDLE => {
	id => 0x036a, result => "", wparam => "", lparam => "" },
276
    WM_KEYUP => {
277
	id => 0x0101, result => "void", wparam => "UINT", lparam => ["", ""] },
278
    WM_KILLFOCUS => {
279
	id => 0x0008, result => "void", wparam => "HWND", lparam => "void" },
280 281

    WM_LBTRACKPOINT => {
282
	id => 0x0131, result => "", wparam => "", lparam => "" },
283
    WM_LBUTTONDBLCLK => {
284
	id => 0x0203, result => "void", wparam => "UINT", lparam => ["", ""] },
285
    WM_LBUTTONDOWN => {
286
	id => 0x0201, result => "void", wparam => "UINT", lparam => ["", ""] },
287
    WM_LBUTTONUP => {
288
	id => 0x0202, result => "void", wparam => "UINT", lparam => ["", ""] },
289 290

    WM_MBUTTONDBLCLK => {
291
	id => 0x0209, result => "void", wparam => "UINT", lparam => ["", ""] },
292
    WM_MBUTTONDOWN => {
293
	id => 0x0207, result => "void", wparam => "UINT", lparam => ["", ""] },
294
    WM_MBUTTONUP => {
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
	id => 0x0208, result => "void", wparam => "UINT", lparam => ["", ""] },
    WM_MDIACTIVATE => {
	id => 0x0222, result => "void", wparam => "HWND", lparam => "HWND" },
    WM_MDICASCADE => {
	id => 0x0227, result => "BOOL", wparam => "UINT", lparam => "void" },
    WM_MDICREATE => {
	id => 0x0220, result => "HWND", wparam => "void", lparam => "const LPMDICREATESTRUCT" },
    WM_MDIDESTROY => {
	id => 0x0221, result => "void", wparam => "HWND", lparam => "void" },
    WM_MDIGETACTIVE => {
	id => 0x0229, result => "HWND", wparam => "void", lparam => "void" },
    WM_MDIICONARRANGE => {
	id => 0x0228, result => "void", wparam => "void", lparam => "void" },
    WM_MDIMAXIMIZE => {
	id => 0x0225, result => "void", wparam => "HWND", lparam => "void" },
    WM_MDINEXT => {
	id => 0x0224, result => "HWND", wparam => "HWND", lparam => "BOOL" },
    WM_MDIREFRESHMENU => {
	id => 0x0234, result => "", wparam => "", lparam => "" },
    WM_MDIRESTORE => {
	id => 0x0223, result => "void", wparam => "HWND", lparam => "void" },
    WM_MDISETMENU => {
	id => 0x0230, result => "HMENU", wparam => "BOOL", lparam => "HMENU" },
    WM_MDITILE => {
	id => 0x0226, result => "BOOL", wparam => "UINT", lparam => "void" },
320
    WM_MEASUREITEM => {
321
	id => 0x002c, result => "void", wparam => "UINT", lparam => "MEASUREITEMSTRUCT *" },
322
    WM_MENUSELECT => {
323
	id => 0x011f, result => "void", wparam => ["", ""], lparam => "HMENU" },
324
    WM_MENUCHAR => {
325
	id => 0x0120, result => "DWORD", wparam => ["", "WORD"], lparam => "HMENU" },
326
    WM_MOUSEACTIVATE => {
327
	id => 0x0021, result => "int", wparam => "HWND", lparam => ["", ""] },
328
    WM_MOUSEMOVE => {
329 330 331
	id => 0x0200, result => "void", wparam => "UINT", lparam => ["", ""] },
    WM_MOUSEWHEEL => {
	id => 0x020a, result => "void", wparam => ["DWORD", "int"], lparam => ["UINT", "UINT"] },
332
    WM_MOVE => {
333 334 335
	id => 0x0003, result => "void", wparam => "void", lparam => ["", ""] },
    WM_MOVING => {
	id => 0x0216, result => "", wparam => "", lparam => "" },
336 337

    WM_NCACTIVATE => {
338
	id => 0x0086, result => "BOOL", wparam => "BOOL", lparam => "void" },
339
    WM_NCLBUTTONDBLCLK => {
340
	id => 0x00a3, result => "void", wparam => "UINT", lparam => ["", ""] },
341
    WM_NCLBUTTONDOWN => {
342
	id => 0x00a1, result => "void", wparam => "UINT", lparam => ["", ""] },
343
    WM_NCLBUTTONUP => {
344
	id => 0x00a2, result => "void", wparam => "UINT", lparam => ["", ""] },
345
    WM_NCMOUSEMOVE => {
346
	id => 0x00a0, result => "void", wparam => "UINT", lparam => ["", ""] },
347
    WM_NCMBUTTONDBLCLK => {
348
	id => 0x00a9, result => "void", wparam => "UINT", lparam => ["", ""] },
349
    WM_NCMBUTTONDOWN => {
350
	id => 0x00a7, result => "void", wparam => "UINT", lparam => ["", ""] },
351
    WM_NCMBUTTONUP => {
352
	id => 0x00a8, result => "void", wparam => "UINT", lparam => ["", ""] },
353
    WM_NCRBUTTONDBLCLK => {
354
	id => 0x00a6, result => "void", wparam => "UINT", lparam => ["", ""] },
355
    WM_NCRBUTTONDOWN => {
356
	id => 0x00a4, result => "void", wparam => "UINT", lparam => ["", ""] },
357
    WM_NCRBUTTONUP => {
358
	id => 0x00a5, result => "void", wparam => "UINT", lparam => ["", ""] },
359
    WM_NCCALCSIZE => {
360
	id => 0x0083, result => "UINT", wparam => "void", lparam => "NCCALCSIZE_PARAMS *" },
361
    WM_NCCREATE => {
362
	id => 0x0081, result => "BOOL", wparam => "void", lparam => "LPCREATESTRUCT" },
363
    WM_NCDESTROY => {
364 365 366
	id => 0x0082, result => "void", wparam => "void", lparam => "void" },
    WM_NCHITTEST => {
	id => 0x0084, result => "UINT", wparam => "void", lparam => ["int", "int"] },
367
    WM_NCPAINT => {
368 369 370
	id => 0x0085, result => "void", wparam => "HRGN", lparam => "void" },
    WM_NEXTDLGCTL => {
	id => 0x0028, result => "HWND", wparam => "HWND", lparam => "BOOL" },
371
    WM_NEXTMENU => {
372
	id => 0x0213, result => "void", wparam => "UINT", lparam => "LPMDINEXTMENU" },
373 374
    WM_NOTIFY => {
	id => 0x004e, result => "LRESULT", wparam => "int", lparam => "NMHDR *" },
375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
    WM_NOTIFYFORMAT => {
	id => 0x0055, result => "", wparam => "", lparam => "" },
    WM_NULL => {
	id => 0x0000, result => "", wparam => "", lparam => "" },

    WM_OCC_INITNEW => {
	id => 0x0378, result => "", wparam => "", lparam => "" },
    WM_OCC_LOADFROMSTORAGE => {
	id => 0x0377, result => "", wparam => "", lparam => "" },
    WM_OCC_LOADFROMSTORAGE_EX => {
	id => 0x037b, result => "", wparam => "", lparam => "" },
    WM_OCC_LOADFROMSTREAM => {
	id => 0x0376, result => "", wparam => "", lparam => "" },
    WM_OCC_LOADFROMSTREAM_EX => {
	id => 0x037a, result => "", wparam => "", lparam => "" },
    WM_OTHERWINDOWCREATED => {
	id => 0x003c, result => "", wparam => "", lparam => "" },
    WM_OTHERWINDOWDESTROYED => {
	id => 0x003d, result => "", wparam => "", lparam => "" },
394

395 396 397 398 399 400
    WM_PAINT => {
	id => 0x000f, result => "void", wparam => "void", lparam => "void" },
    WM_PAINTCLIPBOARD => {
	id => 0x0309, result => "void", wparam => "HWND", lparam => "const LPPAINTSTRUCT" },
    WM_PAINTICON => {
	id => 0x0026, result => "", wparam => "", lparam => "" },
401
    WM_PALETTEISCHANGING => {
402
	id => 0x0310, result => "void", wparam => "HWND", lparam => "void" },
403
    WM_PALETTECHANGED => {
404 405 406
	id => 0x0311, result => "void", wparam => "HWND", lparam => "void" },
    WM_PARENTNOTIFY => {
	id => 0x0210, result => "void", wparam => ["UINT", "int"], lparam => "HWND" },
407 408
    WM_PASTE => {
	id => 0x0302, result => "void", wparam => "void", lparam => "void" },
409 410 411 412 413 414
    WM_PENWINFIRST => {
	id => 0x0380, result => "", wparam => "", lparam => "" },
    WM_PENWINLAST => {
	id => 0x038f, result => "", wparam => "", lparam => "" },
    WM_POPMESSAGESTRING => {
	id => 0x0375, result => "", wparam => "", lparam => "" },
415
    WM_POWER => {
416 417 418 419 420 421 422 423 424 425 426 427 428 429
	id => 0x0048, result => "void", wparam => "int", lparam => "void" },
    WM_POWERBROADCAST => {
	id => 0x0218, result => "", wparam => "", lparam => "" },
    WM_PRINT => {
	id => 0x0317, result => "", wparam => "", lparam => "" },
    WM_PRINTCLIENT => {
	id => 0x0318, result => "void", wparam => "HDC", lparam => "DWORD" },

    WM_QUERY3DCONTROLS => {
	id => 0x036f, result => "", wparam => "", lparam => "" },
    WM_QUERYAFXWNDPROC => {
	id => 0x0360, result => "", wparam => "", lparam => "" },
    WM_QUERYCENTERWND => {
	id => 0x036b, result => "", wparam => "", lparam => "" },
430
    WM_QUERYDRAGICON => {
431 432 433
	id => 0x0037, result => "HICON", wparam => "void", lparam => "void" },
    WM_QUERYDROPOBJECT => {
	id => 0x022b, result => "", wparam => "", lparam => "" },
434
    WM_QUERYENDSESSION => {
435
	id => 0x0011, result => "BOOL", wparam => "void", lparam => "void" },
436
    WM_QUERYNEWPALETTE => {
437
	id => 0x030f, result => "BOOL", wparam => "void", lparam => "void" },
438
    WM_QUERYOPEN => {
439 440 441 442 443 444 445 446 447
	id => 0x0013, result => "BOOL", wparam => "void", lparam => "void" },
    WM_QUERYPARKICON => {
	id => 0x0036, result => "", wparam => "", lparam => "" },
    WM_QUERYSAVESTATE => {
	id => 0x0038, result => "", wparam => "", lparam => "" },
    WM_QUEUESYNC => {
	id => 0x0023, result => "void", wparam => "void", lparam => "void" },
    WM_QUEUE_SENTINEL => {
	id => 0x0379, result => "", wparam => "", lparam => "" },
448
    WM_QUIT => {
449
	id => 0x0012, result => "void", wparam => "int", lparam => "void" },
450 451

    WM_RBUTTONDBLCLK => {
452
	id => 0x0206, result => "void", wparam => "UINT", lparam => ["", ""] },
453
    WM_RBUTTONDOWN => {
454
	id => 0x0204, result => "void", wparam => "UINT", lparam => ["", ""] },
455
    WM_RBUTTONUP => {
456 457 458 459 460 461 462
	id => 0x0205, result => "void", wparam => "UINT", lparam => ["", ""] },
    WM_RECALCPARENT => {
	id => 0x0368, result => "", wparam => "", lparam => "" },
    WM_RENDERALLFORMATS => {
	id => 0x0306, result => "void", wparam => "void", lparam => "void" },
    WM_RENDERFORMAT => {
	id => 0x0305, result => "HANDLE", wparam => "UINT", lparam => "void" },
463 464

    WM_SETCURSOR => {
465
	id => 0x0020, result => "BOOL", wparam => "HWND", lparam => ["UINT", "UINT"] },
466
    WM_SETFOCUS => {
467
	id => 0x0007, result => "void", wparam => "HWND", lparam => "void" },
468 469
    WM_SETFONT => {
	id => 0x0030, result => "void", wparam => "HFONT", lparam => "BOOL" },
470 471 472 473 474 475
    WM_SETHOTKEY => {
	id => 0x0032, result => "", wparam => "", lparam => "" },
    WM_SETICON => {
	id => 0x0080, result => "HICON", wparam => "DWORD", lparam => "HICON" },
    WM_SETMESSAGESTRING => {
	id => 0x0362, result => "", wparam => "", lparam => "" },
476
    WM_SETREDRAW => {
477
	id => 0x000b, result => "void", wparam => "BOOL", lparam => "void" },
478
    WM_SETTEXT => {
479 480 481
	id => 0x000c, result => "void", wparam => "void", lparam => "LPCTSTR" },
    WM_SETVISIBLE => {
	id => 0x0009, result => "", wparam => "", lparam => "" },
482
    WM_SHOWWINDOW => {
483
	id => 0x0018, result => "void", wparam => "BOOL", lparam => "UINT" },
484
    WM_SIZE => {
485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
	id => 0x0005, result => "void", wparam => "UINT", lparam => ["", ""] },
    WM_SIZECHILD => {
	id => 0x0369, result => "", wparam => "", lparam => "" },
    WM_SIZECLIPBOARD => {
	id => 0x030b, result => "void", wparam => "HWND", lparam => "const LPRECT" },
    WM_SIZEPARENT => {
	id => 0x0361, result => "", wparam => "", lparam => "" },
    WM_SIZEWAIT => {
	id => 0x0004, result => "", wparam => "", lparam => "" },
    WM_SIZING => {
	id => 0x0214, result => "", wparam => "", lparam => "" },
    WM_SOCKET_DEAD => {
	id => 0x0374, result => "", wparam => "", lparam => "" },
    WM_SOCKET_NOTIFY => {
	id => 0x0373, result => "", wparam => "", lparam => "" },
500
    WM_SPOOLERSTATUS => {
501 502 503 504 505 506 507 508 509
	id => 0x002a, result => "void", wparam => "UINT", lparam => ["", ""] },
    WM_STYLECHANGED => {
	id => 0x007d, result => "void", wparam => "DWORD", lparam => "LPSTYLESTRUCT" },
    WM_STYLECHANGING => {
	id => 0x007c, result => "void", wparam => "DWORD", lparam => "LPSTYLESTRUCT" },
    WM_SYNCPAINT => {
	id => 0x0088, result => "", wparam => "", lparam => "" },
    WM_SYNCTASK => {
	id => 0x0089, result => "", wparam => "", lparam => "" },
510
    WM_SYSCHAR => {
511
	id => 0x0106, result => "void", wparam => "TCHAR", lparam => ["", ""] },
512
    WM_SYSCOLORCHANGE => {
513 514 515
	id => 0x0015, result => "void", wparam => "void", lparam => "void" },
    WM_SYSCOMMAND => {
	id => 0x0112, result => "void", wparam => "UINT", lparam => "int" },
516
    WM_SYSDEADCHAR => {
517
	id => 0x0107, result => "void", wparam => "TCHAR", lparam => ["", ""] },
518
    WM_SYSKEYDOWN => {
519
	id => 0x0104, result => "void", wparam => "UINT", lparam => ["", ""] },
520
    WM_SYSKEYUP => {
521 522 523 524 525 526 527 528 529 530
	id => 0x0105, result => "void", wparam => "UINT", lparam => ["", ""] },
    WM_SYSTEMERROR => {
	id => 0x0017, result => "", wparam => "", lparam => "" },
    WM_SYSTIMER => {
	id => 0x0118, result => "", wparam => "", lparam => "" },

    WM_TCARD => {
	id => 0x0052, result => "", wparam => "", lparam => "" },
    WM_TESTING => {
	id => 0x003a, result => "", wparam => "", lparam => "" },
531
    WM_TIMECHANGE => {
532 533 534 535 536 537 538 539 540 541
	id => 0x001e, result => "void", wparam => "void", lparam => "void" },
    WM_TIMER => {
	id => 0x0113, result => "void", wparam => "UINT", lparam => "void" },

    WM_UNDO => {
	id => 0x0304, result => "void", wparam => "void", lparam => "void" },
    WM_USER => {
	id => 0x0400, result => "", wparam => "", lparam => "" },
    WM_USERCHANGED => {
	id => 0x0054, result => "", wparam => "", lparam => "" },
542 543

    WM_VKEYTOITEM => {
544
	id => 0x002e, result => "int", wparam => ["UINT", "int"], lparam => "HWND" },
545
    WM_VSCROLL => {
546 547 548
	id => 0x0115, result => "void", wparam => ["int", "int"], lparam => "HWND" },
    WM_VSCROLLCLIPBOARD => {
	id => 0x030a, result => "void", wparam => "HWND", lparam => ["", ""] },
549 550

    WM_WINDOWPOSCHANGING => {
551
	id => 0x0046, result => "BOOL", wparam => "void", lparam => "LPWINDOWPOS" },
552
    WM_WINDOWPOSCHANGED => {
553
	id => 0x0047, result => "void", wparam => "void", lparam => "const LPWINDOWPOS" },
554
    WM_WININICHANGE => {
555
	id => 0x001a, result => "void", wparam => "void", lparam => "LPCTSTR" }
556 557 558 559 560
};

########################################################################
# _get_kind

561
sub _get_kind($) {
562 563
    local $_ = shift;

564
    if(!$_) {
565 566 567 568 569 570 571 572 573 574 575 576 577
	return undef;
    } elsif(/^(?:HBRUSH|HDC|HFONT|HMENU|HRGN|HWND)$/ || /\*$/ ||
	    /^LP(?!ARAM)/)
    {
	return "ptr";
    } else {
	return "long";
    }
}

########################################################################
# get_message_result_type

578
sub get_message_result_type($) {
579 580 581 582 583 584 585
    my $name = shift;
    return $$message{$name}{result};
}

########################################################################
# get_message_result_kind

586
sub get_message_result_kind(@) {
587 588 589 590 591 592
    return _get_kind(get_message_result_type(@_));
}

########################################################################
# get_message_wparam_type

593
sub get_message_wparam_type($) {
594 595 596 597 598 599 600
    my $name = shift;
    return $$message{$name}{wparam};
}

########################################################################
# get_message_wparam_kind

601
sub get_message_wparam_kind(@) {
602 603 604 605 606 607
    return _get_kind(get_message_wparam_type(@_));
}

########################################################################
# get_message_lparam_type

608
sub get_message_lparam_type($) {
609 610 611 612 613 614 615
    my $name = shift;
    return $$message{$name}{lparam};
}

########################################################################
# get_message_lparam_kind

616
sub get_message_lparam_kind(@) {
617 618 619 620
    return _get_kind(get_message_lparam_type(@_));
}

########################################################################
621 622
# _parse_file

623
sub _parse_file($$$) {
624 625 626
    my $file = shift;
    my $found_preprocessor = shift;
    my $found_comment = shift;
627 628

    {
629
	open(IN, "< $file") || die "Error: Can't open $file: $!\n";
630 631 632 633 634
	local $/ = undef;
	$_ = <IN>;
	close(IN);
    }

635 636 637
    my @lines = split(/\n/, $_);
    my $max_line = scalar(@lines);

638 639
    my $parser = new c_parser($file);

640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668
    $parser->set_found_preprocessor_callback($found_preprocessor);
    $parser->set_found_comment_callback($found_comment);

    my $found_line = sub {
	my $line = shift;
	local $_ = shift;

	$output->progress("$file: line $line of $max_line");
    };

    $parser->set_found_line_callback($found_line);

    my $line = 1;
    my $column = 0;

    my $old_prefix = $output->prefix;
    $output->progress("$file");
    $output->prefix("$file: ");

    if(!$parser->parse_c_file(\$_, \$line, \$column)) {
	$output->write("can't parse file\n");
    }

    $output->prefix($old_prefix);
}

########################################################################
# _get_tuple_arguments

669
sub _get_tuple_arguments($) {
670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690
    local $_ = shift;

    my $parser = new c_parser;

    my $line = 1;
    my $column = 0;

    my @arguments;
    my @argument_lines;
    my @argument_columns;
    if(!$parser->parse_c_tuple(\$_, \$line, \$column, \@arguments, \@argument_lines, \@argument_columns)) {
	return undef;
    }

    return @arguments;
}

########################################################################
# _parse_windowsx_h


691
sub _parse_windowsx_h($$$) {
692 693
    my $last_comment;

694 695 696 697 698 699 700 701
    my $found_preprocessor = sub {
	my $begin_line = shift;
	my $begin_column = shift;
	local $_ = shift;

	if(!s/^\#\s*define\s*// || !/^FORWARD_WM_/) {
	    return 1;
	}
702

703
	my $name;
704
	if(s/^FORWARD_(\w+)\([^\)]*\)\s*(.*?)\s*$/$2/s) {
705
	    $name = $1;
706 707
	}

708
	if($name eq "WM_SYSTEMERROR") {
709 710 711
	    return 1;
	}

712 713 714
	my $result;
	if(s/^\(\s*(\w+)\s*\)(?:\(\s*\w+\s*\))*\(\s*\w+\s*\)//) {
	    $result = $1;
715
	} else {
716
	    die "$name: '$_'";
717
	}
718 719 720 721 722 723 724 725

	(undef, $_, my $wparam, my $lparam) = _get_tuple_arguments($_);

	my @names = ();
	if(/^$name$/) {
	    @names = $name;
	} elsif(/^\(\w+\)\s*\?\s*(\w+)\s*:\s*(\w+)$/) {
	    @names = ($1, $2);
726
	} else {
727
	    die "$name: '$_'";
728
	}
729 730 731 732 733 734 735 736 737 738 739 740

	local $_ = $last_comment;
	s%^/\*\s*(.*?)\s*\*/$%$1%;

	my %arguments;
	if(s/^(\w+)\s+\w+\s*\(\s*(.*?)\s*\)$/$2/) {
	    my $result2 = $1;
	    if($result2 eq "INT") { $result2 = "int"; }
	    if($result ne $result2) {
		$output->write("message $name: result type mismatch '$result' != '$result2'\n");
	    }
	    foreach (split(/\s*,\s*/)) {
741
		if(/^((?:const\s+|volatile\s+)?\w+(?:\s*\*\s*|\s+)?)(\w+)$/) {
742 743 744 745 746 747 748 749 750
		    my $type = $1;
		    my $name = $2;

		    $type =~ s/^\s*(.*?)\s*$/$1/;

		    $arguments{$name} = $type;
		} else {
		    die "$name: '$_'";
		}
751
	    }
752
	    # $output->write("$1: $_\n");
753
	} else {
754 755
	    die "$name: '$_'";
	}
756

757 758
	my $find_inner_cast = sub {
	    local $_ = shift;
759
	    if(/^(?:\(\s*((?:const\s+|volatile\s+)?\w+(?:\s*\*)?)\s*\))*\(.*?\)$/) {
760 761 762 763 764 765
		if(defined($1)) {
		    return $1;
		} else {
		    return "";
		}
	    }
766

767 768 769 770 771 772 773 774 775 776
	};

	my @entries = (
	    [ \$wparam, "W", "w" ],
	    [ \$lparam, "L", "l" ]
	);
	foreach my $entry (@entries) {
	    (my $refparam, my $upper, my $lower) = @$entry;

	    local $_ = $$refparam;
777
	    if(s/^\(\s*$upper(?:)PARAM\s*\)\s*(?:\(\s*((?:const\s+|volatile\s+)?\w+(?:\s*\*)?)\s*\))*\(\s*(.*?)\s*\)$/$2/) {
778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794
		if(defined($1)) {
		    $$refparam = $1;
		} else {
		    $$refparam = "";
		}

		if(/^\w+$/) {
		    if(exists($arguments{$_})) {
			$$refparam = $arguments{$_};
		    }
		} elsif(/^\(\s*(\w+)\s*\)\s*\?\s*\(\s*(\w+)\s*\)\s*:\s*(?:\(\s*(\w+)\s*\)|0)$/) {
		    foreach ($1, $2, $3) {
			if(exists($arguments{$_})) {
			    $$refparam = $arguments{$_};
			    last;
			}
		    }
795
		} elsif(/^\(\((?:const\s+|volatile\s+)?\w+\s*(?:\*\s*)?\)\s*(?:\(\s*\w+\s*\)|\w+)\s*\)\s*\->\s*\w+$/) {
796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812
		    $$refparam = "UINT";
		} else {
		    die "$name: '$_'";
		}
	    } elsif(s/^(?:\(\s*$upper(?:)PARAM\s*\)\s*)?MAKE$upper(?:)PARAM\s*//) {
                (my $low, my $high) = _get_tuple_arguments($_);

		$low = &$find_inner_cast($low);
		$high = &$find_inner_cast($high);

		$$refparam = "($low,$high)";
	    } elsif(s/^\(.*?$lower(?:)Param.*?\)$//) {
		$$refparam = $upper . "PARAM";
	    } elsif(s/^\(\s*(.*?)\s*\)$//) {
		$$refparam = "$1";
	    } elsif(s/^0L$//) {
		$$refparam = "void";
813
	    } else {
814 815
		die "$name: '$_'";
            }
816
        }
817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834

	# $output->write("$result: '@names', '$wparam', '$lparam'\n");

        foreach my $name (@names) {
	    my $result2 = $$message{$name}{result};
            my $wparam2 = $$message{$name}{wparam};
	    my $lparam2 = $$message{$name}{lparam};

	    if(ref($wparam2)) {
		$wparam2 = "(" . join(",", @$wparam2) . ")";
	    }

	    if(ref($lparam2)) {
		$lparam2 = "(" . join(",", @$lparam2) . ")";
	    }

	    if($result ne $result2) {
		$output->write("message $name: wrong result type '$result2' should be '$result'\n");
835 836
	    }

837 838 839 840 841 842 843 844 845 846 847
	    if($wparam ne $wparam2) {
		# if($wparam ne "WPARAM" && $wparam ne "(,)") {
		    $output->write("message $name: wrong wparam type '$wparam2' should be '$wparam'\n");
		# }
	    }

	    if($lparam ne $lparam2) {
		# if($lparam ne "LPARAM" && $lparam ne "(,)") {
		    $output->write("message $name: wrong lparam type '$lparam2' should be '$lparam'\n");
		# }
	    }
848 849 850 851 852
	}

	return 1;
    };

853 854 855 856
    my $found_comment = sub {
	my $begin_line = shift;
	my $begin_column = shift;
	my $comment = shift;
857

858
	$last_comment = $comment;
859

860 861
	return 1;
    };
862

863 864
    _parse_file("$wine_dir/include/windowsx.h", $found_preprocessor, $found_comment);
}
865

866 867 868 869

########################################################################
# _parse_winuser_h

870
sub _parse_winuser_h($$$) {
871 872 873 874 875 876 877 878 879 880
    my %not_found = ();

    my $found_preprocessor = sub {
	my $begin_line = shift;
	my $begin_column = shift;
	local $_ = shift;

	if(/^\#\s*define\s+(WM_\w+)\s+(0x[0-9a-fA-F]+)\s*$/) {
	    my $name = $1;
	    my $id = lc($2);
881

882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903
	    if(exists($$message{$name})) {
		my $id2 = sprintf("0x%04x", $$message{$name}{id});
		if($id ne $id2) {
		    $output->write("message $name: wrong value ($id2) should be $id\n");
		}
	    } else {
		$output->write("message $name: exists but is not supported\n");
		$not_found{$name} = $id;
	    }
	}

	return 1;
    };

    _parse_file("$wine_dir/include/winuser.h", $found_preprocessor);

    foreach my $name (sort(keys(%not_found))) {
	my $id = $not_found{$name};

	print "    $name => {\n";
	print "\tid => $id, result => \"\", wparam => \"\", lparam => \"\" },\n";
    }
904 905
}

906 907 908 909
# _parse_windowsx_h;
# _parse_winuser_h;

1;