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;