-Fixed MESSAGE functions that were thunking down to 16 bits implementation.
[wine] / include / dinput.h
1 #ifndef _WINE_DINPUT_H
2 #define _WINE_DINPUT_H
3
4 #include "unknwn.h"
5 #include "mouse.h"
6
7 #define STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn)
8 #define STDMETHOD_(ret,xfn) ret (CALLBACK *fn##xfn)
9 #define PURE
10 #define FAR
11 #define THIS_ THIS,
12
13 #define DIRECTINPUT_VERSION     0x0500
14
15 /* Classes */
16 DEFINE_GUID(CLSID_DirectInput,          0x25E609E0,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
17 DEFINE_GUID(CLSID_DirectInputDevice,    0x25E609E1,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
18
19 /* Interfaces */
20 DEFINE_GUID(IID_IDirectInputA,          0x89521360,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
21 DEFINE_GUID(IID_IDirectInputW,          0x89521361,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
22 DEFINE_GUID(IID_IDirectInput2A,         0x5944E662,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
23 DEFINE_GUID(IID_IDirectInput2W,         0x5944E663,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
24 DEFINE_GUID(IID_IDirectInputDeviceA,    0x5944E680,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
25 DEFINE_GUID(IID_IDirectInputDeviceW,    0x5944E681,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
26 DEFINE_GUID(IID_IDirectInputDevice2A,   0x5944E682,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
27 DEFINE_GUID(IID_IDirectInputDevice2W,   0x5944E683,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
28 DEFINE_GUID(IID_IDirectInputEffect,     0xE7E1F7C0,0x88D2,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
29
30 /* Predefined object types */
31 DEFINE_GUID(GUID_XAxis, 0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
32 DEFINE_GUID(GUID_YAxis, 0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
33 DEFINE_GUID(GUID_ZAxis, 0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
34 DEFINE_GUID(GUID_RxAxis,0xA36D02F4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
35 DEFINE_GUID(GUID_RyAxis,0xA36D02F5,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
36 DEFINE_GUID(GUID_RzAxis,0xA36D02E3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
37 DEFINE_GUID(GUID_Slider,0xA36D02E4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
38 DEFINE_GUID(GUID_Button,0xA36D02F0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
39 DEFINE_GUID(GUID_Key,   0x55728220,0xD33C,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
40 DEFINE_GUID(GUID_POV,   0xA36D02F2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
41 DEFINE_GUID(GUID_Unknown,0xA36D02F3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
42
43 /* Predefined product GUIDs */
44 DEFINE_GUID(GUID_SysMouse,      0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
45 DEFINE_GUID(GUID_SysKeyboard,   0x6F1D2B61,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
46 DEFINE_GUID(GUID_Joystick,      0x6F1D2B70,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
47
48 /* predefined forcefeedback effects */
49 DEFINE_GUID(GUID_ConstantForce, 0x13541C20,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
50 DEFINE_GUID(GUID_RampForce,     0x13541C21,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
51 DEFINE_GUID(GUID_Square,        0x13541C22,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
52 DEFINE_GUID(GUID_Sine,          0x13541C23,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
53 DEFINE_GUID(GUID_Triangle,      0x13541C24,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
54 DEFINE_GUID(GUID_SawtoothUp,    0x13541C25,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
55 DEFINE_GUID(GUID_SawtoothDown,  0x13541C26,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
56 DEFINE_GUID(GUID_Spring,        0x13541C27,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
57 DEFINE_GUID(GUID_Damper,        0x13541C28,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
58 DEFINE_GUID(GUID_Inertia,       0x13541C29,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
59 DEFINE_GUID(GUID_Friction,      0x13541C2A,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
60 DEFINE_GUID(GUID_CustomForce,   0x13541C2B,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
61
62 typedef struct IDirectInput32A IDirectInput32A,*LPDIRECTINPUT32A;
63 typedef struct IDirectInputDevice32A IDirectInputDevice32A,*LPDIRECTINPUTDEVICE32A;
64 typedef struct IDirectInputEffect IDirectInputEffect,*LPDIRECTINPUTEFFECT;
65 typedef struct SysKeyboard32A SysKeyboard32A,*LPSYSKEYBOARD32A;
66 typedef struct SysMouse32A SysMouse32A,*LPSYSMOUSE32A;
67
68 #define DI_OK                           S_OK
69 #define DI_NOTATTACHED                  S_FALSE
70 #define DI_BUFFEROVERFLOW               S_FALSE
71 #define DI_PROPNOEFFECT                 S_FALSE
72 #define DI_NOEFFECT                     S_FALSE
73 #define DI_POLLEDDEVICE                 ((HRESULT)0x00000002L)
74 #define DI_DOWNLOADSKIPPED              ((HRESULT)0x00000003L)
75 #define DI_EFFECTRESTARTED              ((HRESULT)0x00000004L)
76 #define DI_TRUNCATED                    ((HRESULT)0x00000008L)
77 #define DI_TRUNCATEDANDRESTARTED        ((HRESULT)0x0000000CL)
78
79 #define DIERR_OLDDIRECTINPUTVERSION     \
80     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_OLD_WIN_VERSION)
81 #define DIERR_BETADIRECTINPUTVERSION    \
82     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_RMODE_APP)
83 #define DIERR_BADDRIVERVER              \
84     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BAD_DRIVER_LEVEL)
85 #define DIERR_DEVICENOTREG              REGDB_E_CLASSNOTREG
86 #define DIERR_NOTFOUND                  \
87     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND)
88 #define DIERR_OBJECTNOTFOUND            \
89     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND)
90 #define DIERR_INVALIDPARAM              E_INVALIDARG
91 #define DIERR_NOINTERFACE               E_NOINTERFACE
92 #define DIERR_GENERIC                   E_FAIL
93 #define DIERR_OUTOFMEMORY               E_OUTOFMEMORY
94 #define DIERR_UNSUPPORTED               E_NOTIMPL
95 #define DIERR_NOTINITIALIZED            \
96     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_READY)
97 #define DIERR_ALREADYINITIALIZED        \
98     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_ALREADY_INITIALIZED)
99 #define DIERR_NOAGGREGATION             CLASS_E_NOAGGREGATION
100 #define DIERR_OTHERAPPHASPRIO           E_ACCESSDENIED
101 #define DIERR_INPUTLOST                 \
102     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_READ_FAULT)
103 #define DIERR_ACQUIRED                  \
104     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BUSY)
105 #define DIERR_NOTACQUIRED               \
106     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_INVALID_ACCESS)
107 #define DIERR_READONLY                  E_ACCESSDENIED
108 #define DIERR_HANDLEEXISTS              E_ACCESSDENIED
109 #ifndef E_PENDING
110 #define E_PENDING                       0x8000000AL
111 #endif
112 #define DIERR_INSUFFICIENTPRIVS         0x80040200L
113 #define DIERR_DEVICEFULL                0x80040201L
114 #define DIERR_MOREDATA                  0x80040202L
115 #define DIERR_NOTDOWNLOADED             0x80040203L
116 #define DIERR_HASEFFECTS                0x80040204L
117 #define DIERR_NOTEXCLUSIVEACQUIRED      0x80040205L
118 #define DIERR_INCOMPLETEEFFECT          0x80040206L
119 #define DIERR_NOTBUFFERED               0x80040207L
120 #define DIERR_EFFECTPLAYING             0x80040208L
121 #define DIERR_UNPLUGGED                 0x80040209L
122 #define DIERR_REPORTFULL                0x8004020AL
123
124 #define DIENUM_STOP                     0
125 #define DIENUM_CONTINUE                 1
126
127 #define DIDEVTYPE_DEVICE                1
128 #define DIDEVTYPE_MOUSE                 2
129 #define DIDEVTYPE_KEYBOARD              3
130 #define DIDEVTYPE_JOYSTICK              4
131 #define DIDEVTYPE_HID                   0x00010000
132
133 #define DIDEVTYPEMOUSE_UNKNOWN          1
134 #define DIDEVTYPEMOUSE_TRADITIONAL      2
135 #define DIDEVTYPEMOUSE_FINGERSTICK      3
136 #define DIDEVTYPEMOUSE_TOUCHPAD         4
137 #define DIDEVTYPEMOUSE_TRACKBALL        5
138
139 #define DIDEVTYPEKEYBOARD_UNKNOWN       0
140 #define DIDEVTYPEKEYBOARD_PCXT          1
141 #define DIDEVTYPEKEYBOARD_OLIVETTI      2
142 #define DIDEVTYPEKEYBOARD_PCAT          3
143 #define DIDEVTYPEKEYBOARD_PCENH         4
144 #define DIDEVTYPEKEYBOARD_NOKIA1050     5
145 #define DIDEVTYPEKEYBOARD_NOKIA9140     6
146 #define DIDEVTYPEKEYBOARD_NEC98         7
147 #define DIDEVTYPEKEYBOARD_NEC98LAPTOP   8
148 #define DIDEVTYPEKEYBOARD_NEC98106      9
149 #define DIDEVTYPEKEYBOARD_JAPAN106     10
150 #define DIDEVTYPEKEYBOARD_JAPANAX      11
151 #define DIDEVTYPEKEYBOARD_J3100        12
152
153 #define DIDEVTYPEJOYSTICK_UNKNOWN       1
154 #define DIDEVTYPEJOYSTICK_TRADITIONAL   2
155 #define DIDEVTYPEJOYSTICK_FLIGHTSTICK   3
156 #define DIDEVTYPEJOYSTICK_GAMEPAD       4
157 #define DIDEVTYPEJOYSTICK_RUDDER        5
158 #define DIDEVTYPEJOYSTICK_WHEEL         6
159 #define DIDEVTYPEJOYSTICK_HEADTRACKER   7
160
161 typedef struct {
162     DWORD       dwSize;
163     GUID        guidType;
164     DWORD       dwOfs;
165     DWORD       dwType;
166     DWORD       dwFlags;
167     CHAR        tszName[MAX_PATH];
168 #if(DIRECTINPUT_VERSION >= 0x0500)
169     DWORD       dwFFMaxForce;
170     DWORD       dwFFForceResolution;
171     WORD        wCollectionNumber;
172     WORD        wDesignatorIndex;
173     WORD        wUsagePage;
174     WORD        wUsage;
175     DWORD       dwDimension;
176     WORD        wExponent;
177     WORD        wReserved;
178 #endif /* DIRECTINPUT_VERSION >= 0x0500 */
179 } DIDEVICEOBJECTINSTANCE32A, *LPDIDEVICEOBJECTINSTANCE32A,*LPCDIDEVICEOBJECTINSTANCE32A;
180
181 typedef struct {
182     DWORD       dwSize;
183     GUID        guidType;
184     DWORD       dwOfs;
185     DWORD       dwType;
186     DWORD       dwFlags;
187     WCHAR       tszName[MAX_PATH];
188 #if(DIRECTINPUT_VERSION >= 0x0500)
189     DWORD       dwFFMaxForce;
190     DWORD       dwFFForceResolution;
191     WORD        wCollectionNumber;
192     WORD        wDesignatorIndex;
193     WORD        wUsagePage;
194     WORD        wUsage;
195     DWORD       dwDimension;
196     WORD        wExponent;
197     WORD        wReserved;
198 #endif /* DIRECTINPUT_VERSION >= 0x0500 */
199 } DIDEVICEOBJECTINSTANCE32W, *LPDIDEVICEOBJECTINSTANCE32W,*LPCDIDEVICEOBJECTINSTANCE32W;
200 DECL_WINELIB_TYPE_AW(LPDIDEVICEOBJECTINSTANCE)
201 DECL_WINELIB_TYPE_AW(DIDEVICEOBJECTINSTANCE)
202
203
204 typedef struct {
205     DWORD       dwSize;
206     GUID        guidInstance;
207     GUID        guidProduct;
208     DWORD       dwDevType;
209     CHAR        tszInstanceName[MAX_PATH];
210     CHAR        tszProductName[MAX_PATH];
211 #if(DIRECTINPUT_VERSION >= 0x0500)
212     GUID        guidFFDriver;
213     WORD        wUsagePage;
214     WORD        wUsage;
215 #endif /* DIRECTINPUT_VERSION >= 0x0500 */
216 } DIDEVICEINSTANCE32A, *LPDIDEVICEINSTANCE32A, *LPCDIDEVICEINSTANCE32A;
217
218 typedef struct {
219     DWORD       dwSize;
220     GUID        guidInstance;
221     GUID        guidProduct;
222     DWORD       dwDevType;
223     WCHAR       tszInstanceName[MAX_PATH];
224     WCHAR       tszProductName[MAX_PATH];
225 #if(DIRECTINPUT_VERSION >= 0x0500)
226     GUID        guidFFDriver;
227     WORD        wUsagePage;
228     WORD        wUsage;
229 #endif /* DIRECTINPUT_VERSION >= 0x0500 */
230 } DIDEVICEINSTANCE32W, *LPDIDEVICEINSTANCE32W, *LPCDIDEVICEINSTANCE32W;
231 DECL_WINELIB_TYPE_AW(DIDEVICEINSTANCE)
232 DECL_WINELIB_TYPE_AW(LPDIDEVICEINSTANCE)
233 DECL_WINELIB_TYPE_AW(LPCDIDEVICEINSTANCE)
234
235 typedef BOOL32 (CALLBACK * LPDIENUMDEVICESCALLBACK32A)(LPCDIDEVICEINSTANCE32A,LPVOID);
236 typedef BOOL32 (CALLBACK * LPDIENUMDEVICESCALLBACK32W)(LPCDIDEVICEINSTANCE32W,LPVOID);
237 DECL_WINELIB_TYPE_AW(LPDIENUMDEVICESCALLBACK)
238
239 typedef BOOL32 (CALLBACK * LPDIENUMDEVICEOBJECTSCALLBACK32A)(LPCDIDEVICEOBJECTINSTANCE32A, LPVOID);
240 typedef BOOL32 (CALLBACK * LPDIENUMDEVICEOBJECTSCALLBACK32W)(LPCDIDEVICEOBJECTINSTANCE32W,LPVOID);
241 DECL_WINELIB_TYPE_AW(LPDIENUMDEVICEOBJECTSCALLBACK)
242
243 typedef BOOL32 (CALLBACK * LPDIENUMCREATEDEFFECTOBJECTSCALLBACK)(LPDIRECTINPUTEFFECT, LPVOID);
244
245 #define DIK_ESCAPE          0x01
246 #define DIK_1               0x02
247 #define DIK_2               0x03
248 #define DIK_3               0x04
249 #define DIK_4               0x05
250 #define DIK_5               0x06
251 #define DIK_6               0x07
252 #define DIK_7               0x08
253 #define DIK_8               0x09
254 #define DIK_9               0x0A
255 #define DIK_0               0x0B
256 #define DIK_MINUS           0x0C    /* - on main keyboard */
257 #define DIK_EQUALS          0x0D
258 #define DIK_BACK            0x0E    /* backspace */
259 #define DIK_TAB             0x0F
260 #define DIK_Q               0x10
261 #define DIK_W               0x11
262 #define DIK_E               0x12
263 #define DIK_R               0x13
264 #define DIK_T               0x14
265 #define DIK_Y               0x15
266 #define DIK_U               0x16
267 #define DIK_I               0x17
268 #define DIK_O               0x18
269 #define DIK_P               0x19
270 #define DIK_LBRACKET        0x1A
271 #define DIK_RBRACKET        0x1B
272 #define DIK_RETURN          0x1C    /* Enter on main keyboard */
273 #define DIK_LCONTROL        0x1D
274 #define DIK_A               0x1E
275 #define DIK_S               0x1F
276 #define DIK_D               0x20
277 #define DIK_F               0x21
278 #define DIK_G               0x22
279 #define DIK_H               0x23
280 #define DIK_J               0x24
281 #define DIK_K               0x25
282 #define DIK_L               0x26
283 #define DIK_SEMICOLON       0x27
284 #define DIK_APOSTROPHE      0x28
285 #define DIK_GRAVE           0x29    /* accent grave */
286 #define DIK_LSHIFT          0x2A
287 #define DIK_BACKSLASH       0x2B
288 #define DIK_Z               0x2C
289 #define DIK_X               0x2D
290 #define DIK_C               0x2E
291 #define DIK_V               0x2F
292 #define DIK_B               0x30
293 #define DIK_N               0x31
294 #define DIK_M               0x32
295 #define DIK_COMMA           0x33
296 #define DIK_PERIOD          0x34    /* . on main keyboard */
297 #define DIK_SLASH           0x35    /* / on main keyboard */
298 #define DIK_RSHIFT          0x36
299 #define DIK_MULTIPLY        0x37    /* * on numeric keypad */
300 #define DIK_LMENU           0x38    /* left Alt */
301 #define DIK_SPACE           0x39
302 #define DIK_CAPITAL         0x3A
303 #define DIK_F1              0x3B
304 #define DIK_F2              0x3C
305 #define DIK_F3              0x3D
306 #define DIK_F4              0x3E
307 #define DIK_F5              0x3F
308 #define DIK_F6              0x40
309 #define DIK_F7              0x41
310 #define DIK_F8              0x42
311 #define DIK_F9              0x43
312 #define DIK_F10             0x44
313 #define DIK_NUMLOCK         0x45
314 #define DIK_SCROLL          0x46    /* Scroll Lock */
315 #define DIK_NUMPAD7         0x47
316 #define DIK_NUMPAD8         0x48
317 #define DIK_NUMPAD9         0x49
318 #define DIK_SUBTRACT        0x4A    /* - on numeric keypad */
319 #define DIK_NUMPAD4         0x4B
320 #define DIK_NUMPAD5         0x4C
321 #define DIK_NUMPAD6         0x4D
322 #define DIK_ADD             0x4E    /* + on numeric keypad */
323 #define DIK_NUMPAD1         0x4F
324 #define DIK_NUMPAD2         0x50
325 #define DIK_NUMPAD3         0x51
326 #define DIK_NUMPAD0         0x52
327 #define DIK_DECIMAL         0x53    /* . on numeric keypad */
328 #define DIK_F11             0x57
329 #define DIK_F12             0x58
330 #define DIK_F13             0x64    /*                     (NEC PC98) */
331 #define DIK_F14             0x65    /*                     (NEC PC98) */
332 #define DIK_F15             0x66    /*                     (NEC PC98) */
333 #define DIK_KANA            0x70    /* (Japanese keyboard)            */
334 #define DIK_CONVERT         0x79    /* (Japanese keyboard)            */
335 #define DIK_NOCONVERT       0x7B    /* (Japanese keyboard)            */
336 #define DIK_YEN             0x7D    /* (Japanese keyboard)            */
337 #define DIK_NUMPADEQUALS    0x8D    /* = on numeric keypad (NEC PC98) */
338 #define DIK_CIRCUMFLEX      0x90    /* (Japanese keyboard)            */
339 #define DIK_AT              0x91    /*                     (NEC PC98) */
340 #define DIK_COLON           0x92    /*                     (NEC PC98) */
341 #define DIK_UNDERLINE       0x93    /*                     (NEC PC98) */
342 #define DIK_KANJI           0x94    /* (Japanese keyboard)            */
343 #define DIK_STOP            0x95    /*                     (NEC PC98) */
344 #define DIK_AX              0x96    /*                     (Japan AX) */
345 #define DIK_UNLABELED       0x97    /*                        (J3100) */
346 #define DIK_NUMPADENTER     0x9C    /* Enter on numeric keypad */
347 #define DIK_RCONTROL        0x9D
348 #define DIK_NUMPADCOMMA     0xB3    /* , on numeric keypad (NEC PC98) */
349 #define DIK_DIVIDE          0xB5    /* / on numeric keypad */
350 #define DIK_SYSRQ           0xB7
351 #define DIK_RMENU           0xB8    /* right Alt */
352 #define DIK_PAUSE           0xC5    /* Pause */
353 #define DIK_HOME            0xC7    /* Home on arrow keypad */
354 #define DIK_UP              0xC8    /* UpArrow on arrow keypad */
355 #define DIK_PRIOR           0xC9    /* PgUp on arrow keypad */
356 #define DIK_LEFT            0xCB    /* LeftArrow on arrow keypad */
357 #define DIK_RIGHT           0xCD    /* RightArrow on arrow keypad */
358 #define DIK_END             0xCF    /* End on arrow keypad */
359 #define DIK_DOWN            0xD0    /* DownArrow on arrow keypad */
360 #define DIK_NEXT            0xD1    /* PgDn on arrow keypad */
361 #define DIK_INSERT          0xD2    /* Insert on arrow keypad */
362 #define DIK_DELETE          0xD3    /* Delete on arrow keypad */
363 #define DIK_LWIN            0xDB    /* Left Windows key */
364 #define DIK_RWIN            0xDC    /* Right Windows key */
365 #define DIK_APPS            0xDD    /* AppMenu key */
366 #define DIK_POWER           0xDE
367 #define DIK_SLEEP           0xDF
368 #define DIK_BACKSPACE       DIK_BACK            /* backspace */
369 #define DIK_NUMPADSTAR      DIK_MULTIPLY        /* * on numeric keypad */
370 #define DIK_LALT            DIK_LMENU           /* left Alt */
371 #define DIK_CAPSLOCK        DIK_CAPITAL         /* CapsLock */
372 #define DIK_NUMPADMINUS     DIK_SUBTRACT        /* - on numeric keypad */
373 #define DIK_NUMPADPLUS      DIK_ADD             /* + on numeric keypad */
374 #define DIK_NUMPADPERIOD    DIK_DECIMAL         /* . on numeric keypad */
375 #define DIK_NUMPADSLASH     DIK_DIVIDE          /* / on numeric keypad */
376 #define DIK_RALT            DIK_RMENU           /* right Alt */
377 #define DIK_UPARROW         DIK_UP              /* UpArrow on arrow keypad */
378 #define DIK_PGUP            DIK_PRIOR           /* PgUp on arrow keypad */
379 #define DIK_LEFTARROW       DIK_LEFT            /* LeftArrow on arrow keypad */
380 #define DIK_RIGHTARROW      DIK_RIGHT           /* RightArrow on arrow keypad */
381 #define DIK_DOWNARROW       DIK_DOWN            /* DownArrow on arrow keypad */
382 #define DIK_PGDN            DIK_NEXT            /* PgDn on arrow keypad */
383
384 #define DIDFT_ALL               0x00000000
385 #define DIDFT_RELAXIS           0x00000001
386 #define DIDFT_ABSAXIS           0x00000002
387 #define DIDFT_AXIS              0x00000003
388 #define DIDFT_PSHBUTTON         0x00000004
389 #define DIDFT_TGLBUTTON         0x00000008
390 #define DIDFT_BUTTON            0x0000000C
391 #define DIDFT_POV               0x00000010
392 #define DIDFT_COLLECTION        0x00000040
393 #define DIDFT_NODATA            0x00000080
394 #define DIDFT_ANYINSTANCE       0x00FFFF00
395 #define DIDFT_INSTANCEMASK      DIDFT_ANYINSTANCE
396 #define DIDFT_MAKEINSTANCE(n)   ((WORD)(n) << 8)
397 #define DIDFT_GETTYPE(n)        LOBYTE(n)
398 #define DIDFT_GETINSTANCE(n)    LOWORD((n) >> 8)
399 #define DIDFT_FFACTUATOR        0x01000000
400 #define DIDFT_FFEFFECTTRIGGER   0x02000000
401 #define DIDFT_OUTPUT            0x10000000
402 #define DIDFT_ENUMCOLLECTION(n) ((WORD)(n) << 8)
403 #define DIDFT_NOCOLLECTION      0x00FFFF00
404 #define DIDF_ABSAXIS            0x00000001
405 #define DIDF_RELAXIS            0x00000002
406
407 #define DIGDD_PEEK              0x00000001
408
409 typedef struct {
410     DWORD       dwOfs;
411     DWORD       dwData;
412     DWORD       dwTimeStamp;
413     DWORD       dwSequence;
414 } DIDEVICEOBJECTDATA,*LPDIDEVICEOBJECTDATA,*LPCDIDEVICEOBJECTDATA;
415
416 typedef struct _DIOBJECTDATAFORMAT {
417     const GUID *pguid;
418     DWORD       dwOfs;
419     DWORD       dwType;
420     DWORD       dwFlags;
421 } DIOBJECTDATAFORMAT, *LPDIOBJECTDATAFORMAT;
422
423 typedef struct {
424     DWORD                       dwSize;
425     DWORD                       dwObjSize;
426     DWORD                       dwFlags;
427     DWORD                       dwDataSize;
428     DWORD                       dwNumObjs;
429     LPDIOBJECTDATAFORMAT        rgodf;
430 } DIDATAFORMAT, *LPDIDATAFORMAT,*LPCDIDATAFORMAT;
431
432 typedef struct {
433     DWORD       dwSize;
434     DWORD       dwHeaderSize;
435     DWORD       dwObj;
436     DWORD       dwHow;
437 } DIPROPHEADER,*LPDIPROPHEADER,*LPCDIPROPHEADER;
438
439 #define DIPH_DEVICE     0
440 #define DIPH_BYOFFSET   1
441 #define DIPH_BYID       2
442 #define DIPH_BYUSAGE    3
443
444 #define DIMAKEUSAGEDWORD(UsagePage, Usage) (DWORD)MAKELONG(Usage, UsagePage)
445
446 typedef struct DIPROPDWORD {
447         DIPROPHEADER    diph;
448         DWORD           dwData;
449 } DIPROPDWORD, *LPDIPROPDWORD;
450 typedef const DIPROPDWORD *LPCDIPROPDWORD;
451
452 typedef struct DIPROPRANGE {
453         DIPROPHEADER    diph;
454         LONG            lMin;
455         LONG            lMax;
456 } DIPROPRANGE, *LPDIPROPRANGE;
457 typedef const DIPROPRANGE *LPCDIPROPRANGE;
458
459 #define DIPROPRANGE_NOMIN       ((LONG)0x80000000)
460 #define DIPROPRANGE_NOMAX       ((LONG)0x7FFFFFFF)
461
462 typedef struct DIPROPCAL {
463         DIPROPHEADER diph;
464         LONG    lMin;
465         LONG    lCenter;
466         LONG    lMax;
467 } DIPROPCAL, *LPDIPROPCAL;
468 typedef const DIPROPCAL *LPCDIPROPCAL;
469
470 typedef struct DIPROPGUIDANDPATH {
471         DIPROPHEADER diph;
472         GUID    guidClass;
473         WCHAR   wszPath[MAX_PATH];
474 } DIPROPGUIDANDPATH, *LPDIPROPGUIDANDPATH,*LPCDIPROPGUIDANDPATH;
475
476 /* special property GUIDs */
477 #define MAKEDIPROP(prop)        ((REFGUID)(prop))
478 #define DIPROP_BUFFERSIZE       MAKEDIPROP(1)
479 #define DIPROP_AXISMODE         MAKEDIPROP(2)
480
481 #define DIPROPAXISMODE_ABS      0
482 #define DIPROPAXISMODE_REL      1
483
484 #define DIPROP_GRANULARITY      MAKEDIPROP(3)
485 #define DIPROP_RANGE            MAKEDIPROP(4)
486 #define DIPROP_DEADZONE         MAKEDIPROP(5)
487 #define DIPROP_SATURATION       MAKEDIPROP(6)
488 #define DIPROP_FFGAIN           MAKEDIPROP(7)
489 #define DIPROP_FFLOAD           MAKEDIPROP(8)
490 #define DIPROP_AUTOCENTER       MAKEDIPROP(9)
491
492 #define DIPROPAUTOCENTER_OFF    0
493 #define DIPROPAUTOCENTER_ON     1
494
495 #define DIPROP_CALIBRATIONMODE  MAKEDIPROP(10)
496
497 #define DIPROPCALIBRATIONMODE_COOKED    0
498 #define DIPROPCALIBRATIONMODE_RAW       1
499
500 #define DIPROP_CALIBRATION      MAKEDIPROP(11)
501 #define DIPROP_GUIDANDPATH      MAKEDIPROP(12)
502
503
504 typedef struct DIDEVCAPS {
505     DWORD       dwSize;
506     DWORD       dwFlags;
507     DWORD       dwDevType;
508     DWORD       dwAxes;
509     DWORD       dwButtons;
510     DWORD       dwPOVs;
511 #if(DIRECTINPUT_VERSION >= 0x0500)
512     DWORD       dwFFSamplePeriod;
513     DWORD       dwFFMinTimeResolution;
514     DWORD       dwFirmwareRevision;
515     DWORD       dwHardwareRevision;
516     DWORD       dwFFDriverVersion;
517 #endif /* DIRECTINPUT_VERSION >= 0x0500 */
518 } DIDEVCAPS,*LPDIDEVCAPS;
519
520 #define DIDC_ATTACHED           0x00000001
521 #define DIDC_POLLEDDEVICE       0x00000002
522 #define DIDC_EMULATED           0x00000004
523 #define DIDC_POLLEDDATAFORMAT   0x00000008
524 #define DIDC_FORCEFEEDBACK      0x00000100
525 #define DIDC_FFATTACK           0x00000200
526 #define DIDC_FFFADE             0x00000400
527 #define DIDC_SATURATION         0x00000800
528 #define DIDC_POSNEGCOEFFICIENTS 0x00001000
529 #define DIDC_POSNEGSATURATION   0x00002000
530 #define DIDC_DEADBAND           0x00004000
531
532 /* SetCooperativeLevel dwFlags */
533 #define DISCL_EXCLUSIVE         0x00000001
534 #define DISCL_NONEXCLUSIVE      0x00000002
535 #define DISCL_FOREGROUND        0x00000004
536 #define DISCL_BACKGROUND        0x00000008
537
538 typedef struct DICONSTANTFORCE {
539         LONG                    lMagnitude;
540 } DICONSTANTFORCE, *LPDICONSTANTFORCE;
541
542 typedef const DICONSTANTFORCE *LPCDICONSTANTFORCE;
543
544 typedef struct DIRAMPFORCE {
545         LONG                    lStart;
546         LONG                    lEnd;
547 } DIRAMPFORCE, *LPDIRAMPFORCE;
548
549 typedef const DIRAMPFORCE *LPCDIRAMPFORCE;
550
551 typedef struct DIPERIODIC {
552         DWORD                   dwMagnitude;
553         LONG                    lOffset;
554         DWORD                   dwPhase;
555         DWORD                   dwPeriod;
556 } DIPERIODIC, *LPDIPERIODIC;
557
558 typedef const DIPERIODIC *LPCDIPERIODIC;
559
560 typedef struct DICONDITION {
561         LONG                    lOffset;
562         LONG                    lPositiveCoefficient;
563         LONG                    lNegativeCoefficient;
564         DWORD                   dwPositiveSaturation;
565         DWORD                   dwNegativeSaturation;
566         LONG                    lDeadBand;
567 } DICONDITION, *LPDICONDITION;
568
569 typedef const DICONDITION *LPCDICONDITION;
570
571 typedef struct DICUSTOMFORCE {
572         DWORD                   cChannels;
573         DWORD                   dwSamplePeriod;
574         DWORD                   cSamples;
575         LPLONG                  rglForceData;
576 } DICUSTOMFORCE, *LPDICUSTOMFORCE;
577
578 typedef const DICUSTOMFORCE *LPCDICUSTOMFORCE;
579
580 typedef struct DIENVELOPE {
581         DWORD                   dwSize;
582         DWORD                   dwAttackLevel;
583         DWORD                   dwAttackTime;
584         DWORD                   dwFadeLevel;
585         DWORD                   dwFadeTime;
586 } DIENVELOPE, *LPDIENVELOPE;
587
588 typedef const DIENVELOPE *LPCDIENVELOPE;
589
590 typedef struct DIEFFECT {
591         DWORD                   dwSize;
592         DWORD                   dwFlags;
593         DWORD                   dwDuration;
594         DWORD                   dwSamplePeriod;
595         DWORD                   dwGain;
596         DWORD                   dwTriggerButton;
597         DWORD                   dwTriggerRepeatInterval;
598         DWORD                   cAxes;
599         LPDWORD                 rgdwAxes;
600         LPLONG                  rglDirection;
601         LPDIENVELOPE            lpEnvelope;
602         DWORD                   cbTypeSpecificParams;
603         LPVOID                  lpvTypeSpecificParams;
604 } DIEFFECT, *LPDIEFFECT;
605
606 typedef const DIEFFECT *LPCDIEFFECT;
607
608 typedef struct DIEFFECTINFOA {
609         DWORD                   dwSize;
610         GUID                    guid;
611         DWORD                   dwEffType;
612         DWORD                   dwStaticParams;
613         DWORD                   dwDynamicParams;
614         CHAR                    tszName[MAX_PATH];
615 } DIEFFECTINFOA, *LPDIEFFECTINFOA;
616
617 typedef struct DIEFFECTINFOW {
618         DWORD                   dwSize;
619         GUID                    guid;
620         DWORD                   dwEffType;
621         DWORD                   dwStaticParams;
622         DWORD                   dwDynamicParams;
623         WCHAR                   tszName[MAX_PATH];
624 } DIEFFECTINFOW, *LPDIEFFECTINFOW;
625
626 #ifdef UNICODE
627 typedef DIEFFECTINFOW DIEFFECTINFO;
628 typedef LPDIEFFECTINFOW LPDIEFFECTINFO;
629 #else
630 typedef DIEFFECTINFOA DIEFFECTINFO;
631 typedef LPDIEFFECTINFOA LPDIEFFECTINFO;
632 #endif
633
634 typedef const DIEFFECTINFOA *LPCDIEFFECTINFOA;
635 typedef const DIEFFECTINFOW *LPCDIEFFECTINFOW;
636 typedef const DIEFFECTINFO  *LPCDIEFFECTINFO;
637
638 typedef BOOL32 (CALLBACK * LPDIENUMEFFECTSCALLBACKA)(LPCDIEFFECTINFOA, LPVOID);
639 typedef BOOL32 (CALLBACK * LPDIENUMEFFECTSCALLBACKW)(LPCDIEFFECTINFOW, LPVOID);
640
641 typedef struct DIEFFESCAPE {
642         DWORD                   dwSize;
643         DWORD                   dwCommand;
644         LPVOID                  lpvInBuffer;
645         DWORD                   cbInBuffer;
646         LPVOID                  lpvOutBuffer;
647         DWORD                   cbOutBuffer;
648 } DIEFFESCAPE, *LPDIEFFESCAPE;
649
650 #define THIS LPDIRECTINPUTEFFECT this
651 typedef struct IDirectInputEffect_VTable {
652     /*** IUnknown methods ***/
653     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
654     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
655     STDMETHOD_(ULONG,Release)(THIS) PURE;
656     /*** IDirectInputEffect methods ***/
657     STDMETHOD(Initialize)(THIS_ HINSTANCE32,DWORD,REFGUID) PURE;
658     STDMETHOD(GetEffectGuid)(THIS_ LPGUID) PURE;
659     STDMETHOD(GetParameters)(THIS_ LPDIEFFECT,DWORD) PURE;
660     STDMETHOD(SetParameters)(THIS_ LPCDIEFFECT,DWORD) PURE;
661     STDMETHOD(Start)(THIS_ DWORD,DWORD) PURE;
662     STDMETHOD(Stop)(THIS) PURE;
663     STDMETHOD(GetEffectStatus)(THIS_ LPDWORD) PURE;
664     STDMETHOD(Download)(THIS) PURE;
665     STDMETHOD(Unload)(THIS) PURE;
666     STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE;
667 } IDirectInputEffect_VTable,*LPDIRECTINPUTEFFECT_VTABLE;
668 #undef THIS
669
670 struct IDirectInputEffect {
671         LPDIRECTINPUTEFFECT_VTABLE      lpvtbl;
672         DWORD                           ref;
673         GUID                            guid;
674 };
675
676 #define THIS LPDIRECTINPUTDEVICE32A this
677 typedef struct IDirectInputDeviceA_VTable {
678     /*** IUnknown methods ***/
679     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
680     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
681     STDMETHOD_(ULONG,Release)(THIS) PURE;
682
683     /*** IDirectInputDeviceA methods ***/
684     STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE;
685     STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACK32A,LPVOID,DWORD) PURE;
686     STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE;
687     STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE;
688     STDMETHOD(Acquire)(THIS) PURE;
689     STDMETHOD(Unacquire)(THIS) PURE;
690     STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE;
691     STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
692     STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE;
693     STDMETHOD(SetEventNotification)(THIS_ HANDLE32) PURE;
694     STDMETHOD(SetCooperativeLevel)(THIS_ HWND32,DWORD) PURE;
695     STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCE32A,DWORD,DWORD) PURE;
696     STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCE32A) PURE;
697     STDMETHOD(RunControlPanel)(THIS_ HWND32,DWORD) PURE;
698     STDMETHOD(Initialize)(THIS_ HINSTANCE32,DWORD,REFGUID) PURE;
699     /*** IDirectInputDevice2A methods ***/
700     STDMETHOD(CreateEffect)(THIS_ REFGUID,LPCDIEFFECT,LPDIRECTINPUTEFFECT *,LPUNKNOWN) PURE;
701     STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKA,LPVOID,DWORD) PURE;
702     STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOA,REFGUID) PURE;
703     STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD) PURE;
704     STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD) PURE;
705     STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK,LPVOID,DWORD) PURE;
706     STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE;
707     STDMETHOD(Poll)(THIS) PURE;
708     STDMETHOD(SendDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
709
710 } IDirectInputDeviceA_VTable,*LPDIRECTINPUTDEVICEA_VTABLE,
711   IDirectInputDevice2A_VTable,*LPDIRECTINPUTDEVICE2A_VTABLE;
712
713 struct IDirectInputDevice32A {
714         LPDIRECTINPUTDEVICEA_VTABLE     lpvtbl;
715         DWORD                           ref;
716         GUID                            guid;
717 };
718
719 /* "Standard" Mouse report... */
720 typedef struct DIMOUSESTATE {
721   LONG lX;
722   LONG lY;
723   LONG lZ;
724   BYTE rgbButtons[4];
725 } DIMOUSESTATE;
726
727 #define DIMOFS_X        FIELD_OFFSET(DIMOUSESTATE, lX)
728 #define DIMOFS_Y        FIELD_OFFSET(DIMOUSESTATE, lY)
729 #define DIMOFS_Z        FIELD_OFFSET(DIMOUSESTATE, lZ)
730 #define DIMOFS_BUTTON0 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 0)
731 #define DIMOFS_BUTTON1 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 1)
732 #define DIMOFS_BUTTON2 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 2)
733 #define DIMOFS_BUTTON3 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 3)
734
735 struct SysMouse32A {
736         LPDIRECTINPUTDEVICEA_VTABLE     lpvtbl;
737         DWORD                           ref;
738         GUID                            guid;
739         BYTE                            absolute;
740         /* Previous position for relative moves */
741         LONG prevX, prevY;
742         LPMOUSE_EVENT_PROC prev_handler;
743         HWND32 win;
744         int xwin;
745         DWORD win_centerX, win_centerY;
746         LPDIDEVICEOBJECTDATA data_queue;
747         int queue_pos, queue_len;
748         int need_warp;
749         int acquired;
750 };
751
752 struct SysKeyboard32A {
753         LPDIRECTINPUTDEVICEA_VTABLE     lpvtbl;
754         DWORD                           ref;
755         GUID                            guid;
756         BYTE                            keystate[256];
757 };
758 #undef THIS
759
760 #define THIS LPDIRECTINPUT32A this
761 typedef struct IDirectInputA_VTable {
762         /*** IUnknown methods ***/
763         STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
764         STDMETHOD_(ULONG,AddRef)(THIS) PURE;
765         STDMETHOD_(ULONG,Release)(THIS) PURE;
766
767         /*** IDirectInputA methods ***/
768         STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICE32A*,LPUNKNOWN) PURE;
769         STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACK32A,LPVOID,DWORD) PURE;
770         STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE;
771         STDMETHOD(RunControlPanel)(THIS_ HWND32,DWORD) PURE;
772         STDMETHOD(Initialize)(THIS_ HINSTANCE32,DWORD) PURE;
773 } IDirectInputA_VTable,*LPDIRECTINPUTA_VTABLE;
774
775 struct IDirectInput32A {
776         LPDIRECTINPUTA_VTABLE   lpvtbl;
777         DWORD                   ref;
778 };
779 #undef THIS
780 #undef THIS_
781 #undef STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn)
782 #undef STDMETHOD_(ret,xfn) ret (CALLBACK *fn##xfn)
783 #undef PURE
784 #undef FAR
785 #endif