xinput.odin 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #+build windows
  2. package sys_windows
  3. foreign import "system:xinput.lib"
  4. // Device types available in XINPUT_CAPABILITIES
  5. // Correspond to XINPUT_DEVTYPE_...
  6. XINPUT_DEVTYPE :: enum BYTE {
  7. GAMEPAD = 0x01,
  8. }
  9. // Device subtypes available in XINPUT_CAPABILITIES
  10. // Correspond to XINPUT_DEVSUBTYPE_...
  11. XINPUT_DEVSUBTYPE :: enum BYTE {
  12. UNKNOWN = 0x00,
  13. GAMEPAD = 0x01,
  14. WHEEL = 0x02,
  15. ARCADE_STICK = 0x03,
  16. FLIGHT_STICK = 0x04,
  17. DANCE_PAD = 0x05,
  18. GUITAR = 0x06,
  19. GUITAR_ALTERNATE = 0x07,
  20. DRUM_KIT = 0x08,
  21. GUITAR_BASS = 0x0B,
  22. ARCADE_PAD = 0x13,
  23. }
  24. // Flags for XINPUT_CAPABILITIES
  25. // Correspond to log2(XINPUT_CAPS_...)
  26. XINPUT_CAP :: enum WORD {
  27. FFB_SUPPORTED = 0,
  28. WIRELESS = 1,
  29. VOICE_SUPPORTED = 2,
  30. PMD_SUPPORTED = 3,
  31. NO_NAVIGATION = 4,
  32. }
  33. XINPUT_CAPS :: distinct bit_set[XINPUT_CAP;WORD]
  34. // Constants for gamepad buttons
  35. // Correspond to log2(XINPUT_GAMEPAD_...)
  36. XINPUT_GAMEPAD_BUTTON_BIT :: enum WORD {
  37. DPAD_UP = 0,
  38. DPAD_DOWN = 1,
  39. DPAD_LEFT = 2,
  40. DPAD_RIGHT = 3,
  41. START = 4,
  42. BACK = 5,
  43. LEFT_THUMB = 6,
  44. RIGHT_THUMB = 7,
  45. LEFT_SHOULDER = 8,
  46. RIGHT_SHOULDER = 9,
  47. A = 12,
  48. B = 13,
  49. X = 14,
  50. Y = 15,
  51. }
  52. XINPUT_GAMEPAD_BUTTON :: distinct bit_set[XINPUT_GAMEPAD_BUTTON_BIT;WORD]
  53. // Gamepad thresholds
  54. XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE: SHORT : 7849
  55. XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE: SHORT : 8689
  56. XINPUT_GAMEPAD_TRIGGER_THRESHOLD: SHORT : 30
  57. // Flags to pass to XInputGetCapabilities
  58. // Corresponds to log2(XINPUT_FLAG_...)
  59. XINPUT_FLAG_BIT :: enum WORD {
  60. GAMEPAD = 0,
  61. }
  62. XINPUT_FLAG :: distinct bit_set[XINPUT_FLAG_BIT;DWORD]
  63. // Devices that support batteries
  64. // Corresponds to BATTERY_DEVTYPE_...
  65. BATTERY_DEVTYPE :: enum BYTE {
  66. GAMEPAD = 0x00,
  67. HEADSET = 0x01,
  68. }
  69. // Flags for battery status level
  70. // Correspond to BATTERY_TYPE_...
  71. BATTERY_TYPE :: enum BYTE {
  72. DISCONNECTED = 0x00, // This device is not connected
  73. WIRED = 0x01, // Wired device, no battery
  74. ALKALINE = 0x02, // Alkaline battery source
  75. NIMH = 0x03, // Nickel Metal Hydride battery source
  76. UNKNOWN = 0xFF, // Cannot determine the battery type
  77. }
  78. // These are only valid for wireless, connected devices, with known battery types
  79. // The amount of use time remaining depends on the type of device.
  80. // Correspond to BATTERY_LEVEL_...
  81. BATTERY_LEVEL :: enum BYTE {
  82. EMPTY = 0x00,
  83. LOW = 0x01,
  84. MEDIUM = 0x02,
  85. FULL = 0x03,
  86. }
  87. // User index definitions
  88. // Index of the gamer associated with the device
  89. XUSER :: enum DWORD {
  90. One = 0,
  91. Two = 1,
  92. Three = 2,
  93. Four = 3,
  94. Any = 0x000000FF, // Can be only used with XInputGetKeystroke
  95. }
  96. XUSER_MAX_COUNT :: 4
  97. // Codes returned for the gamepad keystroke
  98. // Corresponds to VK_PAD_...
  99. VK_PAD :: enum WORD {
  100. A = 0x5800,
  101. B = 0x5801,
  102. X = 0x5802,
  103. Y = 0x5803,
  104. RSHOULDER = 0x5804,
  105. LSHOULDER = 0x5805,
  106. LTRIGGER = 0x5806,
  107. RTRIGGER = 0x5807,
  108. DPAD_UP = 0x5810,
  109. DPAD_DOWN = 0x5811,
  110. DPAD_LEFT = 0x5812,
  111. DPAD_RIGHT = 0x5813,
  112. START = 0x5814,
  113. BACK = 0x5815,
  114. LTHUMB_PRESS = 0x5816,
  115. RTHUMB_PRESS = 0x5817,
  116. LTHUMB_UP = 0x5820,
  117. LTHUMB_DOWN = 0x5821,
  118. LTHUMB_RIGHT = 0x5822,
  119. LTHUMB_LEFT = 0x5823,
  120. LTHUMB_UPLEFT = 0x5824,
  121. LTHUMB_UPRIGHT = 0x5825,
  122. LTHUMB_DOWNRIGHT = 0x5826,
  123. LTHUMB_DOWNLEFT = 0x5827,
  124. RTHUMB_UP = 0x5830,
  125. RTHUMB_DOWN = 0x5831,
  126. RTHUMB_RIGHT = 0x5832,
  127. RTHUMB_LEFT = 0x5833,
  128. RTHUMB_UPLEFT = 0x5834,
  129. RTHUMB_UPRIGHT = 0x5835,
  130. RTHUMB_DOWNRIGHT = 0x5836,
  131. RTHUMB_DOWNLEFT = 0x5837,
  132. }
  133. // Flags used in XINPUT_KEYSTROKE
  134. // Correspond to log2(XINPUT_KEYSTROKE_...)
  135. XINPUT_KEYSTROKE_BIT :: enum WORD {
  136. KEYDOWN = 0,
  137. KEYUP = 1,
  138. REPEAT = 2,
  139. }
  140. XINPUT_KEYSTROKES :: distinct bit_set[XINPUT_KEYSTROKE_BIT;WORD]
  141. // Structures used by XInput APIs
  142. XINPUT_GAMEPAD :: struct {
  143. wButtons: XINPUT_GAMEPAD_BUTTON,
  144. bLeftTrigger: BYTE,
  145. bRightTrigger: BYTE,
  146. sThumbLX: SHORT,
  147. sThumbLY: SHORT,
  148. sThumbRX: SHORT,
  149. sThumbRY: SHORT,
  150. }
  151. XINPUT_STATE :: struct {
  152. dwPacketNumber: DWORD,
  153. Gamepad: XINPUT_GAMEPAD,
  154. }
  155. XINPUT_VIBRATION :: struct {
  156. wLeftMotorSpeed: WORD,
  157. wRightMotorSpeed: WORD,
  158. }
  159. XINPUT_CAPABILITIES :: struct {
  160. Type: XINPUT_DEVTYPE,
  161. SubType: XINPUT_DEVSUBTYPE,
  162. Flags: XINPUT_CAPS,
  163. Gamepad: XINPUT_GAMEPAD,
  164. Vibration: XINPUT_VIBRATION,
  165. }
  166. XINPUT_BATTERY_INFORMATION :: struct {
  167. BatteryType: BATTERY_TYPE,
  168. BatteryLevel: BATTERY_LEVEL,
  169. }
  170. XINPUT_KEYSTROKE :: struct {
  171. VirtualKey: VK_PAD,
  172. Unicode: WCHAR,
  173. Flags: XINPUT_KEYSTROKES,
  174. UserIndex: XUSER,
  175. HidCode: BYTE,
  176. }
  177. // XInput APIs
  178. @(default_calling_convention = "system")
  179. foreign xinput {
  180. XInputGetState :: proc(user: XUSER, pState: ^XINPUT_STATE) -> System_Error ---
  181. XInputSetState :: proc(user: XUSER, pVibration: ^XINPUT_VIBRATION) -> System_Error ---
  182. XInputGetCapabilities :: proc(user: XUSER, dwFlags: XINPUT_FLAG, pCapabilities: ^XINPUT_CAPABILITIES) -> System_Error ---
  183. XInputEnable :: proc(enable: BOOL) ---
  184. XInputGetAudioDeviceIds :: proc(user: XUSER, pRenderDeviceId: LPWSTR, pRenderCount: ^UINT, pCaptureDeviceId: LPWSTR, pCaptureCount: ^UINT) -> System_Error ---
  185. XInputGetBatteryInformation :: proc(user: XUSER, devType: BATTERY_DEVTYPE, pBatteryInformation: ^XINPUT_BATTERY_INFORMATION) -> System_Error ---
  186. XInputGetKeystroke :: proc(user: XUSER, dwReserved: DWORD, pKeystroke: ^XINPUT_KEYSTROKE) -> System_Error ---
  187. XInputGetDSoundAudioDeviceGuids :: proc(user: XUSER, pDSoundRenderGuid: ^GUID, pDSoundCaptureGuid: ^GUID) -> System_Error ---
  188. }