| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- #+build windows
- package sys_windows
- foreign import "system:xinput.lib"
- // Device types available in XINPUT_CAPABILITIES
- // Correspond to XINPUT_DEVTYPE_...
- XINPUT_DEVTYPE :: enum BYTE {
- GAMEPAD = 0x01,
- }
- // Device subtypes available in XINPUT_CAPABILITIES
- // Correspond to XINPUT_DEVSUBTYPE_...
- XINPUT_DEVSUBTYPE :: enum BYTE {
- UNKNOWN = 0x00,
- GAMEPAD = 0x01,
- WHEEL = 0x02,
- ARCADE_STICK = 0x03,
- FLIGHT_STICK = 0x04,
- DANCE_PAD = 0x05,
- GUITAR = 0x06,
- GUITAR_ALTERNATE = 0x07,
- DRUM_KIT = 0x08,
- GUITAR_BASS = 0x0B,
- ARCADE_PAD = 0x13,
- }
- // Flags for XINPUT_CAPABILITIES
- // Correspond to log2(XINPUT_CAPS_...)
- XINPUT_CAP :: enum WORD {
- FFB_SUPPORTED = 0,
- WIRELESS = 1,
- VOICE_SUPPORTED = 2,
- PMD_SUPPORTED = 3,
- NO_NAVIGATION = 4,
- }
- XINPUT_CAPS :: distinct bit_set[XINPUT_CAP;WORD]
- // Constants for gamepad buttons
- // Correspond to log2(XINPUT_GAMEPAD_...)
- XINPUT_GAMEPAD_BUTTON_BIT :: enum WORD {
- DPAD_UP = 0,
- DPAD_DOWN = 1,
- DPAD_LEFT = 2,
- DPAD_RIGHT = 3,
- START = 4,
- BACK = 5,
- LEFT_THUMB = 6,
- RIGHT_THUMB = 7,
- LEFT_SHOULDER = 8,
- RIGHT_SHOULDER = 9,
- A = 12,
- B = 13,
- X = 14,
- Y = 15,
- }
- XINPUT_GAMEPAD_BUTTON :: distinct bit_set[XINPUT_GAMEPAD_BUTTON_BIT;WORD]
- // Gamepad thresholds
- XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE: SHORT : 7849
- XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE: SHORT : 8689
- XINPUT_GAMEPAD_TRIGGER_THRESHOLD: SHORT : 30
- // Flags to pass to XInputGetCapabilities
- // Corresponds to log2(XINPUT_FLAG_...)
- XINPUT_FLAG_BIT :: enum WORD {
- GAMEPAD = 0,
- }
- XINPUT_FLAG :: distinct bit_set[XINPUT_FLAG_BIT;DWORD]
- // Devices that support batteries
- // Corresponds to BATTERY_DEVTYPE_...
- BATTERY_DEVTYPE :: enum BYTE {
- GAMEPAD = 0x00,
- HEADSET = 0x01,
- }
- // Flags for battery status level
- // Correspond to BATTERY_TYPE_...
- BATTERY_TYPE :: enum BYTE {
- DISCONNECTED = 0x00, // This device is not connected
- WIRED = 0x01, // Wired device, no battery
- ALKALINE = 0x02, // Alkaline battery source
- NIMH = 0x03, // Nickel Metal Hydride battery source
- UNKNOWN = 0xFF, // Cannot determine the battery type
- }
- // These are only valid for wireless, connected devices, with known battery types
- // The amount of use time remaining depends on the type of device.
- // Correspond to BATTERY_LEVEL_...
- BATTERY_LEVEL :: enum BYTE {
- EMPTY = 0x00,
- LOW = 0x01,
- MEDIUM = 0x02,
- FULL = 0x03,
- }
- // User index definitions
- // Index of the gamer associated with the device
- XUSER :: enum DWORD {
- One = 0,
- Two = 1,
- Three = 2,
- Four = 3,
- Any = 0x000000FF, // Can be only used with XInputGetKeystroke
- }
- XUSER_MAX_COUNT :: 4
- // Codes returned for the gamepad keystroke
- // Corresponds to VK_PAD_...
- VK_PAD :: enum WORD {
- A = 0x5800,
- B = 0x5801,
- X = 0x5802,
- Y = 0x5803,
- RSHOULDER = 0x5804,
- LSHOULDER = 0x5805,
- LTRIGGER = 0x5806,
- RTRIGGER = 0x5807,
- DPAD_UP = 0x5810,
- DPAD_DOWN = 0x5811,
- DPAD_LEFT = 0x5812,
- DPAD_RIGHT = 0x5813,
- START = 0x5814,
- BACK = 0x5815,
- LTHUMB_PRESS = 0x5816,
- RTHUMB_PRESS = 0x5817,
- LTHUMB_UP = 0x5820,
- LTHUMB_DOWN = 0x5821,
- LTHUMB_RIGHT = 0x5822,
- LTHUMB_LEFT = 0x5823,
- LTHUMB_UPLEFT = 0x5824,
- LTHUMB_UPRIGHT = 0x5825,
- LTHUMB_DOWNRIGHT = 0x5826,
- LTHUMB_DOWNLEFT = 0x5827,
- RTHUMB_UP = 0x5830,
- RTHUMB_DOWN = 0x5831,
- RTHUMB_RIGHT = 0x5832,
- RTHUMB_LEFT = 0x5833,
- RTHUMB_UPLEFT = 0x5834,
- RTHUMB_UPRIGHT = 0x5835,
- RTHUMB_DOWNRIGHT = 0x5836,
- RTHUMB_DOWNLEFT = 0x5837,
- }
- // Flags used in XINPUT_KEYSTROKE
- // Correspond to log2(XINPUT_KEYSTROKE_...)
- XINPUT_KEYSTROKE_BIT :: enum WORD {
- KEYDOWN = 0,
- KEYUP = 1,
- REPEAT = 2,
- }
- XINPUT_KEYSTROKES :: distinct bit_set[XINPUT_KEYSTROKE_BIT;WORD]
- // Structures used by XInput APIs
- XINPUT_GAMEPAD :: struct {
- wButtons: XINPUT_GAMEPAD_BUTTON,
- bLeftTrigger: BYTE,
- bRightTrigger: BYTE,
- sThumbLX: SHORT,
- sThumbLY: SHORT,
- sThumbRX: SHORT,
- sThumbRY: SHORT,
- }
- XINPUT_STATE :: struct {
- dwPacketNumber: DWORD,
- Gamepad: XINPUT_GAMEPAD,
- }
- XINPUT_VIBRATION :: struct {
- wLeftMotorSpeed: WORD,
- wRightMotorSpeed: WORD,
- }
- XINPUT_CAPABILITIES :: struct {
- Type: XINPUT_DEVTYPE,
- SubType: XINPUT_DEVSUBTYPE,
- Flags: XINPUT_CAPS,
- Gamepad: XINPUT_GAMEPAD,
- Vibration: XINPUT_VIBRATION,
- }
- XINPUT_BATTERY_INFORMATION :: struct {
- BatteryType: BATTERY_TYPE,
- BatteryLevel: BATTERY_LEVEL,
- }
- XINPUT_KEYSTROKE :: struct {
- VirtualKey: VK_PAD,
- Unicode: WCHAR,
- Flags: XINPUT_KEYSTROKES,
- UserIndex: XUSER,
- HidCode: BYTE,
- }
- // XInput APIs
- @(default_calling_convention = "system")
- foreign xinput {
- XInputGetState :: proc(user: XUSER, pState: ^XINPUT_STATE) -> System_Error ---
- XInputSetState :: proc(user: XUSER, pVibration: ^XINPUT_VIBRATION) -> System_Error ---
- XInputGetCapabilities :: proc(user: XUSER, dwFlags: XINPUT_FLAG, pCapabilities: ^XINPUT_CAPABILITIES) -> System_Error ---
- XInputEnable :: proc(enable: BOOL) ---
- XInputGetAudioDeviceIds :: proc(user: XUSER, pRenderDeviceId: LPWSTR, pRenderCount: ^UINT, pCaptureDeviceId: LPWSTR, pCaptureCount: ^UINT) -> System_Error ---
- XInputGetBatteryInformation :: proc(user: XUSER, devType: BATTERY_DEVTYPE, pBatteryInformation: ^XINPUT_BATTERY_INFORMATION) -> System_Error ---
- XInputGetKeystroke :: proc(user: XUSER, dwReserved: DWORD, pKeystroke: ^XINPUT_KEYSTROKE) -> System_Error ---
- XInputGetDSoundAudioDeviceGuids :: proc(user: XUSER, pDSoundRenderGuid: ^GUID, pDSoundCaptureGuid: ^GUID) -> System_Error ---
- }
|