: DISCL_BACKGROUND HEX: 00000008 ; inline
: DISCL_NOWINKEY HEX: 00000010 ; inline
+: DIK_ESCAPE HEX: 01 ; inline
+: DIK_1 HEX: 02 ; inline
+: DIK_2 HEX: 03 ; inline
+: DIK_3 HEX: 04 ; inline
+: DIK_4 HEX: 05 ; inline
+: DIK_5 HEX: 06 ; inline
+: DIK_6 HEX: 07 ; inline
+: DIK_7 HEX: 08 ; inline
+: DIK_8 HEX: 09 ; inline
+: DIK_9 HEX: 0A ; inline
+: DIK_0 HEX: 0B ; inline
+: DIK_MINUS HEX: 0C ; inline
+: DIK_EQUALS HEX: 0D ; inline
+: DIK_BACK HEX: 0E ; inline
+: DIK_TAB HEX: 0F ; inline
+: DIK_Q HEX: 10 ; inline
+: DIK_W HEX: 11 ; inline
+: DIK_E HEX: 12 ; inline
+: DIK_R HEX: 13 ; inline
+: DIK_T HEX: 14 ; inline
+: DIK_Y HEX: 15 ; inline
+: DIK_U HEX: 16 ; inline
+: DIK_I HEX: 17 ; inline
+: DIK_O HEX: 18 ; inline
+: DIK_P HEX: 19 ; inline
+: DIK_LBRACKET HEX: 1A ; inline
+: DIK_RBRACKET HEX: 1B ; inline
+: DIK_RETURN HEX: 1C ; inline
+: DIK_LCONTROL HEX: 1D ; inline
+: DIK_A HEX: 1E ; inline
+: DIK_S HEX: 1F ; inline
+: DIK_D HEX: 20 ; inline
+: DIK_F HEX: 21 ; inline
+: DIK_G HEX: 22 ; inline
+: DIK_H HEX: 23 ; inline
+: DIK_J HEX: 24 ; inline
+: DIK_K HEX: 25 ; inline
+: DIK_L HEX: 26 ; inline
+: DIK_SEMICOLON HEX: 27 ; inline
+: DIK_APOSTROPHE HEX: 28 ; inline
+: DIK_GRAVE HEX: 29 ; inline
+: DIK_LSHIFT HEX: 2A ; inline
+: DIK_BACKSLASH HEX: 2B ; inline
+: DIK_Z HEX: 2C ; inline
+: DIK_X HEX: 2D ; inline
+: DIK_C HEX: 2E ; inline
+: DIK_V HEX: 2F ; inline
+: DIK_B HEX: 30 ; inline
+: DIK_N HEX: 31 ; inline
+: DIK_M HEX: 32 ; inline
+: DIK_COMMA HEX: 33 ; inline
+: DIK_PERIOD HEX: 34 ; inline
+: DIK_SLASH HEX: 35 ; inline
+: DIK_RSHIFT HEX: 36 ; inline
+: DIK_MULTIPLY HEX: 37 ; inline
+: DIK_LMENU HEX: 38 ; inline
+: DIK_SPACE HEX: 39 ; inline
+: DIK_CAPITAL HEX: 3A ; inline
+: DIK_F1 HEX: 3B ; inline
+: DIK_F2 HEX: 3C ; inline
+: DIK_F3 HEX: 3D ; inline
+: DIK_F4 HEX: 3E ; inline
+: DIK_F5 HEX: 3F ; inline
+: DIK_F6 HEX: 40 ; inline
+: DIK_F7 HEX: 41 ; inline
+: DIK_F8 HEX: 42 ; inline
+: DIK_F9 HEX: 43 ; inline
+: DIK_F10 HEX: 44 ; inline
+: DIK_NUMLOCK HEX: 45 ; inline
+: DIK_SCROLL HEX: 46 ; inline
+: DIK_NUMPAD7 HEX: 47 ; inline
+: DIK_NUMPAD8 HEX: 48 ; inline
+: DIK_NUMPAD9 HEX: 49 ; inline
+: DIK_SUBTRACT HEX: 4A ; inline
+: DIK_NUMPAD4 HEX: 4B ; inline
+: DIK_NUMPAD5 HEX: 4C ; inline
+: DIK_NUMPAD6 HEX: 4D ; inline
+: DIK_ADD HEX: 4E ; inline
+: DIK_NUMPAD1 HEX: 4F ; inline
+: DIK_NUMPAD2 HEX: 50 ; inline
+: DIK_NUMPAD3 HEX: 51 ; inline
+: DIK_NUMPAD0 HEX: 52 ; inline
+: DIK_DECIMAL HEX: 53 ; inline
+: DIK_OEM_102 HEX: 56 ; inline
+: DIK_F11 HEX: 57 ; inline
+: DIK_F12 HEX: 58 ; inline
+: DIK_F13 HEX: 64 ; inline
+: DIK_F14 HEX: 65 ; inline
+: DIK_F15 HEX: 66 ; inline
+: DIK_KANA HEX: 70 ; inline
+: DIK_ABNT_C1 HEX: 73 ; inline
+: DIK_CONVERT HEX: 79 ; inline
+: DIK_NOCONVERT HEX: 7B ; inline
+: DIK_YEN HEX: 7D ; inline
+: DIK_ABNT_C2 HEX: 7E ; inline
+: DIK_NUMPADEQUALS HEX: 8D ; inline
+: DIK_PREVTRACK HEX: 90 ; inline
+: DIK_AT HEX: 91 ; inline
+: DIK_COLON HEX: 92 ; inline
+: DIK_UNDERLINE HEX: 93 ; inline
+: DIK_KANJI HEX: 94 ; inline
+: DIK_STOP HEX: 95 ; inline
+: DIK_AX HEX: 96 ; inline
+: DIK_UNLABELED HEX: 97 ; inline
+: DIK_NEXTTRACK HEX: 99 ; inline
+: DIK_NUMPADENTER HEX: 9C ; inline
+: DIK_RCONTROL HEX: 9D ; inline
+: DIK_MUTE HEX: A0 ; inline
+: DIK_CALCULATOR HEX: A1 ; inline
+: DIK_PLAYPAUSE HEX: A2 ; inline
+: DIK_MEDIASTOP HEX: A4 ; inline
+: DIK_VOLUMEDOWN HEX: AE ; inline
+: DIK_VOLUMEUP HEX: B0 ; inline
+: DIK_WEBHOME HEX: B2 ; inline
+: DIK_NUMPADCOMMA HEX: B3 ; inline
+: DIK_DIVIDE HEX: B5 ; inline
+: DIK_SYSRQ HEX: B7 ; inline
+: DIK_RMENU HEX: B8 ; inline
+: DIK_PAUSE HEX: C5 ; inline
+: DIK_HOME HEX: C7 ; inline
+: DIK_UP HEX: C8 ; inline
+: DIK_PRIOR HEX: C9 ; inline
+: DIK_LEFT HEX: CB ; inline
+: DIK_RIGHT HEX: CD ; inline
+: DIK_END HEX: CF ; inline
+: DIK_DOWN HEX: D0 ; inline
+: DIK_NEXT HEX: D1 ; inline
+: DIK_INSERT HEX: D2 ; inline
+: DIK_DELETE HEX: D3 ; inline
+: DIK_LWIN HEX: DB ; inline
+: DIK_RWIN HEX: DC ; inline
+: DIK_APPS HEX: DD ; inline
+: DIK_POWER HEX: DE ; inline
+: DIK_SLEEP HEX: DF ; inline
+: DIK_WAKE HEX: E3 ; inline
+: DIK_WEBSEARCH HEX: E5 ; inline
+: DIK_WEBFAVORITES HEX: E6 ; inline
+: DIK_WEBREFRESH HEX: E7 ; inline
+: DIK_WEBSTOP HEX: E8 ; inline
+: DIK_WEBFORWARD HEX: E9 ; inline
+: DIK_WEBBACK HEX: EA ; inline
+: DIK_MYCOMPUTER HEX: EB ; inline
+: DIK_MAIL HEX: EC ; inline
+: DIK_MEDIASELECT HEX: ED ; inline
+
+: DIK_BACKSPACE DIK_BACK ; inline
+: DIK_NUMPADSTAR DIK_MULTIPLY ; inline
+: DIK_LALT DIK_LMENU ; inline
+: DIK_CAPSLOCK DIK_CAPITAL ; inline
+: DIK_NUMPADMINUS DIK_SUBTRACT ; inline
+: DIK_NUMPADPLUS DIK_ADD ; inline
+: DIK_NUMPADPERIOD DIK_DECIMAL ; inline
+: DIK_NUMPADSLASH DIK_DIVIDE ; inline
+: DIK_RALT DIK_RMENU ; inline
+: DIK_UPARROW DIK_UP ; inline
+: DIK_PGUP DIK_PRIOR ; inline
+: DIK_LEFTARROW DIK_LEFT ; inline
+: DIK_RIGHTARROW DIK_RIGHT ; inline
+: DIK_DOWNARROW DIK_DOWN ; inline
+: DIK_PGDN DIK_NEXT ; inline
+
+: DIK_CIRCUMFLEX DIK_PREVTRACK ; inline
+
+SYMBOL: +dinput+
+
+: create-dinput ( -- )
+ f GetModuleHandle DIRECTINPUT_VERSION IDirectInput8W-iid
+ f <void*> [ f DirectInput8Create ole32-error ] keep *void*
+ +dinput+ set ;
+
+: delete-dinput ( -- )
+ +dinput+ [ com-release f ] change ;
+
+ : DI8DEVTYPE_DEVICE HEX: 11 ; inline
+ : DI8DEVTYPE_MOUSE HEX: 12 ; inline
+ : DI8DEVTYPE_KEYBOARD HEX: 13 ; inline
+ : DI8DEVTYPE_JOYSTICK HEX: 14 ; inline
+ : DI8DEVTYPE_GAMEPAD HEX: 15 ; inline
+ : DI8DEVTYPE_DRIVING HEX: 16 ; inline
+ : DI8DEVTYPE_FLIGHT HEX: 17 ; inline
+ : DI8DEVTYPE_1STPERSON HEX: 18 ; inline
+ : DI8DEVTYPE_DEVICECTRL HEX: 19 ; inline
+ : DI8DEVTYPE_SCREENPOINTER HEX: 1A ; inline
+ : DI8DEVTYPE_REMOTE HEX: 1B ; inline
+ : DI8DEVTYPE_SUPPLEMENTAL HEX: 1C ; inline
+
+ : GET_DIDEVICE_TYPE ( dwType -- type ) HEX: FF bitand ; inline