winapi_module_user.pm 31 KB

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