diff options
| author | gingerBill <gingerBill@users.noreply.github.com> | 2025-01-06 13:44:45 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-06 13:44:45 +0000 |
| commit | 37a608664b94ca9fd82f65635dcf9d273e88047e (patch) | |
| tree | 7d661f928a73da711c74ec5b16f2a3158db17057 /core/sys/windows | |
| parent | 98efb03934b464a1b23759b5695a12ff37588357 (diff) | |
| parent | 8aab0f9e34ab8818b7599c285799819b22319cad (diff) | |
Merge pull request #3208 from lordhippo/add-xinput
Add xinput bindings to core:sys/windows
Diffstat (limited to 'core/sys/windows')
| -rw-r--r-- | core/sys/windows/xinput.odin | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/core/sys/windows/xinput.odin b/core/sys/windows/xinput.odin new file mode 100644 index 000000000..014d2573a --- /dev/null +++ b/core/sys/windows/xinput.odin @@ -0,0 +1,210 @@ +// +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 --- +} |