| package winapi_module_user; |
| |
| use strict; |
| |
| use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); |
| require Exporter; |
| |
| @ISA = qw(Exporter); |
| @EXPORT = qw(); |
| @EXPORT_OK = qw( |
| &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 |
| ); |
| |
| use config qw($wine_dir); |
| use options qw($options); |
| use output qw($output); |
| |
| use c_parser; |
| |
| ######################################################################## |
| |
| my $message; |
| |
| ######################################################################## |
| # is_user_function |
| |
| sub is_user_function { |
| my $name = shift; |
| if($name =~ /^(?:DefWindowProc|SendMessage)[AW]?$/) { |
| } |
| } |
| |
| ######################################################################## |
| # $message |
| |
| $message = { |
| WM_ACTIVATE => { |
| id => 0, result => "void", wparam => ["", ""], lparam => "HWND" }, |
| WM_ACTIVATEAPP => { |
| id => 0, result => "void", wparam => "BOOL", lparam => "LPARAM" }, |
| |
| WM_BEGINDRAG => { |
| id => 0, result => "", wparam => "", lparam => "" }, |
| |
| WM_CANCELMODE => { |
| id => 0, result => "void", wparam => "void", lparam => "void" }, |
| WM_CHAR => { |
| id => 0, result => "void", wparam => "TCHAR", lparam => ["", ""] }, |
| WM_CHARTOITEM => { |
| id => 0x002f, result => "void", wparam => ["UINT", "int"], lparam => "HWND" }, |
| WM_CLOSE => { |
| id => 0, result => "void", wparam => "void", lparam => "void" }, |
| WM_COMMAND => { |
| id => 0, result => "void", wparam => ["int", "UINT"], lparam => "HWND" }, |
| WM_COPY => { |
| id => 0x0301, result => "void", wparam => "void", lparam => "void" }, |
| WM_COMPACTING => { |
| id => 0, result => "void", wparam => "UINT", lparam => "void" }, |
| WM_COMPAREITEM => { |
| id => 0, result => "int", wparam => "UINT", lparam => "const COMPAREITEMSTRUCT *" }, |
| |
| WM_CREATE => { |
| id => 0, result => "BOOL", wparam => "void", lparam => "LPCREATESTRUCT" }, |
| 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 => { |
| id => 0, result => "void", wparam => "void", lparam => "void" }, |
| |
| WM_DEADCHAR => { |
| id => 0, result => "void", wparam => "TCHAR", lparam => ["", ""] }, |
| WM_DELETEITEM => { |
| id => 0, result => "void", wparam => "UINT", lparam => "const DELETEITEMSTRUCT *" }, |
| WM_DEVMODECHANGE => { |
| id => 0, result => "void", wparam => "void", lparam => "LPCTSTR" }, |
| WM_DESTROY => { |
| id => 0, result => "void", wparam => "void", lparam => "void" }, |
| WM_DRAWITEM => { |
| id => 0, result => "void", wparam => "void", lparam => "const DRAWITEMSTRUCT *" }, |
| WM_DROPFILES => { |
| id => 0, result => "void", wparam => "HDROP", lparam => "void" }, |
| |
| WM_ENABLE => { |
| id => 0, result => "void", wparam => "BOOL", lparam => "void" }, |
| WM_ENDSESSION => { |
| id => 0, result => "void", wparam => "BOOL", lparam => "void" }, |
| WM_ENTERIDLE => { |
| id => 0x0121, result => "void", wparam => "UINT", lparam => "HWND" }, |
| WM_ENTERMENULOOP => { |
| id => 0x0211, result => "", wparam => "", lparam => "" }, |
| WM_ERASEBKGND => { |
| id => 0, result => "BOOL", wparam => "HDC", lparam => "void" }, |
| WM_EXITMENULOOP => { |
| id => 0x0212, result => "", wparam => "", lparam => "" }, |
| |
| WM_FONTCHANGE => { |
| id => 0, result => "void", wparam => "void", lparam => "void" }, |
| |
| WM_GETTEXT => { |
| id => 0, result => "int", wparam => "int", lparam => "LPTSTR" }, |
| WM_GETTEXTLENGTH => { |
| id => 0, result => "int", wparam => "void", lparam => "void" }, |
| |
| WM_HELP => { |
| id => 0x0053, result => "", wparam => "", lparam => "" }, |
| WM_HSCROLL => { |
| id => 0, result => "void", wparam => ["UINT", "int"], lparam => "HWND" }, |
| |
| WM_ICONERASEBKGND => { |
| id => 0, result => "BOOL", wparam => "HDC", lparam => "void" }, |
| WM_INITMENU => { |
| id => 0, result => "void", wparam => "HMENU", lparam => "void" }, |
| WM_INITMENUPOPUP => { |
| id => 0, result => "void", wparam => "HMENU", lparam => ["UINT", "BOOL"] }, |
| WM_ISACTIVEICON => { |
| id => 0, result => "", wparam => "", lparam => "" }, |
| |
| WM_KEYDOWN => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_KEYUP => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_KILLFOCUS => { |
| id => 0, result => "void", wparam => "HWND", lparam => "void" }, |
| |
| WM_LBTRACKPOINT => { |
| id => 0, result => "", wparam => "", lparam => "" }, |
| WM_LBUTTONDBLCLK => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_LBUTTONDOWN => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_LBUTTONUP => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| |
| WM_MBUTTONDBLCLK => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_MBUTTONDOWN => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_MBUTTONUP => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_MEASUREITEM => { |
| id => 0, result => "void", wparam => "UINT", lparam => "MEASUREITEMSTRUCT *" }, |
| WM_MENUSELECT => { |
| id => 0, result => "void", wparam => ["", ""], lparam => "HMENU" }, |
| WM_MENUCHAR => { |
| id => 0, result => "DWORD", wparam => ["", ""], lparam => "HMENU" }, |
| WM_MOUSEACTIVATE => { |
| id => 0, result => "int", wparam => "HWND", lparam => ["", ""] }, |
| WM_MOUSEMOVE => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_MOVE => { |
| id => 0, result => "void", wparam => "void", lparam => ["", ""] }, |
| |
| WM_NCACTIVATE => { |
| id => 0, result => "BOOL", wparam => "BOOL", lparam => "void" }, |
| WM_NCLBUTTONDBLCLK => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_NCLBUTTONDOWN => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_NCLBUTTONUP => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_NCMOUSEMOVE => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_NCMBUTTONDBLCLK => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_NCMBUTTONDOWN => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_NCMBUTTONUP => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_NCRBUTTONDBLCLK => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_NCRBUTTONDOWN => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_NCRBUTTONUP => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_NCCALCSIZE => { |
| id => 0, result => "UINT", wparam => "void", lparam => "LPARAM" }, |
| WM_NCCREATE => { |
| id => 0, result => "BOOL", wparam => "void", lparam => "LPCREATESTRUCT" }, |
| WM_NCDESTROY => { |
| id => 0, result => "void", wparam => "void", lparam => "void" }, |
| WM_NCPAINT => { |
| id => 0, result => "void", wparam => "HRGN", lparam => "void" }, |
| WM_NEXTMENU => { |
| id => 0x0213, result => "", wparam => "", lparam => "" }, |
| WM_NOTIFY => { |
| id => 0x004e, result => "LRESULT", wparam => "int", lparam => "NMHDR *" }, |
| |
| |
| WM_PALETTEISCHANGING => { |
| id => 0, result => "void", wparam => "HWND", lparam => "void" }, |
| WM_PALETTECHANGED => { |
| id => 0, result => "void", wparam => "HWND", lparam => "void" }, |
| WM_PAINT => { |
| id => 0, result => "void", wparam => "void", lparam => "void" }, |
| WM_PASTE => { |
| id => 0x0302, result => "void", wparam => "void", lparam => "void" }, |
| WM_POWER => { |
| id => 0, result => "void", wparam => "int", lparam => "void" }, |
| |
| WM_QUERYDRAGICON => { |
| id => 0, result => "HICON", wparam => "void", lparam => "void" }, |
| WM_QUERYENDSESSION => { |
| id => 0, result => "BOOL", wparam => "void", lparam => "void" }, |
| WM_QUERYNEWPALETTE => { |
| id => 0, result => "BOOL", wparam => "void", lparam => "void" }, |
| WM_QUERYOPEN => { |
| id => 0, result => "BOOL", wparam => "void", lparam => "void" }, |
| WM_QUIT => { |
| id => 0, result => "void", wparam => "WPARAM", lparam => "void" }, |
| |
| WM_RBUTTONDBLCLK => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_RBUTTONDOWN => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_RBUTTONUP => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| |
| WM_SETCURSOR => { |
| id => 0x0020, result => "", wparam => "HWND", lparam => ["UINT", "UINT"] }, |
| WM_SETFOCUS => { |
| id => 0, result => "void", wparam => "HWND", lparam => "void" }, |
| WM_SETFONT => { |
| id => 0x0030, result => "void", wparam => "HFONT", lparam => "BOOL" }, |
| WM_SETREDRAW => { |
| id => 0, result => "void", wparam => "BOOL", lparam => "void" }, |
| WM_SETTEXT => { |
| id => 0, result => "void", wparam => "void", lparam => "LPCTSTR" }, |
| WM_SHOWWINDOW => { |
| id => 0, result => "void", wparam => "BOOL", lparam => "UINT" }, |
| WM_SIZE => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_SPOOLERSTATUS => { |
| id => 0, result => "void", wparam => "WPARAM", lparam => ["", ""] }, |
| WM_SYSCHAR => { |
| id => 0, result => "void", wparam => "TCHAR", lparam => ["", ""] }, |
| WM_SYSCOLORCHANGE => { |
| id => 0, result => "void", wparam => "void", lparam => "void" }, |
| WM_SYSDEADCHAR => { |
| id => 0, result => "void", wparam => "TCHAR", lparam => ["", ""] }, |
| WM_SYSKEYDOWN => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| WM_SYSKEYUP => { |
| id => 0, result => "void", wparam => "UINT", lparam => ["", ""] }, |
| |
| WM_TIMECHANGE => { |
| id => 0, result => "void", wparam => "void", lparam => "void" }, |
| |
| WM_VKEYTOITEM => { |
| id => 0x002e, result => "void", wparam => ["UINT", "int"], lparam => "HWND" }, |
| WM_VSCROLL => { |
| id => 0, result => "void", wparam => ["UINT", "int"], lparam => "HWND" }, |
| |
| WM_WINDOWPOSCHANGING => { |
| id => 0, result => "BOOL", wparam => "void", lparam => "LPWINDOWPOS" }, |
| WM_WINDOWPOSCHANGED => { |
| id => 0, result => "void", wparam => "void", lparam => "LPARAM" }, |
| WM_WININICHANGE => { |
| id => 0, result => "void", wparam => "void", lparam => "LPCTSTR" } |
| }; |
| |
| ######################################################################## |
| # _get_kind |
| |
| sub _get_kind { |
| local $_ = shift; |
| |
| if(!defined($_)) { |
| return undef; |
| } elsif(/^(?:HBRUSH|HDC|HFONT|HMENU|HRGN|HWND)$/ || /\*$/ || |
| /^LP(?!ARAM)/) |
| { |
| return "ptr"; |
| } else { |
| return "long"; |
| } |
| } |
| |
| ######################################################################## |
| # get_message_result_type |
| |
| sub get_message_result_type { |
| my $name = shift; |
| return $$message{$name}{result}; |
| } |
| |
| ######################################################################## |
| # get_message_result_kind |
| |
| sub get_message_result_kind { |
| return _get_kind(get_message_result_type(@_)); |
| } |
| |
| ######################################################################## |
| # get_message_wparam_type |
| |
| sub get_message_wparam_type { |
| my $name = shift; |
| return $$message{$name}{wparam}; |
| } |
| |
| ######################################################################## |
| # get_message_wparam_kind |
| |
| sub get_message_wparam_kind { |
| return _get_kind(get_message_wparam_type(@_)); |
| } |
| |
| ######################################################################## |
| # get_message_lparam_type |
| |
| sub get_message_lparam_type { |
| my $name = shift; |
| return $$message{$name}{lparam}; |
| } |
| |
| ######################################################################## |
| # get_message_lparam_kind |
| |
| sub get_message_lparam_kind { |
| return _get_kind(get_message_lparam_type(@_)); |
| } |
| |
| ######################################################################## |
| # _parse_windowsx_h |
| |
| sub _parse_windowsx_h { |
| my $file = "$wine_dir/include/windowsx.h"; |
| { |
| open(IN, "< $file"); |
| local $/ = undef; |
| $_ = <IN>; |
| close(IN); |
| } |
| |
| my $parser = new c_parser($file); |
| |
| my $found_preprocessor = sub { |
| my $begin_line = shift; |
| my $begin_column = shift; |
| local $_ = shift; |
| |
| if(!s/^\#\s*define\s*// || !/^FORWARD_WM_/) { |
| return 1; |
| } |
| |
| my $msg; |
| if(s/^FORWARD_(\w+)\([^\)]*\)\s*(.*?)\s*$/$2/s) { |
| $msg = $1; |
| } |
| |
| if($msg eq "WM_SYSTEMERROR") { |
| return 1; |
| } |
| |
| my $return_type; |
| if(s/^\(\s*(\w+)\s*\)(?:\(\s*\w+\s*\))*\(\s*\w+\s*\)\(\s*(?:hwnd|\(hwnd\))\s*,\s*(.*?)\s*\)$/$2/) { |
| $return_type = $1; |
| } else { |
| die "$msg: '$_'"; |
| } |
| |
| my @msgs = (); |
| if(s/^$msg\s*,\s*//) { |
| @msgs = $msg; |
| } elsif(s/^\(\w+\)\s*\?\s*(\w+)\s*:\s*(\w+)\s*,\s*//s) { |
| @msgs = ($1, $2); |
| } else { |
| die "$msg: '$_'"; |
| } |
| |
| my $wparam; |
| if(s/^\(WPARAM\)(?:\(\s*(\w+)\s*\))*\((.*?)\)\s*,\s*//) { |
| if(defined($1)) { |
| $wparam = $1; |
| } else { |
| $wparam = "WPARAM"; |
| } |
| } elsif(s/^MAKEWPARAM\(\s*(.*?)\s*,\s*(.*?)\s*\)\s*,\s*//) { |
| $wparam = "(,)"; # "($1, $2)"; |
| } elsif(s/^\((.*?)\)$//) { |
| $wparam = "WPARAM"; |
| } elsif(s/^0L\s*,\s*//) { |
| $wparam = "void"; |
| } else { |
| die "$msg: '$_'"; |
| } |
| |
| my $lparam; |
| if(s/^\(LPARAM\)(?:\(\s*(\w+)\s*\))*\((.*?)\)$//) { |
| if(defined($1)) { |
| $lparam = $1; |
| } else { |
| $lparam = "LPARAM"; |
| } |
| } elsif(s/^MAKELPARAM\(\s*(.*?)\s*,\s*(.*?)\s*\)$//) { |
| $lparam = "(,)"; # "($1, $2)"; |
| } elsif(s/^\((.*?)\)$//) { |
| $lparam = "LPARAM"; |
| } elsif(s/^0L$//) { |
| $lparam = "void"; |
| } else { |
| die "$msg: '$_'"; |
| } |
| |
| foreach my $msg (@msgs) { |
| $output->write("$msg => { result => \"$return_type\", wparam => \"$wparam\", lparam => \"$lparam\" },\n"); |
| } |
| |
| return 1; |
| }; |
| |
| $parser->set_found_preprocessor_callback($found_preprocessor); |
| |
| 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); |
| } |
| |