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