1 module win32.directx.dinput8;
2 version(Windows):
3
4 //import tango.sys.win32.Types;
5 //alias char CHAR;
6
7 import win32.windows;
8
9 enum {
10 CLASS_E_NOAGGREGATION = cast(int) 0x80040110,
11 }
12
13 interface IUnknown {
14 HRESULT QueryInterface(IID* riid, void** pvObject);
15 ULONG AddRef();
16 ULONG Release();
17 }
18
19 extern(C):
20
21 struct DIDEVICEINSTANCEA
22 {
23 DWORD dwSize;
24 GUID guidInstance;
25 GUID guidProduct;
26 DWORD dwDevType;
27 CHAR[MAX_PATH] tszInstanceName;
28 CHAR[MAX_PATH] tszProductName;
29 GUID guidFFDriver;
30 WORD wUsagePage;
31 WORD wUsage;
32 }
33 alias DIDEVICEINSTANCEA DIDEVICEINSTANCE;
34
35 struct DIDEVICEOBJECTINSTANCEA
36 {
37 DWORD dwSize;
38 GUID guidType;
39 DWORD dwOfs;
40 DWORD dwType;
41 DWORD dwFlags;
42 CHAR[MAX_PATH] tszName;
43 DWORD dwFFMaxForce;
44 DWORD dwFFForceResolution;
45 WORD wCollectionNumber;
46 WORD wDesignatorIndex;
47 WORD wUsagePage;
48 WORD wUsage;
49 DWORD dwDimension;
50 WORD wExponent;
51 WORD wReportId;
52 }
53
54 struct DIOBJECTDATAFORMAT
55 {
56 const GUID *pguid;
57 DWORD dwOfs;
58 DWORD dwType;
59 DWORD dwFlags;
60 }
61
62 struct DIDATAFORMAT
63 {
64 DWORD dwSize;
65 DWORD dwObjSize;
66 DWORD dwFlags;
67 DWORD dwDataSize;
68 DWORD dwNumObjs;
69 DIOBJECTDATAFORMAT* rgodf;
70 }
71
72 extern DIDATAFORMAT c_dfDIKeyboard;
73 extern DIDATAFORMAT c_dfDIMouse2;
74 extern DIDATAFORMAT c_dfDIJoystick;
75
76 struct DIACTIONA
77 {
78 UINT* uAppData;
79 DWORD dwSemantic;
80 DWORD dwFlags;
81 union
82 {
83 LPCSTR lptszActionName;
84 UINT uResIdString;
85 }
86 GUID guidInstance;
87 DWORD dwObjID;
88 DWORD dwHow;
89 }
90
91 struct DIACTIONFORMATA
92 {
93 DWORD dwSize;
94 DWORD dwActionSize;
95 DWORD dwDataSize;
96 DWORD dwNumActions;
97 DIACTIONA* rgoAction;
98 GUID guidActionMap;
99 DWORD dwGenre;
100 DWORD dwBufferSize;
101 LONG lAxisMin;
102 LONG lAxisMax;
103 HINSTANCE hInstString;
104 FILETIME ftTimeStamp;
105 DWORD dwCRC;
106 CHAR[MAX_PATH] tszActionMap;
107 }
108
109 struct DIDEVCAPS
110 {
111 DWORD dwSize;
112 DWORD dwFlags;
113 DWORD dwDevType;
114 DWORD dwAxes;
115 DWORD dwButtons;
116 DWORD dwPOVs;
117 DWORD dwFFSamplePeriod;
118 DWORD dwFFMinTimeResolution;
119 DWORD dwFirmwareRevision;
120 DWORD dwHardwareRevision;
121 DWORD dwFFDriverVersion;
122 }
123
124 struct DIPROPHEADER
125 {
126 DWORD dwSize;
127 DWORD dwHeaderSize;
128 DWORD dwObj;
129 DWORD dwHow;
130 }
131
132 struct DIDEVICEOBJECTDATA
133 {
134 DWORD dwOfs;
135 DWORD dwData;
136 DWORD dwTimeStamp;
137 DWORD dwSequence;
138 UINT* uAppData;
139 }
140
141 struct DIENVELOPE
142 {
143 DWORD dwSize = DIENVELOPE.sizeof;
144 DWORD dwAttackLevel;
145 DWORD dwAttackTime; // Microseconds
146 DWORD dwFadeLevel;
147 DWORD dwFadeTime; // Microseconds
148 }
149
150 struct DIEFFECT
151 {
152 DWORD dwSize = DIEFFECT.sizeof;
153 DWORD dwFlags; // DIEFF_*
154 DWORD dwDuration; // Microseconds
155 DWORD dwSamplePeriod; // Microseconds
156 DWORD dwGain;
157 DWORD dwTriggerButton; // or DIEB_NOTRIGGER
158 DWORD dwTriggerRepeatInterval; // Microseconds
159 DWORD cAxes; // Number of axes
160 LPDWORD rgdwAxes; // Array of axes
161 LPLONG rglDirection; // Array of directions
162 DIENVELOPE* lpEnvelope; // Optional
163 DWORD cbTypeSpecificParams; // Size of params
164 LPVOID lpvTypeSpecificParams; // Pointer to params
165 DWORD dwStartDelay; // Microseconds
166 }
167
168 struct DIEFFESCAPE
169 {
170 DWORD dwSize;
171 DWORD dwCommand;
172 LPVOID lpvInBuffer;
173 DWORD cbInBuffer;
174 LPVOID lpvOutBuffer;
175 DWORD cbOutBuffer;
176 }
177
178 struct DIEFFECTINFOA
179 {
180 DWORD dwSize;
181 GUID guid;
182 DWORD dwEffType;
183 DWORD dwStaticParams;
184 DWORD dwDynamicParams;
185 CHAR[MAX_PATH] tszName;
186 }
187
188 struct DIFILEEFFECT
189 {
190 DWORD dwSize;
191 GUID GuidEffect;
192 DIEFFECT* lpDiEffect;
193 CHAR[MAX_PATH] szFriendlyName;
194 }
195
196 struct DIDEVICEIMAGEINFOA
197 {
198 CHAR[MAX_PATH] tszImagePath;
199 DWORD dwFlags;
200 // These are valid if DIDIFT_OVERLAY is present in dwFlags.
201 DWORD dwViewID;
202 RECT rcOverlay;
203 DWORD dwObjID;
204 DWORD dwcValidPts;
205 POINT[5] rgptCalloutLine;
206 RECT rcCalloutRect;
207 DWORD dwTextAlign;
208 }
209
210 struct DIDEVICEIMAGEINFOHEADERA
211 {
212 DWORD dwSize;
213 DWORD dwSizeImageInfo;
214 DWORD dwcViews;
215 DWORD dwcButtons;
216 DWORD dwcAxes;
217 DWORD dwcPOVs;
218 DWORD dwBufferSize;
219 DWORD dwBufferUsed;
220 DIDEVICEIMAGEINFOA* lprgImageInfoArray;
221 }
222
223 struct DICONFIGUREDEVICESPARAMSA
224 {
225 DWORD dwSize;
226 DWORD dwcUsers;
227 LPSTR lptszUserNames;
228 DWORD dwcFormats;
229 DIACTIONFORMATA* lprgFormats;
230 HWND hwnd;
231 DICOLORSET dics;
232 IUnknown lpUnkDDSTarget;
233 }
234
235 struct DICOLORSET
236 {
237 DWORD dwSize;
238 DWORD cTextFore;
239 DWORD cTextHighlight;
240 DWORD cCalloutLine;
241 DWORD cCalloutHighlight;
242 DWORD cBorder;
243 DWORD cControlFill;
244 DWORD cHighlightFill;
245 DWORD cAreaFill;
246 }
247
248 struct DIMOUSESTATE2
249 {
250 LONG lX;
251 LONG lY;
252 LONG lZ;
253 BYTE[8] rgbButtons;
254 }
255
256 struct DIJOYSTATE
257 {
258 LONG lX; /* x-axis position */
259 LONG lY; /* y-axis position */
260 LONG lZ; /* z-axis position */
261 LONG lRx; /* x-axis rotation */
262 LONG lRy; /* y-axis rotation */
263 LONG lRz; /* z-axis rotation */
264 LONG[2] rglSlider; /* extra axes positions */
265 DWORD[4] rgdwPOV; /* POV directions */
266 BYTE[32] rgbButtons; /* 32 buttons */
267 }
268
269 struct DIPROPRANGE
270 {
271 DIPROPHEADER diph;
272 LONG lMin;
273 LONG lMax;
274 }
275
276 interface IDirectInputEffect : IUnknown
277 {
278 HRESULT Initialize(HINSTANCE, DWORD, GUID*);
279 HRESULT GetEffectGuid(GUID*);
280 HRESULT GetParameters(DIEFFECT*, DWORD);
281 HRESULT SetParameters(DIEFFECT*, DWORD);
282 HRESULT Start(DWORD, DWORD);
283 HRESULT Stop();
284 HRESULT GetEffectStatus(LPDWORD);
285 HRESULT Download();
286 HRESULT Unload();
287 HRESULT Escape(DIEFFESCAPE*);
288 }
289
290 extern(Windows) alias bool function(DIDEVICEINSTANCEA*, LPVOID) LPDIENUMDEVICESCALLBACKA;
291 extern(Windows) alias bool function(DIDEVICEINSTANCEA*, IDirectInputDevice8A*, DWORD, DWORD, LPVOID) LPDIENUMDEVICESBYSEMANTICSCBA;
292
293 extern(Windows) alias bool function(DIDEVICEOBJECTINSTANCEA *didoi, void* pContext) LPDIENUMDEVICEOBJECTSCALLBACKA;
294
295 extern(Windows) alias bool function(DIEFFECTINFOA*, LPVOID) LPDIENUMEFFECTSCALLBACKA;
296 extern(Windows) alias bool function(IDirectInputEffect, LPVOID) LPDIENUMCREATEDEFFECTOBJECTSCALLBACK;
297 extern(Windows) alias bool function(DIFILEEFFECT* , LPVOID) LPDIENUMEFFECTSINFILECALLBACK;
298 extern(Windows) alias bool function(IUnknown, LPVOID) LPDICONFIGUREDEVICESCALLBACK;
299
300 interface IDirectInputDevice8A : IUnknown
301 {
302 HRESULT GetCapabilities(DIDEVCAPS*);
303 HRESULT EnumObjects(LPDIENUMDEVICEOBJECTSCALLBACKA, VOID*, DWORD);
304 HRESULT GetProperty(GUID*, DIPROPHEADER*);
305 HRESULT SetProperty(GUID*, DIPROPHEADER*);
306 HRESULT Acquire();
307 HRESULT Unacquire();
308 HRESULT GetDeviceState(DWORD, LPVOID);
309 HRESULT GetDeviceData(DWORD, DIDEVICEOBJECTDATA*, LPDWORD, DWORD);
310 HRESULT SetDataFormat(DIDATAFORMAT*);
311 HRESULT SetEventNotification(HANDLE);
312 HRESULT SetCooperativeLevel(HWND, DWORD);
313 HRESULT GetObjectInfo(DIDEVICEOBJECTINSTANCEA*, DWORD, DWORD);
314 HRESULT GetDeviceInfo(DIDEVICEINSTANCEA*);
315 HRESULT RunControlPanel(HWND, DWORD);
316 HRESULT Initialize(HINSTANCE, DWORD, GUID*);
317 HRESULT CreateEffect(GUID*, DIEFFECT*, IDirectInputEffect*, IUnknown);
318 HRESULT EnumEffects(LPDIENUMEFFECTSCALLBACKA, LPVOID, DWORD);
319 HRESULT GetEffectInfo(DIEFFECTINFOA*, GUID*);
320 HRESULT GetForceFeedbackState(LPDWORD);
321 HRESULT SendForceFeedbackCommand(DWORD);
322 HRESULT EnumCreatedEffectObjects(LPDIENUMCREATEDEFFECTOBJECTSCALLBACK, LPVOID, DWORD);
323 HRESULT Escape(DIEFFESCAPE*);
324 HRESULT Poll();
325 HRESULT SendDeviceData(DWORD, DIDEVICEOBJECTDATA*, LPDWORD, DWORD);
326 HRESULT EnumEffectsInFile(LPCSTR, LPDIENUMEFFECTSINFILECALLBACK, LPVOID, DWORD);
327 HRESULT WriteEffectToFile(LPCSTR, DWORD, DIFILEEFFECT*, DWORD);
328 HRESULT BuildActionMap(DIACTIONFORMATA*, LPCSTR, DWORD);
329 HRESULT SetActionMap(DIACTIONFORMATA*, LPCSTR, DWORD);
330 HRESULT GetImageInfo(DIDEVICEIMAGEINFOHEADERA*);
331 }
332 alias IDirectInputDevice8A IDirectInputDevice8;
333
334 interface IDirectInput8A : IUnknown
335 {
336 extern(Windows):
337 HRESULT CreateDevice(GUID*, IDirectInputDevice8A*, IUnknown);
338 HRESULT EnumDevices(DWORD, LPDIENUMDEVICESCALLBACKA, LPVOID, DWORD);
339 HRESULT GetDeviceStatus(GUID*);
340 HRESULT RunControlPanel(HWND, DWORD);
341 HRESULT Initialize(HINSTANCE, DWORD);
342 HRESULT FindDevice(GUID*, LPCSTR, GUID*);
343 HRESULT EnumDevicesBySemantics(LPCSTR, DIACTIONFORMATA*, LPDIENUMDEVICESBYSEMANTICSCBA, LPVOID, DWORD);
344 HRESULT ConfigureDevices(LPDICONFIGUREDEVICESCALLBACK, DICONFIGUREDEVICESPARAMSA*, DWORD, LPVOID);
345 }
346 alias IDirectInput8A IDirectInput8;
347
348 extern(Windows) HRESULT DirectInput8Create(HINSTANCE hinst, DWORD dwVersion, GUID* riidltf, void** ppvOut, IUnknown punkOuter);
349
350 const GUID IID_IDirectInput8A={0xBF798030, 0x483A, 0x4DA2, [0xAA, 0x99, 0x5D, 0x64, 0xED, 0x36, 0x97, 0x00]};
351 alias IID_IDirectInput8A IID_IDirectInput8;
352 const GUID GUID_SysKeyboard = {0x6F1D2B61, 0xD5A0, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
353 const GUID GUID_SysMouse = {0x6F1D2B60, 0xD5A0, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
354 const GUID GUID_XAxis = {0xA36D02E0, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
355 const GUID GUID_YAxis = {0xA36D02E1, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
356 const GUID GUID_ZAxis = {0xA36D02E2, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
357 const GUID GUID_RxAxis = {0xA36D02F4, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
358 const GUID GUID_RyAxis = {0xA36D02F5, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
359 const GUID GUID_RzAxis = {0xA36D02E3, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
360 const GUID GUID_Slider = {0xA36D02E4, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
361 const GUID GUID_Key = {0x55728220, 0xD33C, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
362 const GUID GUID_POV = {0xA36D02F2, 0xC9F3, 0x11CF, [0xBF, 0xC7, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00]};
363
364 enum : uint
365 {
366 DISCL_EXCLUSIVE= 0x00000001,
367 DISCL_NONEXCLUSIVE= 0x00000002,
368 DISCL_FOREGROUND= 0x00000004,
369 DISCL_BACKGROUND= 0x00000008,
370 DISCL_NOWINKEY= 0x00000010,
371
372 DIPH_DEVICE=0,
373 DIPH_BYOFFSET=1,
374
375 DI8DEVCLASS_GAMECTRL=4,
376 DIEDFL_ATTACHEDONLY= 0x00000001,
377 DIDFT_AXIS= 0x00000003
378 }
379
380 enum
381 {
382 SEVERITY_SUCCESS= 0,
383 SEVERITY_ERROR= 1,
384 FACILITY_WIN32= 7,
385 ERROR_READ_FAULT= 30L,
386 DIENUM_CONTINUE= 1,
387 DIPH_BYID= 2
388 }
389
390 struct DIPROPDWORD
391 {
392 DIPROPHEADER diph;
393 DWORD dwData;
394 }
395
396 template MAKE_HRESULT(uint sev, uint fac, uint code)
397 {
398 const HRESULT MAKE_HRESULT = cast(HRESULT)((sev << 31) | (fac << 16) | code);
399 }
400
401 const HRESULT DIERR_OLDDIRECTINPUTVERSION = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, 1150);
402 const HRESULT DIERR_BETADIRECTINPUTVERSION = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, 1153);
403 const HRESULT DIERR_BADDRIVERVER = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, 119);
404 const HRESULT DIERR_DEVICENOTREG = 0x80040154;
405 const HRESULT DIERR_NOTFOUND = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND);
406 const HRESULT DIERR_OBJECTNOTFOUND = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND);
407 const HRESULT DIERR_INVALIDPARAM = E_INVALIDARG;
408 const HRESULT DIERR_NOINTERFACE = E_NOINTERFACE;
409 const HRESULT DIERR_GENERIC = E_FAIL;
410 const HRESULT DIERR_OUTOFMEMORY = E_OUTOFMEMORY;
411 const HRESULT DIERR_UNSUPPORTED = E_NOTIMPL;
412 const HRESULT DIERR_NOTINITIALIZED = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, 21);
413 const HRESULT DIERR_ALREADYINITIALIZED = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, 1247);
414 const HRESULT DIERR_NOAGGREGATION = CLASS_E_NOAGGREGATION;
415 const HRESULT DIERR_OTHERAPPHASPRIO = 0x80070005;
416 const HRESULT DIERR_INPUTLOST = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, ERROR_READ_FAULT);
417 const HRESULT DIERR_ACQUIRED = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, 170);
418 const HRESULT DIERR_NOTACQUIRED = MAKE_HRESULT!(SEVERITY_ERROR, FACILITY_WIN32, 12);
419 const HRESULT DIERR_READONLY = 0x80070005;
420 const HRESULT DIERR_HANDLEEXISTS = 0x80070005;
421 const HRESULT DIERR_INSUFFICIENTPRIVS = 0x80040200;
422 const HRESULT DIERR_DEVICEFULL = 0x80040201;
423 const HRESULT DIERR_MOREDATA = 0x80040202;
424 const HRESULT DIERR_NOTDOWNLOADED = 0x80040203;
425 const HRESULT DIERR_HASEFFECTS = 0x80040204;
426 const HRESULT DIERR_NOTEXCLUSIVEACQUIRED = 0x80040205;
427 const HRESULT DIERR_INCOMPLETEEFFECT = 0x80040206;
428 const HRESULT DIERR_NOTBUFFERED = 0x80040207;
429 const HRESULT DIERR_EFFECTPLAYING = 0x80040208;
430 const HRESULT DIERR_UNPLUGGED = 0x80040209;
431 const HRESULT DIERR_REPORTFULL = 0x8004020A;
432 const HRESULT DIERR_MAPFILEFAIL = 0x8004020B;