require 'windows/api'

module Windows
  module Window
    module Message
      API.auto_namespace = 'Windows::Window::Message'
      API.auto_constant  = true
      API.auto_method    = true
      API.auto_unicode   = false

      private

      # These constants are in winuser.h

      BSF_QUERY              = 0x00000001
      BSF_IGNORECURRENTTASK  = 0x00000002
      BSF_FLUSHDISK          = 0x00000004
      BSF_NOHANG             = 0x00000008
      BSF_POSTMESSAGE        = 0x00000010
      BSF_FORCEIFHUNG        = 0x00000020
      BSF_NOTIMEOUTIFNOTHUNG = 0x00000040
      BSF_ALLOWSFW           = 0x00000080
      BSF_SENDNOTIFYMESSAGE  = 0x00000100
      BSF_RETURNHDESK        = 0x00000200
      BSF_LUID               = 0x00000400

      SMTO_NORMAL             = 0x0000
      SMTO_BLOCK              = 0x0001
      SMTO_ABORTIFHUNG        = 0x0002
      SMTO_NOTIMEOUTIFNOTHUNG = 0x0008

      WM_NULL                       = 0x0000
      WM_CREATE                     = 0x0001
      WM_DESTROY                    = 0x0002
      WM_MOVE                       = 0x0003
      WM_SIZE                       = 0x0005
      WM_ACTIVATE                   = 0x0006
      WM_SETFOCUS                   = 0x0007
      WM_KILLFOCUS                  = 0x0008
      WM_ENABLE                     = 0x000A
      WM_SETREDRAW                  = 0x000B
      WM_SETTEXT                    = 0x000C
      WM_GETTEXT                    = 0x000D
      WM_GETTEXTLENGTH              = 0x000E
      WM_PAINT                      = 0x000F
      WM_CLOSE                      = 0x0010
      WM_QUERYENDSESSION            = 0x0011
      WM_QUERYOPEN                  = 0x0013
      WM_ENDSESSION                 = 0x0016
      WM_QUIT                       = 0x0012
      WM_ERASEBKGND                 = 0x0014
      WM_SYSCOLORCHANGE             = 0x0015
      WM_SHOWWINDOW                 = 0x0018
      WM_WININICHANGE               = 0x001A
      WM_SETTINGCHANGE              = WM_WININICHANGE
      WM_DEVMODECHANGE              = 0x001B
      WM_ACTIVATEAPP                = 0x001C
      WM_FONTCHANGE                 = 0x001D
      WM_TIMECHANGE                 = 0x001E
      WM_CANCELMODE                 = 0x001F
      WM_SETCURSOR                  = 0x0020
      WM_MOUSEACTIVATE              = 0x0021
      WM_CHILDACTIVATE              = 0x0022
      WM_QUEUESYNC                  = 0x0023
      WM_GETMINMAXINFO              = 0x0024
      WM_PAINTICON                  = 0x0026
      WM_ICONERASEBKGND             = 0x0027
      WM_NEXTDLGCTL                 = 0x0028
      WM_SPOOLERSTATUS              = 0x002A
      WM_DRAWITEM                   = 0x002B
      WM_MEASUREITEM                = 0x002C
      WM_DELETEITEM                 = 0x002D
      WM_VKEYTOITEM                 = 0x002E
      WM_CHARTOITEM                 = 0x002F
      WM_SETFONT                    = 0x0030
      WM_GETFONT                    = 0x0031
      WM_SETHOTKEY                  = 0x0032
      WM_GETHOTKEY                  = 0x0033
      WM_QUERYDRAGICON              = 0x0037
      WM_COMPAREITEM                = 0x0039
      WM_GETOBJECT                  = 0x003D
      WM_COMPACTING                 = 0x0041
      WM_COMMNOTIFY                 = 0x0044
      WM_WINDOWPOSCHANGING          = 0x0046
      WM_WINDOWPOSCHANGED           = 0x0047
      WM_POWER                      = 0x0048
      WM_COPYDATA                   = 0x004A
      WM_CANCELJOURNAL              = 0x004B
      WM_NOTIFY                     = 0x004E
      WM_INPUTLANGCHANGEREQUEST     = 0x0050
      WM_INPUTLANGCHANGE            = 0x0051
      WM_TCARD                      = 0x0052
      WM_HELP                       = 0x0053
      WM_USERCHANGED                = 0x0054
      WM_NOTIFYFORMAT               = 0x0055
      WM_CONTEXTMENU                = 0x007B
      WM_STYLECHANGING              = 0x007C
      WM_STYLECHANGED               = 0x007D
      WM_DISPLAYCHANGE              = 0x007E
      WM_GETICON                    = 0x007F
      WM_SETICON                    = 0x0080
      WM_NCCREATE                   = 0x0081
      WM_NCDESTROY                  = 0x0082
      WM_NCCALCSIZE                 = 0x0083
      WM_NCHITTEST                  = 0x0084
      WM_NCPAINT                    = 0x0085
      WM_NCACTIVATE                 = 0x0086
      WM_GETDLGCODE                 = 0x0087
      WM_SYNCPAINT                  = 0x0088
      WM_NCMOUSEMOVE                = 0x00A0
      WM_NCLBUTTONDOWN              = 0x00A1
      WM_NCLBUTTONUP                = 0x00A2
      WM_NCLBUTTONDBLCLK            = 0x00A3
      WM_NCRBUTTONDOWN              = 0x00A4
      WM_NCRBUTTONUP                = 0x00A5
      WM_NCRBUTTONDBLCLK            = 0x00A6
      WM_NCMBUTTONDOWN              = 0x00A7
      WM_NCMBUTTONUP                = 0x00A8
      WM_NCMBUTTONDBLCLK            = 0x00A9
      WM_NCXBUTTONDOWN              = 0x00AB
      WM_NCXBUTTONUP                = 0x00AC
      WM_NCXBUTTONDBLCLK            = 0x00AD
      WM_INPUT                      = 0x00FF
      WM_KEYFIRST                   = 0x0100
      WM_KEYDOWN                    = 0x0100
      WM_KEYUP                      = 0x0101
      WM_CHAR                       = 0x0102
      WM_DEADCHAR                   = 0x0103
      WM_SYSKEYDOWN                 = 0x0104
      WM_SYSKEYUP                   = 0x0105
      WM_SYSCHAR                    = 0x0106
      WM_SYSDEADCHAR                = 0x0107
      WM_UNICHAR                    = 0x0109
      WM_IME_STARTCOMPOSITION       = 0x010D
      WM_IME_ENDCOMPOSITION         = 0x010E
      WM_IME_COMPOSITION            = 0x010F
      WM_IME_KEYLAST                = 0x010F
      WM_INITDIALOG                 = 0x0110
      WM_COMMAND                    = 0x0111
      WM_SYSCOMMAND                 = 0x0112
      WM_TIMER                      = 0x0113
      WM_HSCROLL                    = 0x0114
      WM_VSCROLL                    = 0x0115
      WM_INITMENU                   = 0x0116
      WM_INITMENUPOPUP              = 0x0117
      WM_MENUSELECT                 = 0x011F
      WM_MENUCHAR                   = 0x0120
      WM_ENTERIDLE                  = 0x0121
      WM_MENURBUTTONUP              = 0x0122
      WM_MENUDRAG                   = 0x0123
      WM_MENUGETOBJECT              = 0x0124
      WM_UNINITMENUPOPUP            = 0x0125
      WM_MENUCOMMAND                = 0x0126
      WM_CHANGEUISTATE              = 0x0127
      WM_UPDATEUISTATE              = 0x0128
      WM_QUERYUISTATE               = 0x0129
      WM_CTLCOLORMSGBOX             = 0x0132
      WM_CTLCOLOREDIT               = 0x0133
      WM_CTLCOLORLISTBOX            = 0x0134
      WM_CTLCOLORBTN                = 0x0135
      WM_CTLCOLORDLG                = 0x0136
      WM_CTLCOLORSCROLLBAR          = 0x0137
      WM_CTLCOLORSTATIC             = 0x0138
      WM_MOUSEFIRST                 = 0x0200
      WM_MOUSEMOVE                  = 0x0200
      WM_LBUTTONDOWN                = 0x0201
      WM_LBUTTONUP                  = 0x0202
      WM_LBUTTONDBLCLK              = 0x0203
      WM_RBUTTONDOWN                = 0x0204
      WM_RBUTTONUP                  = 0x0205
      WM_RBUTTONDBLCLK              = 0x0206
      WM_MBUTTONDOWN                = 0x0207
      WM_MBUTTONUP                  = 0x0208
      WM_MBUTTONDBLCLK              = 0x0209
      WM_MOUSEWHEEL                 = 0x020A
      WM_XBUTTONDOWN                = 0x020B
      WM_XBUTTONUP                  = 0x020C
      WM_XBUTTONDBLCLK              = 0x020D
      WM_MOUSELAST                  = 0x020D # Assume Win2k or later
      WM_PARENTNOTIFY               = 0x0210
      WM_ENTERMENULOOP              = 0x0211
      WM_EXITMENULOOP               = 0x0212
      WM_NEXTMENU                   = 0x0213
      WM_SIZING                     = 0x0214
      WM_CAPTURECHANGED             = 0x0215
      WM_MOVING                     = 0x0216
      WM_POWERBROADCAST             = 0x0218
      WM_DEVICECHANGE               = 0x0219
      WM_MDICREATE                  = 0x0220
      WM_MDIDESTROY                 = 0x0221
      WM_MDIACTIVATE                = 0x0222
      WM_MDIRESTORE                 = 0x0223
      WM_MDINEXT                    = 0x0224
      WM_MDIMAXIMIZE                = 0x0225
      WM_MDITILE                    = 0x0226
      WM_MDICASCADE                 = 0x0227
      WM_MDIICONARRANGE             = 0x0228
      WM_MDIGETACTIVE               = 0x0229
      WM_MDISETMENU                 = 0x0230
      WM_ENTERSIZEMOVE              = 0x0231
      WM_EXITSIZEMOVE               = 0x0232
      WM_DROPFILES                  = 0x0233
      WM_MDIREFRESHMENU             = 0x0234
      WM_IME_SETCONTEXT             = 0x0281
      WM_IME_NOTIFY                 = 0x0282
      WM_IME_CONTROL                = 0x0283
      WM_IME_COMPOSITIONFULL        = 0x0284
      WM_IME_SELECT                 = 0x0285
      WM_IME_CHAR                   = 0x0286
      WM_IME_REQUEST                = 0x0288
      WM_IME_KEYDOWN                = 0x0290
      WM_IME_KEYUP                  = 0x0291
      WM_MOUSEHOVER                 = 0x02A1
      WM_MOUSELEAVE                 = 0x02A3
      WM_NCMOUSEHOVER               = 0x02A0
      WM_NCMOUSELEAVE               = 0x02A2
      WM_WTSSESSION_CHANGE          = 0x02B1
      WM_TABLET_FIRST               = 0x02c0
      WM_TABLET_LAST                = 0x02df
      WM_CUT                        = 0x0300
      WM_COPY                       = 0x0301
      WM_PASTE                      = 0x0302
      WM_CLEAR                      = 0x0303
      WM_UNDO                       = 0x0304
      WM_RENDERFORMAT               = 0x0305
      WM_RENDERALLFORMATS           = 0x0306
      WM_DESTROYCLIPBOARD           = 0x0307
      WM_DRAWCLIPBOARD              = 0x0308
      WM_PAINTCLIPBOARD             = 0x0309
      WM_VSCROLLCLIPBOARD           = 0x030A
      WM_SIZECLIPBOARD              = 0x030B
      WM_ASKCBFORMATNAME            = 0x030C
      WM_CHANGECBCHAIN              = 0x030D
      WM_HSCROLLCLIPBOARD           = 0x030E
      WM_QUERYNEWPALETTE            = 0x030F
      WM_PALETTEISCHANGING          = 0x0310
      WM_PALETTECHANGED             = 0x0311
      WM_HOTKEY                     = 0x0312
      WM_PRINT                      = 0x0317
      WM_PRINTCLIENT                = 0x0318
      WM_APPCOMMAND                 = 0x0319
      WM_THEMECHANGED               = 0x031A
      WM_HANDHELDFIRST              = 0x0358
      WM_HANDHELDLAST               = 0x035F
      WM_AFXFIRST                   = 0x0360
      WM_AFXLAST                    = 0x037F
      WM_PENWINFIRST                = 0x0380
      WM_PENWINLAST                 = 0x038F
      WM_APP                        = 0x8000
      WM_USER                       = 0x0400

      # I'd rather not mixin Windows::SystemInfo
      getVersionEx = Win32::API.new('GetVersionEx', 'P', 'B')
      vbuf  = "\0" * 128
      vinfo = [148, 0 ,0, 0, 0, vbuf].pack("LLLLLa128")
      getVersionEx.call(vinfo)
      info = vinfo.unpack("LLLLLa128")

      if info[2] >= 1
        WM_KEYLAST = 0x0109 # Windows XP or later
      else
        WM_KEYLAST = 0x0108 # Windows 2000
      end

      API.new('BroadcastSystemMessage', 'LPILL', 'L', 'user32')
      API.new('DefWindowProc', 'LLLL', 'L', 'user32')
      API.new('DispatchMessage', 'P', 'L', 'user32')
      API.new('GetInputState', 'V', 'B', 'user32')
      API.new('GetMessage', 'PLII', 'B', 'user32')
      API.new('GetMessageExtraInfo', 'V', 'L', 'user32')
      API.new('GetMessagePos', 'V', 'L', 'user32')
      API.new('GetMessageTime', 'V', 'L', 'user32')
      API.new('GetQueueStatus', 'I', 'L', 'user32')
      API.new('InSendMessage', 'V', 'B', 'user32')
      API.new('InSendMessageEx', 'L', 'L', 'user32')
      API.new('PeekMessage', 'PLIII', 'B', 'user32')
      API.new('PostMessage', 'PLLL', 'B', 'user32')
      API.new('PostQuitMessage', 'I', 'V', 'user32')
      API.new('PostThreadMessage', 'LILL', 'B', 'user32')
      API.new('RegisterWindowMessage', 'P', 'I', 'user32')
      API.new('ReplyMessage', 'L', 'B', 'user32')
      API.new('SendMessage', 'LILL', 'L', 'user32')
      API.new('SendMessageCallback', 'LILLKP', 'B', 'user32')
      API.new('SendMessageTimeout', 'LILLIIP', 'L', 'user32')
      API.new('SendNotifyMessage', 'LILLIIP', 'L', 'user32')
      API.new('SetMessageExtraInfo', 'L', 'L', 'user32')
      API.new('TranslateMessage', 'P', 'B', 'user32')
      API.new('WaitMessage', 'V', 'B', 'user32')
       
      begin
        API.new('BroadcastSystemMessageEx', 'LPILLP', 'L', 'user32')
      rescue Win32::API::LoadLibraryError
        # Windows XP or later
      end
    end
  end
end
