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