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