Files
Odin/vendor/windows/GameInput/windows_game_input.odin
2025-05-26 22:44:09 +02:00

1132 lines
37 KiB
Odin

#+build windows
/*
Bindings for Windows Game Input GDK:
https://learn.microsoft.com/en-us/gaming/gdk/_content/gc/input/overviews/input-overview
Windows SDK 10.0.26100.0 is at least required to link with.
*/
package windows_game_input
foreign import wgi "system:gameinput.lib"
import win "core:sys/windows"
HRESULT :: win.HRESULT
HANDLE :: win.HANDLE
IUnknown :: win.IUnknown
IUnknown_VTable :: win.IUnknown_VTable
IID :: win.IID
APP_LOCAL_DEVICE_ID :: distinct [32]byte
Kind :: distinct bit_set[KindFlag; u32]
KindFlag :: enum u32 {
RawDeviceReport = 0,
ControllerAxis = 1,
ControllerButton = 2,
ControllerSwitch = 3,
Keyboard = 4,
Mouse = 5,
Touch = 8,
Motion = 12,
ArcadeStick = 16,
FlightStick = 17,
Gamepad = 18,
RacingWheel = 19,
UiNavigation = 20,
}
KindUnknown :: Kind{}
KindController :: Kind{ .ControllerAxis, .ControllerButton, .ControllerSwitch }
EnumerationKind :: enum i32 {
NoEnumeration = 0,
AsyncEnumeration = 1,
BlockingEnumeration = 2,
}
FocusPolicy :: distinct bit_set[FocusPolicyFlag; u32]
FocusPolicyFlag :: enum u32 {
DisableBackgroundInput = 0,
ExclusiveForegroundInput = 1,
DisableBackgroundGuideButton = 2,
ExclusiveForegroundGuideButton = 3,
DisableBackgroundShareButton = 4,
ExclusiveForegroundShareButton = 5,
}
DefaultFocusPolicy :: FocusPolicy{}
SwitchKind :: enum i32 {
UnknownSwitchKind = -1,
TwoWaySwitch = 0,
FourWaySwitch = 1,
EightWaySwitch = 2,
}
SwitchPosition :: enum i32 {
Center = 0,
Up = 1,
UpRight = 2,
Right = 3,
DownRight = 4,
Down = 5,
DownLeft = 6,
Left = 7,
UpLeft = 8,
}
KeyboardKind :: enum i32 {
UnknownKeyboard = -1,
AnsiKeyboard = 0,
IsoKeyboard = 1,
KsKeyboard = 2,
AbntKeyboard = 3,
JisKeyboard = 4,
}
MouseButtons :: distinct bit_set[MouseButtonsFlag; u32]
MouseButtonsFlag :: enum u32 {
LeftButton = 0,
RightButton = 1,
MiddleButton = 2,
Button4 = 3,
Button5 = 4,
WheelTiltLeft = 5,
WheelTiltRight = 6,
}
MouseNone :: MouseButtons{}
TouchShape :: enum i32 {
Unknown = -1,
Point = 0,
Linear1D = 1,
Radial1D = 2,
Irregular1D = 3,
Rectangular2D = 4,
Elliptical2D = 5,
Irregular2D = 6,
}
MotionAccuracy :: enum i32 {
AccuracyUnknown = -1,
Unavailable = 0,
Unreliable = 1,
Approximate = 2,
Accurate = 3,
}
ArcadeStickButtons :: distinct bit_set[ArcadeStickButtonsFlag; u32]
ArcadeStickButtonsFlag :: enum u32 {
Menu = 0,
View = 1,
Up = 2,
Down = 3,
Left = 4,
Right = 5,
Action1 = 6,
Action2 = 7,
Action3 = 8,
Action4 = 9,
Action5 = 10,
Action6 = 11,
Special1 = 12,
Special2 = 13,
}
ArcadeStickNone :: ArcadeStickButtons{}
FlightStickButtons :: distinct bit_set[FlightStickButtonsFlag; u32]
FlightStickButtonsFlag :: enum u32 {
Menu = 0,
View = 1,
FirePrimary = 2,
FireSecondary = 3,
}
FlightStickNone :: FlightStickButtons{}
GamepadButtons :: distinct bit_set[GamepadButtonsFlag; u32]
GamepadButtonsFlag :: enum u32 {
Menu = 0,
View = 1,
A = 2,
B = 3,
X = 4,
Y = 5,
DPadUp = 6,
DPadDown = 7,
DPadLeft = 8,
DPadRight = 9,
LeftShoulder = 10,
RightShoulder = 11,
LeftThumbstick = 12,
RightThumbstick = 13,
}
GamepadNone :: GamepadButtons{}
RacingWheelButtons :: distinct bit_set[RacingWheelButtonsFlag; u32]
RacingWheelButtonsFlag :: enum u32 {
Menu = 0,
View = 1,
PreviousGear = 2,
NextGear = 3,
DpadUp = 4,
DpadDown = 5,
DpadLeft = 6,
DpadRight = 7,
}
RacingWheelNone :: RacingWheelButtons{}
UiNavigationButtons :: distinct bit_set[UiNavigationButtonsFlag; u32]
UiNavigationButtonsFlag :: enum u32 {
Menu = 0,
View = 1,
Accept = 2,
Cancel = 3,
Up = 4,
Down = 5,
Left = 6,
Right = 7,
Context1 = 8,
Context2 = 9,
Context3 = 10,
Context4 = 11,
PageUp = 12,
PageDown = 13,
PageLeft = 14,
PageRight = 15,
ScrollUp = 16,
ScrollDown = 17,
ScrollLeft = 18,
ScrollRight = 19,
}
UiNavigationNone :: UiNavigationButtons{}
SystemButtons :: distinct bit_set[SystemButtonsFlag; u32]
SystemButtonsFlag :: enum u32 {
Guide = 0,
Share = 1,
}
SystemButtonNone :: SystemButtons{}
DeviceStatus :: distinct bit_set[DeviceStatusFlag; u32]
DeviceStatusFlag :: enum u32 {
Connected = 0,
InputEnabled = 1,
OutputEnabled = 2,
RawIoEnabled = 3,
AudioCapture = 4,
AudioRender = 5,
Synchronized = 6,
Wireless = 7,
UserIdle = 20,
}
DeviceNoStatus :: DeviceStatus{}
//DeviceAnyStatus :: 0x00FFFFFF
BatteryStatus :: enum i32 {
Unknown = -1,
NotPresent = 0,
Discharging = 1,
Idle = 2,
Charging = 3,
}
DeviceFamily :: enum i32 {
Virtual = -1,
Aggregate = 0,
XboxOne = 1,
Xbox360 = 2,
Hid = 3,
I8042 = 4,
}
DeviceCapabilities :: distinct bit_set[DeviceCapabilitiesFlag; u32]
DeviceCapabilitiesFlag :: enum u32 {
Audio = 0,
PluginModule = 1,
PowerOff = 2,
Synchronization = 3,
Wireless = 4,
}
DeviceCapabilityNone :: DeviceCapabilities{}
RawDeviceReportKind :: enum i32 {
InputReport = 0,
OutputReport = 1,
FeatureReport = 2,
}
RawDeviceReportItemFlags :: distinct bit_set[RawDeviceReportItemFlag; u32]
RawDeviceReportItemFlag :: enum u32 {
ConstantItem = 0,
ArrayItem = 1,
RelativeItem = 2,
WraparoundItem = 3,
NonlinearItem = 4,
StableItem = 5,
NullableItem = 6,
VolatileItem = 7,
BufferedItem = 8,
}
RawDeviceDefaultItem :: RawDeviceReportItemFlags{}
RawDeviceItemCollectionKind :: enum i32 {
UnknownItemCollection = -1,
PhysicalItemCollection = 0,
ApplicationItemCollection = 1,
LogicalItemCollection = 2,
ReportItemCollection = 3,
NamedArrayItemCollection = 4,
UsageSwitchItemCollection = 5,
UsageModifierItemCollection = 6,
}
RawDevicePhysicalUnitKind :: enum i32 {
Unknown = -1,
None = 0,
Time = 1,
Frequency = 2,
Length = 3,
Velocity = 4,
Acceleration = 5,
Mass = 6,
Momentum = 7,
Force = 8,
Pressure = 9,
Angle = 10,
AngularVelocity = 11,
AngularAcceleration = 12,
AngularMass = 13,
AngularMomentum = 14,
AngularTorque = 15,
ElectricCurrent = 16,
ElectricCharge = 17,
ElectricPotential = 18,
Energy = 19,
Power = 20,
Temperature = 21,
LuminousIntensity = 22,
LuminousFlux = 23,
Illuminance = 24,
}
Label :: enum i32 {
Unknown = -1,
None = 0,
XboxGuide = 1,
XboxBack = 2,
XboxStart = 3,
XboxMenu = 4,
XboxView = 5,
XboxA = 7,
XboxB = 8,
XboxX = 9,
XboxY = 10,
XboxDPadUp = 11,
XboxDPadDown = 12,
XboxDPadLeft = 13,
XboxDPadRight = 14,
XboxLeftShoulder = 15,
XboxLeftTrigger = 16,
XboxLeftStickButton = 17,
XboxRightShoulder = 18,
XboxRightTrigger = 19,
XboxRightStickButton = 20,
XboxPaddle1 = 21,
XboxPaddle2 = 22,
XboxPaddle3 = 23,
XboxPaddle4 = 24,
LetterA = 25,
LetterB = 26,
LetterC = 27,
LetterD = 28,
LetterE = 29,
LetterF = 30,
LetterG = 31,
LetterH = 32,
LetterI = 33,
LetterJ = 34,
LetterK = 35,
LetterL = 36,
LetterM = 37,
LetterN = 38,
LetterO = 39,
LetterP = 40,
LetterQ = 41,
LetterR = 42,
LetterS = 43,
LetterT = 44,
LetterU = 45,
LetterV = 46,
LetterW = 47,
LetterX = 48,
LetterY = 49,
LetterZ = 50,
Number0 = 51,
Number1 = 52,
Number2 = 53,
Number3 = 54,
Number4 = 55,
Number5 = 56,
Number6 = 57,
Number7 = 58,
Number8 = 59,
Number9 = 60,
ArrowUp = 61,
ArrowUpRight = 62,
ArrowRight = 63,
ArrowDownRight = 64,
ArrowDown = 65,
ArrowDownLLeft = 66,
ArrowLeft = 67,
ArrowUpLeft = 68,
ArrowUpDown = 69,
ArrowLeftRight = 70,
ArrowUpDownLeftRight = 71,
ArrowClockwise = 72,
ArrowCounterClockwise = 73,
ArrowReturn = 74,
IconBranding = 75,
IconHome = 76,
IconMenu = 77,
IconCross = 78,
IconCircle = 79,
IconSquare = 80,
IconTriangle = 81,
IconStar = 82,
IconDPadUp = 83,
IconDPadDown = 84,
IconDPadLeft = 85,
IconDPadRight = 86,
IconDialClockwise = 87,
IconDialCounterClockwise = 88,
IconSliderLeftRight = 89,
IconSliderUpDown = 90,
IconWheelUpDown = 91,
IconPlus = 92,
IconMinus = 93,
IconSuspension = 94,
Home = 95,
Guide = 96,
Mode = 97,
Select = 98,
Menu = 99,
View = 100,
Back = 101,
Start = 102,
Options = 103,
Share = 104,
Up = 105,
Down = 106,
Left = 107,
Right = 108,
LB = 109,
LT = 110,
LSB = 111,
L1 = 112,
L2 = 113,
L3 = 114,
RB = 115,
RT = 116,
RSB = 117,
R1 = 118,
R2 = 119,
R3 = 120,
P1 = 121,
P2 = 122,
P3 = 123,
P4 = 124,
}
Location :: enum i32 {
Unknown = -1,
Chassis = 0,
Display = 1,
Axis = 2,
Button = 3,
Switch = 4,
Key = 5,
TouchPad = 6,
}
FeedbackAxes :: distinct bit_set[FeedbackAxesFlag; u32]
FeedbackAxesFlag :: enum u32 {
LinearX = 0,
LinearY = 1,
LinearZ = 2,
AngularX = 3,
AngularY = 4,
AngularZ = 5,
Normal = 6,
}
FeedbackAxisNone :: FeedbackAxes{}
FeedbackEffectState :: enum i32 {
Stopped = 0,
Running = 1,
Paused = 2,
}
ForceFeedbackEffectKind :: enum i32 {
Constant = 0,
Ramp = 1,
SineWave = 2,
SquareWave = 3,
TriangleWave = 4,
SawtoothUpWave = 5,
SawtoothDownWave = 6,
Spring = 7,
Friction = 8,
Damper = 9,
Inertia = 10,
}
RumbleMotors :: distinct bit_set[RumbleMotorsFlag; u32]
RumbleMotorsFlag :: enum u32 {
LowFrequency = 0,
HighFrequency = 1,
LeftTrigger = 2,
RightTrigger = 3,
}
RumbleNone :: RumbleMotors{}
CallbackToken :: distinct u64
CURRENT_CALLBACK_TOKEN_VALUE :: CallbackToken(0xFFFFFFFFFFFFFFFF)
INVALID_CALLBACK_TOKEN_VALUE :: CallbackToken(0x0000000000000000)
ReadingCallback :: #type proc "stdcall" (callbackToken: CallbackToken, ctx: rawptr, reading: ^IGameInputReading, hasOverrunOccured: bool)
DeviceCallback :: #type proc "stdcall" (callbackToken: CallbackToken, ctx: rawptr, device: ^IGameInputDevice, timestamp: u64, currentStatus: DeviceStatus, previousStatus: DeviceStatus)
SystemButtonCallback :: #type proc "stdcall" (callbackToken: CallbackToken, ctx: rawptr, device: ^IGameInputDevice, timestamp: u64, currentButtons: SystemButtons, previousButtons: SystemButtons)
KeyboardLayoutCallback :: #type proc "stdcall" (callbackToken: CallbackToken, ctx: rawptr, device: ^IGameInputDevice, timestamp: u64, currentLayout: u32, previousLayout: u32)
KeyState :: struct {
scanCode: u32,
codePoint: u32,
virtualKey: u8,
isDeadKey: bool,
}
MouseState :: struct {
buttons: MouseButtons,
positionX: i64,
positionY: i64,
wheelX: i64,
wheelY: i64,
}
TouchState :: struct {
touchId: u64,
sensorIndex: u32,
positionX: f32,
positionY: f32,
pressure: f32,
proximity: f32,
contactRectTop: f32,
contactRectLeft: f32,
contactRectRight: f32,
contactRectBottom: f32,
}
MotionState :: struct {
accelerationX: f32,
accelerationY: f32,
accelerationZ: f32,
angularVelocityX: f32,
angularVelocityY: f32,
angularVelocityZ: f32,
magneticFieldX: f32,
magneticFieldY: f32,
magneticFieldZ: f32,
orientationW: f32,
orientationX: f32,
orientationY: f32,
orientationZ: f32,
accelerometerAccuracy: MotionAccuracy,
gyroscopeAccuracy: MotionAccuracy,
magnetometerAccuracy: MotionAccuracy,
orientationAccuracy: MotionAccuracy,
}
ArcadeStickState :: struct {
buttons: ArcadeStickButtons,
}
FlightStickState :: struct {
buttons: FlightStickButtons,
hatSwitch: SwitchPosition,
roll: f32,
pitch: f32,
yaw: f32,
throttle: f32,
}
GamepadState :: struct {
buttons: GamepadButtons,
leftTrigger: f32,
rightTrigger: f32,
leftThumbstickX: f32,
leftThumbstickY: f32,
rightThumbstickX: f32,
rightThumbstickY: f32,
}
RacingWheelState :: struct {
buttons: RacingWheelButtons,
patternShifterGear: i32,
wheel: f32,
throttle: f32,
brake: f32,
clutch: f32,
handbrake: f32,
}
UiNavigationState :: struct {
buttons: UiNavigationButtons,
}
BatteryState :: struct {
chargeRate: f32,
maxChargeRate: f32,
remainingCapacity: f32,
fullChargeCapacity: f32,
status: BatteryStatus,
}
String :: struct {
sizeInBytes: u32,
codePointCount: u32,
data: [^]byte,
}
Usage :: struct {
page: u16,
id: u16,
}
Version :: struct {
major: u16,
minor: u16,
build: u16,
revision: u16,
}
RawDeviceItemCollectionInfo :: struct {
kind: RawDeviceItemCollectionKind,
childCount: u32,
siblingCount: u32,
usageCount: u32,
usages: [^]Usage `fmt:"v,usageCount"`,
parent: ^RawDeviceItemCollectionInfo,
firstSibling: ^RawDeviceItemCollectionInfo,
previousSibling: ^RawDeviceItemCollectionInfo,
nextSibling: ^RawDeviceItemCollectionInfo,
lastSibling: ^RawDeviceItemCollectionInfo,
firstChild: ^RawDeviceItemCollectionInfo,
lastChild: ^RawDeviceItemCollectionInfo,
}
RawDeviceReportItemInfo :: struct {
bitOffset: u32,
bitSize: u32,
logicalMin: i64,
logicalMax: i64,
physicalMin: f64,
physicalMax: f64,
physicalUnits: RawDevicePhysicalUnitKind,
rawPhysicalUnits: u32,
rawPhysicalUnitsExponent: i32,
flags: RawDeviceReportItemFlags,
usageCount: u32,
usages: [^]Usage `fmt:"v,usageCount"`,
collection: ^RawDeviceItemCollectionInfo,
itemString: ^String,
}
RawDeviceReportInfo :: struct {
kind: RawDeviceReportKind,
id: u32,
size: u32,
itemCount: u32,
items: [^]RawDeviceReportItemInfo `fmt:"v,itemCount"`,
}
ControllerAxisInfo :: struct {
mappedInputKinds: Kind,
label: Label,
isContinuous: bool,
isNonlinear: bool,
isQuantized: bool,
hasRestValue: bool,
restValue: f32,
resolution: u64,
legacyDInputIndex: u16,
legacyHidIndex: u16,
rawReportIndex: u32,
inputReport: ^RawDeviceReportInfo,
inputReportItem: ^RawDeviceReportItemInfo,
}
ControllerButtonInfo :: struct {
mappedInputKinds: Kind,
label: Label,
legacyDInputIndex: u16,
legacyHidIndex: u16,
rawReportIndex: u32,
inputReport: ^RawDeviceReportInfo,
inputReportItem: ^RawDeviceReportItemInfo,
}
ControllerSwitchInfo :: struct {
mappedInputKinds: Kind,
label: Label,
positionLabels: [9]Label,
kind: SwitchKind,
legacyDInputIndex: u16,
legacyHidIndex: u16,
rawReportIndex: u32,
inputReport: ^RawDeviceReportInfo,
inputReportItem: ^RawDeviceReportItemInfo,
}
KeyboardInfo :: struct {
kind: KeyboardKind,
layout: u32,
keyCount: u32,
functionKeyCount: u32,
maxSimultaneousKeys: u32,
platformType: u32,
platformSubtype: u32,
nativeLanguage: ^String,
}
MouseInfo :: struct {
supportedButtons: MouseButtons,
sampleRate: u32,
sensorDpi: u32,
hasWheelX: bool,
hasWheelY: bool,
}
TouchSensorInfo :: struct {
mappedInputKinds: Kind,
label: Label,
location: Location,
locationId: u32,
resolutionX: u64,
resolutionY: u64,
shape: TouchShape,
aspectRatio: f32,
orientation: f32,
physicalWidth: f32,
physicalHeight: f32,
maxPressure: f32,
maxProximity: f32,
maxTouchPoints: u32,
}
MotionInfo :: struct {
maxAcceleration: f32,
maxAngularVelocity: f32,
maxMagneticFieldStrength: f32,
}
ArcadeStickInfo :: struct {
menuButtonLabel: Label,
viewButtonLabel: Label,
stickUpLabel: Label,
stickDownLabel: Label,
stickLeftLabel: Label,
stickRightLabel: Label,
actionButton1Label: Label,
actionButton2Label: Label,
actionButton3Label: Label,
actionButton4Label: Label,
actionButton5Label: Label,
actionButton6Label: Label,
specialButton1Label: Label,
specialButton2Label: Label,
}
FlightStickInfo :: struct {
menuButtonLabel: Label,
viewButtonLabel: Label,
firePrimaryButtonLabel: Label,
fireSecondaryButtonLabel: Label,
hatSwitchKind: SwitchKind,
}
GamepadInfo :: struct {
menuButtonLabel: Label,
viewButtonLabel: Label,
aButtonLabel: Label,
bButtonLabel: Label,
xButtonLabel: Label,
yButtonLabel: Label,
dpadUpLabel: Label,
dpadDownLabel: Label,
dpadLeftLabel: Label,
dpadRightLabel: Label,
leftShoulderButtonLabel: Label,
rightShoulderButtonLabel: Label,
leftThumbstickButtonLabel: Label,
rightThumbstickButtonLabel: Label,
}
RacingWheelInfo :: struct {
menuButtonLabel: Label,
viewButtonLabel: Label,
previousGearButtonLabel: Label,
nextGearButtonLabel: Label,
dpadUpLabel: Label,
dpadDownLabel: Label,
dpadLeftLabel: Label,
dpadRightLabel: Label,
hasClutch: bool,
hasHandbrake: bool,
hasPatternShifter: bool,
minPatternShifterGear: i32,
maxPatternShifterGear: i32,
maxWheelAngle: f32,
}
UiNavigationInfo :: struct {
menuButtonLabel: Label,
viewButtonLabel: Label,
acceptButtonLabel: Label,
cancelButtonLabel: Label,
upButtonLabel: Label,
downButtonLabel: Label,
leftButtonLabel: Label,
rightButtonLabel: Label,
contextButton1Label: Label,
contextButton2Label: Label,
contextButton3Label: Label,
contextButton4Label: Label,
pageUpButtonLabel: Label,
pageDownButtonLabel: Label,
pageLeftButtonLabel: Label,
pageRightButtonLabel: Label,
scrollUpButtonLabel: Label,
scrollDownButtonLabel: Label,
scrollLeftButtonLabel: Label,
scrollRightButtonLabel: Label,
guideButtonLabel: Label,
}
ForceFeedbackMotorInfo :: struct {
supportedAxes: FeedbackAxes,
location: Location,
locationId: u32,
maxSimultaneousEffects: u32,
isConstantEffectSupported: bool,
isRampEffectSupported: bool,
isSineWaveEffectSupported: bool,
isSquareWaveEffectSupported: bool,
isTriangleWaveEffectSupported: bool,
isSawtoothUpWaveEffectSupported: bool,
isSawtoothDownWaveEffectSupported: bool,
isSpringEffectSupported: bool,
isFrictionEffectSupported: bool,
isDamperEffectSupported: bool,
isInertiaEffectSupported: bool,
}
HapticWaveformInfo :: struct {
usage: Usage,
isDurationSupported: bool,
isIntensitySupported: bool,
isRepeatSupported: bool,
isRepeatDelaySupported: bool,
defaultDuration: u64,
}
HapticFeedbackMotorInfo :: struct {
mappedRumbleMotor: RumbleMotors,
location: Location,
locationId: u32,
waveformCount: u32,
waveformInfo: [^]HapticWaveformInfo `fmt:"v,waveformCount"`,
}
DeviceInfo :: struct {
infoSize: u32,
vendorId: u16,
productId: u16,
revisionNumber: u16,
interfaceNumber: u8,
collectionNumber: u8,
usage: Usage,
hardwareVersion: Version,
firmwareVersion: Version,
deviceId: APP_LOCAL_DEVICE_ID,
deviceRootId: APP_LOCAL_DEVICE_ID,
deviceFamily: DeviceFamily,
capabilities: DeviceCapabilities,
supportedInput: Kind,
supportedRumbleMotors: RumbleMotors,
inputReportCount: u32,
outputReportCount: u32,
featureReportCount: u32,
controllerAxisCount: u32,
controllerButtonCount: u32,
controllerSwitchCount: u32,
touchPointCount: u32,
touchSensorCount: u32,
forceFeedbackMotorCount: u32,
hapticFeedbackMotorCount: u32,
deviceStringCount: u32,
deviceDescriptorSize: u32,
inputReportInfo: [^]RawDeviceReportInfo `fmt:"v,inputReportCount"`,
outputReportInfo: [^]RawDeviceReportInfo `fmt:"v,outputReportCount"`,
featureReportInfo: [^]RawDeviceReportInfo `fmt:"v,featureReportCount"`,
controllerAxisInfo: [^]ControllerAxisInfo `fmt:"v,controllerAxisCount"`,
controllerButtonInfo: [^]ControllerButtonInfo `fmt:"v,controllerButtonCount"`,
controllerSwitchInfo: [^]ControllerSwitchInfo `fmt:"v,controllerSwitchCount"`,
keyboardInfo: ^KeyboardInfo,
mouseInfo: ^MouseInfo,
touchSensorInfo: [^]TouchSensorInfo `fmt:"v,touchSensorCount"`,
motionInfo: ^MotionInfo,
arcadeStickInfo: ^ArcadeStickInfo,
flightStickInfo: ^FlightStickInfo,
gamepadInfo: ^GamepadInfo,
racingWheelInfo: ^RacingWheelInfo,
uiNavigationInfo: ^UiNavigationInfo,
forceFeedbackMotorInfo: [^]ForceFeedbackMotorInfo `fmt:"v,forceFeedbackMotorCount"`,
hapticFeedbackMotorInfo: [^]HapticFeedbackMotorInfo `fmt:"v,hapticFeedbackMotorCount"`,
displayName: ^String,
deviceStrings: [^]String `fmt:"v,deviceStringCount"`,
deviceDescriptorData: rawptr,
}
ForceFeedbackEnvelope :: struct {
attackDuration: u64,
sustainDuration: u64,
releaseDuration: u64,
attackGain: f32,
sustainGain: f32,
releaseGain: f32,
playCount: u32,
repeatDelay: u64,
}
ForceFeedbackMagnitude :: struct {
linearX: f32,
linearY: f32,
linearZ: f32,
angularX: f32,
angularY: f32,
angularZ: f32,
normal: f32,
}
ForceFeedbackConditionParams :: struct {
magnitude: ForceFeedbackMagnitude,
positiveCoefficient: f32,
negativeCoefficient: f32,
maxPositiveMagnitude: f32,
maxNegativeMagnitude: f32,
deadZone: f32,
bias: f32,
}
ForceFeedbackConstantParams :: struct {
envelope: ForceFeedbackEnvelope,
magnitude: ForceFeedbackMagnitude,
}
ForceFeedbackPeriodicParams :: struct {
envelope: ForceFeedbackEnvelope,
magnitude: ForceFeedbackMagnitude,
frequency: f32,
phase: f32,
bias: f32,
}
ForceFeedbackRampParams :: struct {
envelope: ForceFeedbackEnvelope,
startMagnitude: ForceFeedbackMagnitude,
endMagnitude: ForceFeedbackMagnitude,
}
ForceFeedbackParams :: struct {
kind: ForceFeedbackEffectKind,
using data: struct #raw_union {
constant: ForceFeedbackConstantParams,
ramp: ForceFeedbackRampParams,
sineWave: ForceFeedbackPeriodicParams,
squareWave: ForceFeedbackPeriodicParams,
triangleWave: ForceFeedbackPeriodicParams,
sawtoothUpWave: ForceFeedbackPeriodicParams,
sawtoothDownWave: ForceFeedbackPeriodicParams,
spring: ForceFeedbackConditionParams,
friction: ForceFeedbackConditionParams,
damper: ForceFeedbackConditionParams,
inertia: ForceFeedbackConditionParams,
},
}
HapticFeedbackParams :: struct {
waveformIndex: u32,
duration: u64,
intensity: f32,
playCount: u32,
repeatDelay: u64,
}
RumbleParams :: struct {
lowFrequency: f32,
highFrequency: f32,
leftTrigger: f32,
rightTrigger: f32,
}
IGameInput_UUID_STRING :: "11BE2A7E-4254-445A-9C09-FFC40F006918"
IGameInput_UUID := &IID{0x11BE2A7E, 0x4254, 0x445A, {0x9C, 0x09, 0xFF, 0xC4, 0x0F, 0x00, 0x69, 0x18}}
IGameInput :: struct #raw_union {
#subtype iunknown: IUnknown,
using igameinput_vtable: ^IGameInput_VTable,
}
IGameInput_VTable :: struct {
using iunknown_vtable: IUnknown_VTable,
GetCurrentTimestamp: proc "system" (this: ^IGameInput) -> u64,
GetCurrentReading: proc "system" (this: ^IGameInput, inputKind: Kind, device: ^IGameInputDevice, reading: ^^IGameInputReading) -> HRESULT,
GetNextReading: proc "system" (this: ^IGameInput, referenceReading: ^IGameInputReading, inputKind: Kind, device: ^IGameInputDevice, reading: ^^IGameInputReading) -> HRESULT,
GetPreviousReading: proc "system" (this: ^IGameInput, referenceReading: ^IGameInputReading, inputKind: Kind, device: ^IGameInputDevice, reading: ^^IGameInputReading) -> HRESULT,
GetTemporalReading: proc "system" (this: ^IGameInput, timestamp: u64, device: ^IGameInputDevice, reading: ^^IGameInputReading) -> HRESULT,
RegisterReadingCallback: proc "system" (this: ^IGameInput, device: ^IGameInputDevice, inputKind: Kind, analogThreshold: f32, ctx: rawptr, callbackFunc: ReadingCallback, callbackToken: ^CallbackToken) -> HRESULT,
RegisterDeviceCallback: proc "system" (this: ^IGameInput, device: ^IGameInputDevice, inputKind: Kind, statusFilter: DeviceStatus, enumerationKind: EnumerationKind, ctx: rawptr, callbackFunc: DeviceCallback, callbackToken: ^CallbackToken) -> HRESULT,
RegisterSystemButtonCallback: proc "system" (this: ^IGameInput, device: ^IGameInputDevice, buttonFilter: SystemButtons, ctx: rawptr, callbackFunc: SystemButtonCallback, callbackToken: ^CallbackToken) -> HRESULT,
RegisterKeyboardLayoutCallback: proc "system" (this: ^IGameInput, device: ^IGameInputDevice, ctx: rawptr, callbackFunc: KeyboardLayoutCallback, callbackToken: ^CallbackToken) -> HRESULT,
StopCallback: proc "system" (this: ^IGameInput, callbackToken: CallbackToken),
UnregisterCallback: proc "system" (this: ^IGameInput, callbackToken: CallbackToken, timeoutInMicroseconds: u64) -> bool,
CreateDispatcher: proc "system" (this: ^IGameInput, dispatcher: ^^IGameInputDispatcher) -> HRESULT,
CreateAggregateDevice: proc "system" (this: ^IGameInput, kind: Kind, device: ^^IGameInputDevice) -> HRESULT,
FindDeviceFromId: proc "system" (this: ^IGameInput, value: ^APP_LOCAL_DEVICE_ID, device: ^^IGameInputDevice) -> HRESULT,
FindDeviceFromObject: proc "system" (this: ^IGameInput, value: ^IUnknown, device: ^^IGameInputDevice) -> HRESULT,
FindDeviceFromPlatformHandle: proc "system" (this: ^IGameInput, value: HANDLE, device: ^^IGameInputDevice) -> HRESULT,
FindDeviceFromPlatformString: proc "system" (this: ^IGameInput, value: win.LPCWSTR, device: ^^IGameInputDevice) -> HRESULT,
EnableOemDeviceSupport: proc "system" (this: ^IGameInput, vendorId: u16, productId: u16, interfaceNumber: u8, collectionNumber: u8) -> HRESULT,
SetFocusPolicy: proc "system" (this: ^IGameInput, policy: FocusPolicy),
}
IGameInputReading_UUID_STRING :: "2156947A-E1FA-4DE0-A30B-D812931DBD8D"
IGameInputReading_UUID := &IID{0x2156947A, 0xE1FA, 0x4DE0, {0xA3, 0x0B, 0xD8, 0x12, 0x93, 0x1D, 0x0BD, 0x8D}}
IGameInputReading :: struct #raw_union {
#subtype iunknown: IUnknown,
using igameinputreading_vtable: ^IGameInputReading_VTable,
}
IGameInputReading_VTable :: struct {
using iunknown_vtable: IUnknown_VTable,
GetInputKind: proc "system" (this: ^IGameInputReading) -> Kind,
GetSequenceNumber: proc "system" (this: ^IGameInputReading, inputKind: Kind) -> u64,
GetTimestamp: proc "system" (this: ^IGameInputReading) -> u64,
GetDevice: proc "system" (this: ^IGameInputReading, device: ^^IGameInputDevice),
GetRawReport: proc "system" (this: ^IGameInputReading, report: ^^IGameInputRawDeviceReport) -> bool,
GetControllerAxisCount: proc "system" (this: ^IGameInputReading) -> u32,
GetControllerAxisState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]f32) -> u32,
GetControllerButtonCount: proc "system" (this: ^IGameInputReading) -> u32,
GetControllerButtonState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]bool) -> u32,
GetControllerSwitchCount: proc "system" (this: ^IGameInputReading) -> u32,
GetControllerSwitchState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]SwitchPosition) -> u32,
GetKeyCount: proc "system" (this: ^IGameInputReading) -> u32,
GetKeyState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]KeyState) -> u32,
GetMouseState: proc "system" (this: ^IGameInputReading, state: ^MouseState) -> bool,
GetTouchCount: proc "system" (this: ^IGameInputReading) -> u32,
GetTouchState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]TouchState) -> u32,
GetMotionState: proc "system" (this: ^IGameInputReading, state: ^MotionState) -> bool,
GetArcadeStickState: proc "system" (this: ^IGameInputReading, state: ^ArcadeStickState) -> bool,
GetFlightStickState: proc "system" (this: ^IGameInputReading, state: ^FlightStickState) -> bool,
GetGamepadState: proc "system" (this: ^IGameInputReading, state: ^GamepadState) -> bool,
GetRacingWheelState: proc "system" (this: ^IGameInputReading, state: ^RacingWheelState) -> bool,
GetUiNavigationState: proc "system" (this: ^IGameInputReading, state: ^UiNavigationState) -> bool,
}
IGameInputDevice_UUID_STRING :: "31DD86FB-4C1B-408A-868F-439B3CD47125"
IGameInputDevice_UUID := &IID{0x31DD86FB, 0x4C1B, 0x408A, {0x86, 0x8F, 0x43, 0x9B, 0x3C, 0xD4, 0x71, 0x25}}
IGameInputDevice :: struct #raw_union {
#subtype iunknown: IUnknown,
using igameinputdevice_vtable: ^IGameInputDevice_Vtable,
}
IGameInputDevice_Vtable :: struct {
using iunknown_vtable: IUnknown_VTable,
GetDeviceInfo: proc "system" (this: ^IGameInputDevice) -> ^DeviceInfo,
GetDeviceStatus: proc "system" (this: ^IGameInputDevice) -> DeviceStatus,
GetBatteryState: proc "system" (this: ^IGameInputDevice, state: ^BatteryState),
CreateForceFeedbackEffect: proc "system" (this: ^IGameInputDevice, motorIndex: u32, params: ^ForceFeedbackParams, effect: ^^IGameInputForceFeedbackEffect) -> HRESULT,
IsForceFeedbackMotorPoweredOn: proc "system" (this: ^IGameInputDevice, motorIndex: u32) -> bool,
SetForceFeedbackMotorGain: proc "system" (this: ^IGameInputDevice, motorIndex: u32, masterGain: f32),
SetHapticMotorState: proc "system" (this: ^IGameInputDevice, motorIndex: u32, params: ^HapticFeedbackParams) -> HRESULT,
SetRumbleState: proc "system" (this: ^IGameInputDevice, params: ^RumbleParams),
SetInputSynchronizationState: proc "system" (this: ^IGameInputDevice, enabled: bool),
SendInputSynchronizationHint: proc "system" (this: ^IGameInputDevice),
PowerOff: proc "system" (this: ^IGameInputDevice),
CreateRawDeviceReport: proc "system" (this: ^IGameInputDevice, reportId: u32, reportKind: RawDeviceReportKind, report: ^^IGameInputRawDeviceReport) -> HRESULT,
GetRawDeviceFeature: proc "system" (this: ^IGameInputDevice, reportId: u32, report: ^^IGameInputRawDeviceReport) -> HRESULT,
SetRawDeviceFeature: proc "system" (this: ^IGameInputDevice, report: ^IGameInputRawDeviceReport) -> HRESULT,
SendRawDeviceOutput: proc "system" (this: ^IGameInputDevice, report: ^IGameInputRawDeviceReport) -> HRESULT,
SendRawDeviceOutputWithResponse: proc "system" (this: ^IGameInputDevice, requestReport: ^IGameInputRawDeviceReport, responseReport: ^^IGameInputRawDeviceReport) -> HRESULT,
ExecuteRawDeviceIoControl: proc "system" (this: ^IGameInputDevice, controlCode: u32, inputBufferSize: win.SIZE_T, inputBuffer: rawptr, outputBufferSize: win.SIZE_T, outputBuffer: rawptr, outputSize: ^win.SIZE_T) -> HRESULT,
AcquireExclusiveRawDeviceAccess: proc "system" (this: ^IGameInputDevice, timeoutInMicroseconds: u64) -> bool,
ReleaseExclusiveRawDeviceAccess: proc "system" (this: ^IGameInputDevice),
}
IGameInputDispatcher_UUID_STRING :: "415EED2E-98CB-42C2-8F28-B94601074E31"
IGameInputDispatcher_UUID := &IID{0x415EED2E, 0x98CB, 0x42C2, {0x8F, 0x28, 0xB9, 0x46, 0x01, 0x07, 0x4E, 0x31}}
IGameInputDispatcher :: struct #raw_union {
#subtype iunknown: IUnknown,
using igameinputdispatcher_vtable: ^IGameInputDispatcher_Vtable,
}
IGameInputDispatcher_Vtable :: struct {
using iunknown_vtable: IUnknown_VTable,
Dispatch: proc "system" (this: ^IGameInputDispatcher, quotaInMicroseconds: u64) -> bool,
OpenWaitHandle: proc "system" (this: ^IGameInputDispatcher, waitHandle: ^HANDLE) -> HRESULT,
}
IGameInputForceFeedbackEffect_UUID_STRING :: "51BDA05E-F742-45D9-B085-9444AE48381D"
IGameInputForceFeedbackEffect_UUID := &IID{0x51BDA05E, 0xF742, 0x45D9, {0xB0, 0x85, 0x94, 0x44, 0xAE, 0x48, 0x38, 0x1D}}
IGameInputForceFeedbackEffect :: struct #raw_union {
#subtype iunknown: IUnknown,
using igameinputforcefeedbackeffect_vtable: ^IGameInputForceFeedbackEffect_Vtable,
}
IGameInputForceFeedbackEffect_Vtable :: struct {
using iunknown_vtable: IUnknown_VTable,
GetDevice: proc "system" (this: ^IGameInputForceFeedbackEffect, device: ^^IGameInputDevice),
GetMotorIndex: proc "system" (this: ^IGameInputForceFeedbackEffect) -> u32,
GetGain: proc "system" (this: ^IGameInputForceFeedbackEffect) -> f32,
SetGain: proc "system" (this: ^IGameInputForceFeedbackEffect, gain: f32),
GetParams: proc "system" (this: ^IGameInputForceFeedbackEffect, params: ^ForceFeedbackParams),
SetParams: proc "system" (this: ^IGameInputForceFeedbackEffect, params: ^ForceFeedbackParams) -> bool,
GetState: proc "system" (this: ^IGameInputForceFeedbackEffect) -> FeedbackEffectState,
SetState: proc "system" (this: ^IGameInputForceFeedbackEffect, state: FeedbackEffectState),
}
IGameInputRawDeviceReport_UUID_STRING :: "61F08CF1-1FFC-40CA-A2B8-E1AB8BC5B6DC"
IGameInputRawDeviceReport_UUID := &IID{0x61F08CF1, 0x1FFC, 0x40CA, {0xA2, 0xB8, 0xE1, 0xAB, 0x8B, 0xC5, 0xB6, 0xDC}}
IGameInputRawDeviceReport :: struct #raw_union {
#subtype iunknown: IUnknown,
using igameinputrawdevicereport_vtable: ^IGameInputRawDeviceReport_Vtable,
}
IGameInputRawDeviceReport_Vtable :: struct {
using iunknown_vtable: IUnknown_VTable,
GetDevice: proc "system" (this: ^IGameInputRawDeviceReport, device: ^^IGameInputDevice),
GetReportInfo: proc "system" (this: ^IGameInputRawDeviceReport) -> ^RawDeviceReportInfo,
GetRawDataSize: proc "system" (this: ^IGameInputRawDeviceReport) -> win.SIZE_T,
GetRawData: proc "system" (this: ^IGameInputRawDeviceReport, bufferSize: win.SIZE_T, buffer: rawptr) -> win.SIZE_T,
SetRawData: proc "system" (this: ^IGameInputRawDeviceReport, bufferSize: win.SIZE_T, buffer: rawptr) -> bool,
GetItemValue: proc "system" (this: ^IGameInputRawDeviceReport, itemIndex: u32, value: ^u64) -> bool,
SetItemValue: proc "system" (this: ^IGameInputRawDeviceReport, itemIndex: u32, value: u64) -> bool,
ResetItemValue: proc "system" (this: ^IGameInputRawDeviceReport, itemIndex: u32) -> bool,
ResetAllItems: proc "system" (this: ^IGameInputRawDeviceReport) -> bool,
}
@(default_calling_convention="system", link_prefix="GameInput")
foreign wgi {
Create :: proc(gameInput: ^^IGameInput) -> HRESULT ---
}
DEVICE_DISCONNECTED :: HRESULT(-0x7C75FFFF)
DEVICE_NOT_FOUND :: HRESULT(-0x7C75FFFE)
READING_NOT_FOUND :: HRESULT(-0x7C75FFFD)
REFERENCE_READING_TOO_OLD :: HRESULT(-0x7C75FFFC)
TIMESTAMP_OUT_OF_RANGE :: HRESULT(-0x7C75FFFB)
INSUFFICIENT_FORCE_FEEDBACK_RESOURCES :: HRESULT(-0x7C75FFFA)