Maps the Xbox controller API to Windows XInput. The original Xbox used XInputGetState with a slightly different structure layout than the XInput API on Windows. This layer translates between them.
| File | LOC | Purpose |
|---|---|---|
xinput_xbox.h |
189 | Public header — types, button constants, function prototypes |
xinput_device.c |
23 | Implementation (maps Xbox calls to Windows XInput) |
#include "xinput_xbox.h"
// Initialize input system
xbox_InputInit();
// Poll controller state (port 0-3)
XBOX_INPUT_STATE state;
if (xbox_InputGetState(0, &state) == 0) {
// Digital buttons
if (state.Gamepad.wButtons & XBOX_GAMEPAD_START)
pause_game();
// Analog buttons (0-255 pressure)
uint8_t trigger_r = state.Gamepad.bAnalogButtons[XBOX_BUTTON_RTRIGGER];
if (trigger_r > XBOX_ANALOG_BUTTON_THRESHOLD)
accelerate(trigger_r / 255.0f);
// Stick axes (-32768 to +32767)
float steer = state.Gamepad.sThumbLX / 32768.0f;
}
// Vibration feedback
XBOX_VIBRATION vib = { .wLeftMotorSpeed = 32000, .wRightMotorSpeed = 16000 };
xbox_InputSetState(0, &vib);// Initialize (call once at startup)
void xbox_InputInit(void);
// Poll controller state (returns 0 on success, non-zero if disconnected)
DWORD xbox_InputGetState(DWORD dwPort, XBOX_INPUT_STATE *pState);
// Set vibration motors
DWORD xbox_InputSetState(DWORD dwPort, const XBOX_VIBRATION *pVibration);
// Check if controller is connected
BOOL xbox_InputIsConnected(DWORD dwPort);
// Query controller capabilities
DWORD xbox_InputGetCapabilities(DWORD dwPort, DWORD dwFlags, XBOX_INPUT_CAPABILITIES *pCaps);typedef struct {
WORD wButtons; // Digital button bitmask
BYTE bAnalogButtons[8]; // Analog button pressure (0-255)
SHORT sThumbLX, sThumbLY; // Left stick (-32768 to +32767)
SHORT sThumbRX, sThumbRY; // Right stick
} XBOX_GAMEPAD;
typedef struct {
DWORD dwPacketNumber; // Increments on state change
XBOX_GAMEPAD Gamepad;
} XBOX_INPUT_STATE;
typedef struct {
WORD wLeftMotorSpeed; // 0-65535
WORD wRightMotorSpeed; // 0-65535
} XBOX_VIBRATION;XBOX_GAMEPAD_DPAD_UP 0x0001
XBOX_GAMEPAD_DPAD_DOWN 0x0002
XBOX_GAMEPAD_DPAD_LEFT 0x0004
XBOX_GAMEPAD_DPAD_RIGHT 0x0008
XBOX_GAMEPAD_START 0x0010
XBOX_GAMEPAD_BACK 0x0020
XBOX_GAMEPAD_LEFT_THUMB 0x0040 // Left stick click
XBOX_GAMEPAD_RIGHT_THUMB 0x0080 // Right stick clickThe original Xbox had pressure-sensitive face buttons (0-255):
XBOX_BUTTON_A 0 // Also used for "boost" in racing games
XBOX_BUTTON_B 1
XBOX_BUTTON_X 2
XBOX_BUTTON_Y 3
XBOX_BUTTON_BLACK 4 // No equivalent on modern controllers
XBOX_BUTTON_WHITE 5 // No equivalent on modern controllers
XBOX_BUTTON_LTRIGGER 6 // Left trigger
XBOX_BUTTON_RTRIGGER 7 // Right trigger
XBOX_ANALOG_BUTTON_THRESHOLD 30 // Recommended press threshold| Xbox Button | XInput Equivalent | Notes |
|---|---|---|
| A | A | Green button |
| B | B | Red button |
| X | X | Blue button |
| Y | Y | Yellow button |
| Black | Right Bumper | Mapped to RB |
| White | Left Bumper | Mapped to LB |
| L Trigger | Left Trigger | Analog 0-255 |
| R Trigger | Right Trigger | Analog 0-255 |
| Start | Start/Menu | |
| Back | Back/View | |
| D-pad | D-pad | Digital only |
| L Stick | L Stick | Click = L3 |
| R Stick | R Stick | Click = R3 |
#define XBOX_MAX_CONTROLLERS 4 // Ports 0-3The Xbox supports 4 controllers. Each port can have a controller with optional memory units and other accessories. This layer only handles the gamepad; memory unit emulation is not needed for recompiled games.