FFI bindings for Win32 RawInput

db4
erikc 2010-01-30 20:40:41 -08:00
parent cfcd983bb4
commit f4865e0f9a
1 changed files with 185 additions and 9 deletions

View File

@ -2,7 +2,7 @@
! See http://factorcode.org/license.txt for BSD license.
USING: alien alien.c-types alien.syntax parser namespaces
kernel math windows.types generalizations math.bitwise
classes.struct literals windows.kernel32 ;
classes.struct literals windows.kernel32 system accessors ;
IN: windows.user32
! HKL for ActivateKeyboardLayout
@ -608,6 +608,181 @@ CONSTANT: MF_HELP HEX: 4000
CONSTANT: MF_RIGHTJUSTIFY HEX: 4000
CONSTANT: MF_MOUSESELECT HEX: 8000
TYPEDEF: HANDLE HRAWINPUT
: GET_RAWINPUT_CODE_WPARAM ( wParam -- n ) HEX: ff bitand ; inline
CONSTANT: RIM_INPUT 0
CONSTANT: RIM_INPUTSINK 1
CONSTANT: RIM_TYPEMOUSE 0
CONSTANT: RIM_TYPEKEYBOARD 1
CONSTANT: RIM_TYPEHID 2
STRUCT: RAWINPUTHEADER
{ dwType DWORD }
{ dwSize DWORD }
{ hDevice HANDLE }
{ wParam WPARAM } ;
TYPEDEF: RAWINPUTHEADER* PRAWINPUTHEADER
TYPEDEF: RAWINPUTHEADER* LPRAWINPUTHEADER
STRUCT: RAWMOUSE_BUTTONS_USBUTTONS
{ usButtonFlags USHORT }
{ usButtonData USHORT } ;
UNION-STRUCT: RAWMOUSE_BUTTONS
{ ulButtons ULONG }
{ usButtons RAWMOUSE_BUTTONS_USBUTTONS } ;
STRUCT: RAWMOUSE
{ usFlags USHORT }
{ uButtons RAWMOUSE_BUTTONS }
{ ulRawButtons ULONG }
{ lLastX LONG }
{ lLastY LONG }
{ ulExtraInformation ULONG } ;
TYPEDEF: RAWMOUSE* PRAWMOUSE
TYPEDEF: RAWMOUSE* LPRAWMOUSE
CONSTANT: RI_MOUSE_LEFT_BUTTON_DOWN HEX: 0001
CONSTANT: RI_MOUSE_LEFT_BUTTON_UP HEX: 0002
CONSTANT: RI_MOUSE_RIGHT_BUTTON_DOWN HEX: 0004
CONSTANT: RI_MOUSE_RIGHT_BUTTON_UP HEX: 0008
CONSTANT: RI_MOUSE_MIDDLE_BUTTON_DOWN HEX: 0010
CONSTANT: RI_MOUSE_MIDDLE_BUTTON_UP HEX: 0020
: RI_MOUSE_BUTTON_1_DOWN ( -- n ) RI_MOUSE_LEFT_BUTTON_DOWN ; inline
: RI_MOUSE_BUTTON_1_UP ( -- n ) RI_MOUSE_LEFT_BUTTON_UP ; inline
: RI_MOUSE_BUTTON_2_DOWN ( -- n ) RI_MOUSE_RIGHT_BUTTON_DOWN ; inline
: RI_MOUSE_BUTTON_2_UP ( -- n ) RI_MOUSE_RIGHT_BUTTON_UP ; inline
: RI_MOUSE_BUTTON_3_DOWN ( -- n ) RI_MOUSE_MIDDLE_BUTTON_DOWN ; inline
: RI_MOUSE_BUTTON_3_UP ( -- n ) RI_MOUSE_MIDDLE_BUTTON_UP ; inline
CONSTANT: RI_MOUSE_BUTTON_4_DOWN HEX: 0040
CONSTANT: RI_MOUSE_BUTTON_4_UP HEX: 0080
CONSTANT: RI_MOUSE_BUTTON_5_DOWN HEX: 0100
CONSTANT: RI_MOUSE_BUTTON_5_UP HEX: 0200
CONSTANT: RI_MOUSE_WHEEL HEX: 0400
CONSTANT: MOUSE_MOVE_RELATIVE 0
CONSTANT: MOUSE_MOVE_ABSOLUTE 1
CONSTANT: MOUSE_VIRTUAL_DESKTOP HEX: 02
CONSTANT: MOUSE_ATTRIBUTES_CHANGED HEX: 04
CONSTANT: MOUSE_MOVE_NOCOALESCE HEX: 08
STRUCT: RAWKEYBOARD
{ MakeCode USHORT }
{ Flags USHORT }
{ Reserved USHORT }
{ VKey USHORT }
{ Message UINT }
{ ExtraInformation ULONG } ;
TYPEDEF: RAWKEYBOARD* PRAWKEYBOARD
TYPEDEF: RAWKEYBOARD* LPRAWKEYBOARD
CONSTANT: KEYBOARD_OVERRUN_MAKE_CODE HEX: FF
CONSTANT: RI_KEY_MAKE 0
CONSTANT: RI_KEY_BREAK 1
CONSTANT: RI_KEY_E0 2
CONSTANT: RI_KEY_E1 4
CONSTANT: RI_KEY_TERMSRV_SET_LED 8
CONSTANT: RI_KEY_TERMSRV_SHADOW HEX: 10
STRUCT: RAWHID
{ dwSizeHid DWORD }
{ dwCount DWORD }
{ bRawData BYTE[1] } ;
TYPEDEF: RAWHID* PRAWHID
TYPEDEF: RAWHID* LPRAWHID
UNION-STRUCT: RAWINPUT_UNION
{ mouse RAWMOUSE }
{ keyboard RAWKEYBOARD }
{ hid RAWHID } ;
STRUCT: RAWINPUT
{ header RAWINPUTHEADER }
{ data RAWINPUT_UNION } ;
TYPEDEF: RAWINPUT* PRAWINPUT
TYPEDEF: RAWINPUT* LPRAWINPUT
: RAWINPUT_ALIGN ( x -- y )
cpu x86.32 = [ 4 ] [ 8 ] if align ; inline
: NEXTRAWINPUTBLOCK ( struct -- next-struct )
dup header>> dwSize>> swap <displaced-alien> RAWINPUT_ALIGN RAWINPUT memory>struct ; inline
CONSTANT: RID_INPUT HEX: 10000003
CONSTANT: RID_HEADER HEX: 10000005
CONSTANT: RIDI_PREPARSEDDATA HEX: 20000005
CONSTANT: RIDI_DEVICENAME HEX: 20000007
CONSTANT: RIDI_DEVICEINFO HEX: 2000000b
STRUCT: RID_DEVICE_INFO_MOUSE
{ dwId DWORD }
{ dwNumberOfButtons DWORD }
{ dwSampleRate DWORD }
{ fHasHorizontalWheel BOOL } ;
TYPEDEF: RID_DEVICE_INFO_MOUSE* PRID_DEVICE_INFO_MOUSE
STRUCT: RID_DEVICE_INFO_KEYBOARD
{ dwType DWORD }
{ dwSubType DWORD }
{ dwKeyboardMode DWORD }
{ dwNumberOfFunctionKeys DWORD }
{ dwNumberOfIndicators DWORD }
{ dwNumberOfKeysTotal DWORD } ;
TYPEDEF: RID_DEVICE_INFO_KEYBOARD* PRID_DEVICE_INFO_KEYBOARD
STRUCT: RID_DEVICE_INFO_HID
{ dwVendorId DWORD }
{ dwProductId DWORD }
{ dwVersionNumber DWORD }
{ usUsagePage USHORT }
{ usUsage USHORT } ;
TYPEDEF: RID_DEVICE_INFO_HID* PRID_DEVICE_INFO_HID
UNION-STRUCT: RID_DEVICE_INFO_UNION
{ mouse RID_DEVICE_INFO_MOUSE }
{ keyboard RID_DEVICE_INFO_KEYBOARD }
{ hid RID_DEVICE_INFO_HID } ;
STRUCT: RID_DEVICE_INFO
{ cbSize DWORD }
{ dwType DWORD }
{ data RID_DEVICE_INFO_UNION } ;
TYPEDEF: RID_DEVICE_INFO* PRID_DEVICE_INFO
TYPEDEF: RID_DEVICE_INFO* LPRID_DEVICE_INFO
STRUCT: RAWINPUTDEVICE
{ usUsagePage USHORT }
{ usUsage USHORT }
{ dwFlags DWORD }
{ hwndTarget HWND } ;
TYPEDEF: RAWINPUTDEVICE* PRAWINPUTDEVICE
TYPEDEF: RAWINPUTDEVICE* LPRAWINPUTDEVICE
TYPEDEF: RAWINPUTDEVICE* PCRAWINPUTDEVICE
CONSTANT: RIDEV_REMOVE HEX: 00000001
CONSTANT: RIDEV_EXCLUDE HEX: 00000010
CONSTANT: RIDEV_PAGEONLY HEX: 00000020
CONSTANT: RIDEV_NOLEGACY HEX: 00000030
CONSTANT: RIDEV_INPUTSINK HEX: 00000100
CONSTANT: RIDEV_CAPTUREMOUSE HEX: 00000200
CONSTANT: RIDEV_NOHOTKEYS HEX: 00000200
CONSTANT: RIDEV_APPKEYS HEX: 00000400
CONSTANT: RIDEV_EXINPUTSINK HEX: 00001000
CONSTANT: RIDEV_DEVNOTIFY HEX: 00002000
CONSTANT: RIDEV_EXMODEMASK HEX: 000000F0
: RIDEV_EXMODE ( mode -- x ) RIDEV_EXMODEMASK bitand ; inline
CONSTANT: GIDC_ARRIVAL 1
CONSTANT: GIDC_REMOVAL 2
: GET_DEVICE_CHANGE_WPARAM ( wParam -- x ) HEX: ffff bitand ; inline
STRUCT: RAWINPUTDEVICELIST
{ hDevice HANDLE }
{ dwType DWORD } ;
TYPEDEF: RAWINPUTDEVICELIST* PRAWINPUTDEVICELIST
LIBRARY: user32
FUNCTION: HKL ActivateKeyboardLayout ( HKL hkl, UINT Flags ) ;
@ -775,7 +950,7 @@ ALIAS: CreateWindowEx CreateWindowExW
! FUNCTION: DefFrameProcW
! FUNCTION: DefMDIChildProcA
! FUNCTION: DefMDIChildProcW
! FUNCTION: DefRawInputProc
FUNCTION: LRESULT DefRawInputProc ( PRAWINPUT* paRawInput, INT nInput, UINT cbSizeHeader ) ;
FUNCTION: LRESULT DefWindowProcW ( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ) ;
ALIAS: DefWindowProc DefWindowProcW
! FUNCTION: DeleteMenu
@ -985,13 +1160,14 @@ FUNCTION: int GetPriorityClipboardFormat ( UINT* paFormatPriorityList, int cForm
! FUNCTION: GetPropA
! FUNCTION: GetPropW
! FUNCTION: GetQueueStatus
! FUNCTION: GetRawInputBuffer
! FUNCTION: GetRawInputData
! FUNCTION: GetRawInputDeviceInfoA
! FUNCTION: GetRawInputDeviceInfoW
! FUNCTION: GetRawInputDeviceList
FUNCTION: UINT GetRawInputBuffer ( PRAWINPUT pData, PUINT pcbSize, UINT cbSizeHeader ) ;
FUNCTION: UINT GetRawInputData ( HRAWINPUT hRawInput, UINT uiCommand, LPVOID pData, PUINT pcbSize, UINT cbSizeHeader ) ;
FUNCTION: UINT GetRawInputDeviceInfoA ( HANDLE hDevice, UINT uiCommand, LPVOID pData, PUINT pcbSize ) ;
FUNCTION: UINT GetRawInputDeviceInfoW ( HANDLE hDevice, UINT uiCommand, LPVOID pData, PUINT pcbSize ) ;
ALIAS: GetRawInputDeviceInfo GetRawInputDeviceInfoW
FUNCTION: UINT GetRawInputDeviceList ( PRAWINPUTDEVICELIST pRawInputDeviceList, PUINT puiNumDevices, UINT cbSize ) ;
FUNCTION: UINT GetRegisteredRawInputDevices ( PRAWINPUTDEVICE pRawInputDevices, PUINT puiNumDevices, UINT cbSize ) ;
! FUNCTION: GetReasonTitleFromReasonCode
! FUNCTION: GetRegisteredRawInputDevices
! FUNCTION: GetScrollBarInfo
! FUNCTION: GetScrollInfo
! FUNCTION: GetScrollPos
@ -1266,7 +1442,7 @@ ALIAS: RegisterDeviceNotification RegisterDeviceNotificationW
! FUNCTION: RegisterHotKey
! FUNCTION: RegisterLogonProcess
! FUNCTION: RegisterMessagePumpHook
! FUNCTION: RegisterRawInputDevices
FUNCTION: BOOL RegisterRawInputDevices ( PCRAWINPUTDEVICE pRawInputDevices, UINT uiNumDevices, UINT cbSize ) ;
! FUNCTION: RegisterServicesProcess
! FUNCTION: RegisterShellHookWindow
! FUNCTION: RegisterSystemThread