SDL  2.0
SDL_joystick.c File Reference
#include "../SDL_internal.h"
#include "SDL.h"
#include "SDL_atomic.h"
#include "SDL_events.h"
#include "SDL_sysjoystick.h"
#include "SDL_assert.h"
#include "SDL_hints.h"
#include "../events/SDL_events_c.h"
#include "../video/SDL_sysvideo.h"
#include "controller_type.h"
#include "../core/windows/SDL_windows.h"
#include <tlhelp32.h>
+ Include dependency graph for SDL_joystick.c:

Go to the source code of this file.

Functions

void SDL_LockJoysticks (void)
void SDL_UnlockJoysticks (void)
static void SDL_JoystickAllowBackgroundEventsChanged (void *userdata, const char *name, const char *oldValue, const char *hint)
int SDL_JoystickInit (void)
int SDL_NumJoysticks (void)
SDL_JoystickID SDL_GetNextJoystickInstanceID ()
SDL_bool SDL_GetDriverAndJoystickIndex (int device_index, SDL_JoystickDriver **driver, int *driver_index)
static const char * SDL_FixupJoystickName (const char *name)
const char * SDL_JoystickNameForIndex (int device_index)
int SDL_JoystickGetDevicePlayerIndex (int device_index)
static SDL_bool SDL_JoystickAxesCenteredAtZero (SDL_Joystick *joystick)
SDL_Joystick * SDL_JoystickOpen (int device_index)
int SDL_PrivateJoystickValid (SDL_Joystick *joystick)
int SDL_JoystickNumAxes (SDL_Joystick *joystick)
int SDL_JoystickNumHats (SDL_Joystick *joystick)
int SDL_JoystickNumBalls (SDL_Joystick *joystick)
int SDL_JoystickNumButtons (SDL_Joystick *joystick)
Sint16 SDL_JoystickGetAxis (SDL_Joystick *joystick, int axis)
SDL_bool SDL_JoystickGetAxisInitialState (SDL_Joystick *joystick, int axis, Sint16 *state)
Uint8 SDL_JoystickGetHat (SDL_Joystick *joystick, int hat)
int SDL_JoystickGetBall (SDL_Joystick *joystick, int ball, int *dx, int *dy)
Uint8 SDL_JoystickGetButton (SDL_Joystick *joystick, int button)
SDL_bool SDL_JoystickGetAttached (SDL_Joystick *joystick)
SDL_JoystickID SDL_JoystickInstanceID (SDL_Joystick *joystick)
SDL_Joystick * SDL_JoystickFromInstanceID (SDL_JoystickID joyid)
const char * SDL_JoystickName (SDL_Joystick *joystick)
int SDL_JoystickGetPlayerIndex (SDL_Joystick *joystick)
int SDL_JoystickRumble (SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms)
void SDL_JoystickClose (SDL_Joystick *joystick)
void SDL_JoystickQuit (void)
static SDL_bool SDL_PrivateJoystickShouldIgnoreEvent ()
void SDL_PrivateJoystickAdded (SDL_JoystickID device_instance)
static void UpdateEventsForDeviceRemoval ()
void SDL_PrivateJoystickRemoved (SDL_JoystickID device_instance)
int SDL_PrivateJoystickAxis (SDL_Joystick *joystick, Uint8 axis, Sint16 value)
int SDL_PrivateJoystickHat (SDL_Joystick *joystick, Uint8 hat, Uint8 value)
int SDL_PrivateJoystickBall (SDL_Joystick *joystick, Uint8 ball, Sint16 xrel, Sint16 yrel)
int SDL_PrivateJoystickButton (SDL_Joystick *joystick, Uint8 button, Uint8 state)
void SDL_JoystickUpdate (void)
int SDL_JoystickEventState (int state)
void SDL_GetJoystickGUIDInfo (SDL_JoystickGUID guid, Uint16 *vendor, Uint16 *product, Uint16 *version)
SDL_bool SDL_IsJoystickPS4 (Uint16 vendor, Uint16 product)
SDL_bool SDL_IsJoystickNintendoSwitchPro (Uint16 vendor, Uint16 product)
SDL_bool SDL_IsJoystickSteamController (Uint16 vendor, Uint16 product)
SDL_bool SDL_IsJoystickXbox360 (Uint16 vendor, Uint16 product)
SDL_bool SDL_IsJoystickXboxOne (Uint16 vendor, Uint16 product)
SDL_bool SDL_IsJoystickXInput (SDL_JoystickGUID guid)
SDL_bool SDL_IsJoystickHIDAPI (SDL_JoystickGUID guid)
static SDL_bool SDL_IsJoystickProductWheel (Uint32 vidpid)
static SDL_bool SDL_IsJoystickProductFlightStick (Uint32 vidpid)
static SDL_bool SDL_IsJoystickProductThrottle (Uint32 vidpid)
static SDL_JoystickType SDL_GetJoystickGUIDType (SDL_JoystickGUID guid)
static SDL_bool SDL_IsPS4RemapperRunning (void)
SDL_bool SDL_ShouldIgnoreJoystick (const char *name, SDL_JoystickGUID guid)
SDL_JoystickGUID SDL_JoystickGetDeviceGUID (int device_index)
Uint16 SDL_JoystickGetDeviceVendor (int device_index)
Uint16 SDL_JoystickGetDeviceProduct (int device_index)
Uint16 SDL_JoystickGetDeviceProductVersion (int device_index)
SDL_JoystickType SDL_JoystickGetDeviceType (int device_index)
SDL_JoystickID SDL_JoystickGetDeviceInstanceID (int device_index)
int SDL_JoystickGetDeviceIndexFromInstanceID (SDL_JoystickID instance_id)
SDL_JoystickGUID SDL_JoystickGetGUID (SDL_Joystick *joystick)
Uint16 SDL_JoystickGetVendor (SDL_Joystick *joystick)
Uint16 SDL_JoystickGetProduct (SDL_Joystick *joystick)
Uint16 SDL_JoystickGetProductVersion (SDL_Joystick *joystick)
SDL_JoystickType SDL_JoystickGetType (SDL_Joystick *joystick)
void SDL_JoystickGetGUIDString (SDL_JoystickGUID guid, char *pszGUID, int cbGUID)
static unsigned char nibble (char c)
SDL_JoystickGUID SDL_JoystickGetGUIDFromString (const char *pchGUID)
void SDL_PrivateJoystickBatteryLevel (SDL_Joystick *joystick, SDL_JoystickPowerLevel ePowerLevel)
SDL_JoystickPowerLevel SDL_JoystickCurrentPowerLevel (SDL_Joystick *joystick)

Variables

static SDL_JoystickDriverSDL_joystick_drivers []
static SDL_bool SDL_joystick_allows_background_events = SDL_FALSE
static SDL_Joystick * SDL_joysticks = NULL
static SDL_bool SDL_updating_joystick = SDL_FALSE
static SDL_mutexSDL_joystick_lock = NULL
static SDL_atomic_t SDL_next_joystick_instance_id

Function Documentation

static unsigned char nibble ( char  c)
static

Definition at line 1528 of file SDL_joystick.c.

Referenced by SDL_JoystickGetGUIDFromString().

{
if ((c >= '0') && (c <= '9')) {
return (unsigned char)(c - '0');
}
if ((c >= 'A') && (c <= 'F')) {
return (unsigned char)(c - 'A' + 0x0a);
}
if ((c >= 'a') && (c <= 'f')) {
return (unsigned char)(c - 'a' + 0x0a);
}
/* received an invalid character, and no real way to return an error */
/* AssertMsg1(false, "Q_nibble invalid hex character '%c' ", c); */
return 0;
}
static const char* SDL_FixupJoystickName ( const char *  name)
static

Definition at line 198 of file SDL_joystick.c.

References SDL_strlen, and SDL_strncmp.

Referenced by SDL_JoystickName(), and SDL_JoystickNameForIndex().

{
if (name) {
const char *skip_prefix = "NVIDIA Corporation ";
if (SDL_strncmp(name, skip_prefix, SDL_strlen(skip_prefix)) == 0) {
name += SDL_strlen(skip_prefix);
}
}
return name;
}
SDL_bool SDL_GetDriverAndJoystickIndex ( int  device_index,
SDL_JoystickDriver **  driver,
int *  driver_index 
)

Definition at line 173 of file SDL_joystick.c.

References SDL_JoystickDriver::GetCount, i, SDL_arraysize, SDL_FALSE, SDL_SetError, and SDL_TRUE.

Referenced by SDL_JoystickGetDeviceGUID(), SDL_JoystickGetDeviceInstanceID(), SDL_JoystickGetDevicePlayerIndex(), SDL_JoystickNameForIndex(), and SDL_JoystickOpen().

{
int i, num_joysticks, total_joysticks = 0;
if (device_index >= 0) {
for (i = 0; i < SDL_arraysize(SDL_joystick_drivers); ++i) {
num_joysticks = SDL_joystick_drivers[i]->GetCount();
if (device_index < num_joysticks) {
*driver = SDL_joystick_drivers[i];
*driver_index = device_index;
return SDL_TRUE;
}
device_index -= num_joysticks;
total_joysticks += num_joysticks;
}
}
SDL_SetError("There are %d joysticks available", total_joysticks);
return SDL_FALSE;
}
void SDL_GetJoystickGUIDInfo ( SDL_JoystickGUID  guid,
Uint16 vendor,
Uint16 product,
Uint16 version 
)

Definition at line 1113 of file SDL_joystick.c.

References SDL_JoystickGUID::data.

Referenced by SDL_GetJoystickGUIDType(), SDL_JoystickGetDeviceProduct(), SDL_JoystickGetDeviceProductVersion(), SDL_JoystickGetDeviceVendor(), SDL_JoystickGetProduct(), SDL_JoystickGetProductVersion(), SDL_JoystickGetVendor(), SDL_ShouldIgnoreGameController(), and SDL_ShouldIgnoreJoystick().

{
Uint16 *guid16 = (Uint16 *)guid.data;
/* If the GUID fits the form of BUS 0000 VENDOR 0000 PRODUCT 0000, return the data */
if (/* guid16[0] is device bus type */
guid16[1] == 0x0000 &&
/* guid16[2] is vendor ID */
guid16[3] == 0x0000 &&
/* guid16[4] is product ID */
guid16[5] == 0x0000
/* guid16[6] is product version */
) {
if (vendor) {
*vendor = guid16[2];
}
if (product) {
*product = guid16[4];
}
if (version) {
*version = guid16[6];
}
} else {
if (vendor) {
*vendor = 0;
}
if (product) {
*product = 0;
}
if (version) {
*version = 0;
}
}
}
static SDL_JoystickType SDL_GetJoystickGUIDType ( SDL_JoystickGUID  guid)
static

Definition at line 1256 of file SDL_joystick.c.

References SDL_JoystickGUID::data, GuessControllerType(), k_eControllerType_UnknownNonSteamController, MAKE_VIDPID, NULL, SDL_GetJoystickGUIDInfo(), SDL_IsJoystickProductFlightStick(), SDL_IsJoystickProductThrottle(), SDL_IsJoystickProductWheel(), SDL_IsJoystickXInput(), SDL_JOYSTICK_TYPE_ARCADE_PAD, SDL_JOYSTICK_TYPE_ARCADE_STICK, SDL_JOYSTICK_TYPE_DANCE_PAD, SDL_JOYSTICK_TYPE_DRUM_KIT, SDL_JOYSTICK_TYPE_FLIGHT_STICK, SDL_JOYSTICK_TYPE_GAMECONTROLLER, SDL_JOYSTICK_TYPE_GUITAR, SDL_JOYSTICK_TYPE_THROTTLE, SDL_JOYSTICK_TYPE_UNKNOWN, and SDL_JOYSTICK_TYPE_WHEEL.

Referenced by SDL_JoystickGetDeviceType(), and SDL_JoystickGetType().

{
Uint16 vendor;
Uint16 product;
Uint32 vidpid;
if (SDL_IsJoystickXInput(guid)) {
/* XInput GUID, get the type based on the XInput device subtype */
switch (guid.data[15]) {
case 0x01: /* XINPUT_DEVSUBTYPE_GAMEPAD */
case 0x02: /* XINPUT_DEVSUBTYPE_WHEEL */
case 0x03: /* XINPUT_DEVSUBTYPE_ARCADE_STICK */
case 0x04: /* XINPUT_DEVSUBTYPE_FLIGHT_STICK */
case 0x05: /* XINPUT_DEVSUBTYPE_DANCE_PAD */
case 0x06: /* XINPUT_DEVSUBTYPE_GUITAR */
case 0x07: /* XINPUT_DEVSUBTYPE_GUITAR_ALTERNATE */
case 0x0B: /* XINPUT_DEVSUBTYPE_GUITAR_BASS */
case 0x08: /* XINPUT_DEVSUBTYPE_DRUM_KIT */
case 0x13: /* XINPUT_DEVSUBTYPE_ARCADE_PAD */
default:
}
}
SDL_GetJoystickGUIDInfo(guid, &vendor, &product, NULL);
vidpid = MAKE_VIDPID(vendor, product);
}
}
}
}
}
SDL_JoystickID SDL_GetNextJoystickInstanceID ( void  )

Definition at line 163 of file SDL_joystick.c.

References SDL_AtomicIncRef.

Referenced by IOS_AddJoystickDevice().

SDL_bool SDL_IsJoystickHIDAPI ( SDL_JoystickGUID  guid)

Definition at line 1192 of file SDL_joystick.c.

References SDL_JoystickGUID::data, SDL_FALSE, and SDL_TRUE.

Referenced by SDL_PrivateGetControllerMappingForGUID(), and SDL_PrivateGetControllerMappingForNameAndGUID().

{
return (guid.data[14] == 'h') ? SDL_TRUE : SDL_FALSE;
}
SDL_bool SDL_IsJoystickNintendoSwitchPro ( Uint16  vendor,
Uint16  product 
)
static SDL_bool SDL_IsJoystickProductFlightStick ( Uint32  vidpid)
static

Definition at line 1224 of file SDL_joystick.c.

References i, MAKE_VIDPID, SDL_arraysize, SDL_FALSE, and SDL_TRUE.

Referenced by SDL_GetJoystickGUIDType().

{
static Uint32 flightstick_joysticks[] = {
MAKE_VIDPID(0x044f, 0x0402), /* HOTAS Warthog Joystick */
MAKE_VIDPID(0x0738, 0x2221), /* Saitek Pro Flight X-56 Rhino Stick */
};
int i;
for (i = 0; i < SDL_arraysize(flightstick_joysticks); ++i) {
if (vidpid == flightstick_joysticks[i]) {
return SDL_TRUE;
}
}
return SDL_FALSE;
}
static SDL_bool SDL_IsJoystickProductThrottle ( Uint32  vidpid)
static

Definition at line 1240 of file SDL_joystick.c.

References i, MAKE_VIDPID, SDL_arraysize, SDL_FALSE, and SDL_TRUE.

Referenced by SDL_GetJoystickGUIDType().

{
static Uint32 throttle_joysticks[] = {
MAKE_VIDPID(0x044f, 0x0404), /* HOTAS Warthog Throttle */
MAKE_VIDPID(0x0738, 0xa221), /* Saitek Pro Flight X-56 Rhino Throttle */
};
int i;
for (i = 0; i < SDL_arraysize(throttle_joysticks); ++i) {
if (vidpid == throttle_joysticks[i]) {
return SDL_TRUE;
}
}
return SDL_FALSE;
}
static SDL_bool SDL_IsJoystickProductWheel ( Uint32  vidpid)
static

Definition at line 1197 of file SDL_joystick.c.

References i, MAKE_VIDPID, SDL_arraysize, SDL_FALSE, and SDL_TRUE.

Referenced by SDL_GetJoystickGUIDType().

{
static Uint32 wheel_joysticks[] = {
MAKE_VIDPID(0x046d, 0xc294), /* Logitech generic wheel */
MAKE_VIDPID(0x046d, 0xc295), /* Logitech Momo Force */
MAKE_VIDPID(0x046d, 0xc298), /* Logitech Driving Force Pro */
MAKE_VIDPID(0x046d, 0xc299), /* Logitech G25 */
MAKE_VIDPID(0x046d, 0xc29a), /* Logitech Driving Force GT */
MAKE_VIDPID(0x046d, 0xc29b), /* Logitech G27 */
MAKE_VIDPID(0x046d, 0xc261), /* Logitech G920 (initial mode) */
MAKE_VIDPID(0x046d, 0xc262), /* Logitech G920 (active mode) */
MAKE_VIDPID(0x044f, 0xb65d), /* Thrustmaster Wheel FFB */
MAKE_VIDPID(0x044f, 0xb66d), /* Thrustmaster Wheel FFB */
MAKE_VIDPID(0x044f, 0xb677), /* Thrustmaster T150 */
MAKE_VIDPID(0x044f, 0xb664), /* Thrustmaster TX (initial mode) */
MAKE_VIDPID(0x044f, 0xb669), /* Thrustmaster TX (active mode) */
};
int i;
for (i = 0; i < SDL_arraysize(wheel_joysticks); ++i) {
if (vidpid == wheel_joysticks[i]) {
return SDL_TRUE;
}
}
return SDL_FALSE;
}
SDL_bool SDL_IsJoystickPS4 ( Uint16  vendor,
Uint16  product 
)

Definition at line 1149 of file SDL_joystick.c.

References GuessControllerType(), and k_eControllerType_PS4Controller.

Referenced by SDL_ShouldIgnoreJoystick().

{
}
SDL_bool SDL_IsJoystickSteamController ( Uint16  vendor,
Uint16  product 
)

Definition at line 1161 of file SDL_joystick.c.

References BIsSteamController(), and GuessControllerType().

{
return BIsSteamController(GuessControllerType(vendor, product));
}
SDL_bool SDL_IsJoystickXbox360 ( Uint16  vendor,
Uint16  product 
)

Definition at line 1167 of file SDL_joystick.c.

References GuessControllerType(), k_eControllerType_XBox360Controller, and SDL_FALSE.

{
/* Filter out some bogus values here */
if (vendor == 0x0000 && product == 0x0000) {
return SDL_FALSE;
}
if (vendor == 0x0001 && product == 0x0001) {
return SDL_FALSE;
}
}
SDL_bool SDL_IsJoystickXboxOne ( Uint16  vendor,
Uint16  product 
)

Definition at line 1180 of file SDL_joystick.c.

References GuessControllerType(), and k_eControllerType_XBoxOneController.

{
}
SDL_bool SDL_IsJoystickXInput ( SDL_JoystickGUID  guid)

Definition at line 1186 of file SDL_joystick.c.

References SDL_JoystickGUID::data, SDL_FALSE, and SDL_TRUE.

Referenced by SDL_GetJoystickGUIDType(), and SDL_PrivateGetControllerMappingForGUID().

{
return (guid.data[14] == 'x') ? SDL_TRUE : SDL_FALSE;
}
static SDL_bool SDL_IsPS4RemapperRunning ( void  )
static

Definition at line 1310 of file SDL_joystick.c.

References i, SDL_arraysize, SDL_FALSE, SDL_strcasecmp, and SDL_TRUE.

Referenced by SDL_ShouldIgnoreJoystick().

{
#ifdef __WIN32__
const char *mapper_processes[] = {
"DS4Windows.exe",
"InputMapper.exe",
};
int i;
PROCESSENTRY32 pe32;
/* Take a snapshot of all processes in the system */
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap != INVALID_HANDLE_VALUE) {
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnap, &pe32)) {
do
{
for (i = 0; i < SDL_arraysize(mapper_processes); ++i) {
if (SDL_strcasecmp(pe32.szExeFile, mapper_processes[i]) == 0) {
found = SDL_TRUE;
}
}
} while (Process32Next(hProcessSnap, &pe32) && !found);
}
CloseHandle(hProcessSnap);
}
return found;
#else
return SDL_FALSE;
#endif
}
static void SDL_JoystickAllowBackgroundEventsChanged ( void userdata,
const char *  name,
const char *  oldValue,
const char *  hint 
)
static
static SDL_bool SDL_JoystickAxesCenteredAtZero ( SDL_Joystick *  joystick)
static

Definition at line 251 of file SDL_joystick.c.

References i, MAKE_VIDPID, SDL_arraysize, SDL_FALSE, SDL_JoystickGetProduct, SDL_JoystickGetVendor, and SDL_TRUE.

Referenced by SDL_JoystickOpen().

{
static Uint32 zero_centered_joysticks[] = {
MAKE_VIDPID(0x0e8f, 0x3013), /* HuiJia SNES USB adapter */
MAKE_VIDPID(0x05a0, 0x3232), /* 8Bitdo Zero Gamepad */
};
int i;
/*printf("JOYSTICK '%s' VID/PID 0x%.4x/0x%.4x AXES: %d\n", joystick->name, vendor, product, joystick->naxes);*/
if (joystick->naxes == 2) {
/* Assume D-pad or thumbstick style axes are centered at 0 */
return SDL_TRUE;
}
for (i = 0; i < SDL_arraysize(zero_centered_joysticks); ++i) {
if (id == zero_centered_joysticks[i]) {
return SDL_TRUE;
}
}
return SDL_FALSE;
}
void SDL_JoystickClose ( SDL_Joystick *  joystick)

Close a joystick previously opened with SDL_JoystickOpen().

Definition at line 643 of file SDL_joystick.c.

References NULL, SDL_free, SDL_joysticks, SDL_LockJoysticks, SDL_PrivateJoystickValid(), SDL_UnlockJoysticks, and SDL_updating_joystick.

{
SDL_Joystick *joysticklist;
SDL_Joystick *joysticklistprev;
if (!SDL_PrivateJoystickValid(joystick)) {
return;
}
/* First decrement ref count */
if (--joystick->ref_count > 0) {
return;
}
return;
}
joystick->driver->Close(joystick);
joystick->hwdata = NULL;
joysticklist = SDL_joysticks;
joysticklistprev = NULL;
while (joysticklist) {
if (joystick == joysticklist) {
if (joysticklistprev) {
/* unlink this entry */
joysticklistprev->next = joysticklist->next;
} else {
SDL_joysticks = joystick->next;
}
break;
}
joysticklistprev = joysticklist;
joysticklist = joysticklist->next;
}
SDL_free(joystick->name);
/* Free the data associated with this joystick */
SDL_free(joystick->axes);
SDL_free(joystick->hats);
SDL_free(joystick->balls);
SDL_free(joystick->buttons);
SDL_free(joystick);
}
SDL_JoystickPowerLevel SDL_JoystickCurrentPowerLevel ( SDL_Joystick *  joystick)

Return the battery level of this joystick

Definition at line 1576 of file SDL_joystick.c.

References SDL_JOYSTICK_POWER_UNKNOWN, and SDL_PrivateJoystickValid().

{
if (!SDL_PrivateJoystickValid(joystick)) {
}
return joystick->epowerlevel;
}
int SDL_JoystickEventState ( int  state)

Enable/disable joystick event polling.

If joystick events are disabled, you must call SDL_JoystickUpdate() yourself and check the state of the joystick when you want joystick information.

The state can be one of SDL_QUERY, SDL_ENABLE or SDL_IGNORE.

Definition at line 1082 of file SDL_joystick.c.

References i, SDL_arraysize, SDL_DISABLE, SDL_ENABLE, SDL_EventState, SDL_JOYAXISMOTION, SDL_JOYBALLMOTION, SDL_JOYBUTTONDOWN, SDL_JOYBUTTONUP, SDL_JOYDEVICEADDED, SDL_JOYDEVICEREMOVED, SDL_JOYHATMOTION, SDL_QUERY, and state.

{
#if SDL_EVENTS_DISABLED
return SDL_DISABLE;
#else
const Uint32 event_list[] = {
};
unsigned int i;
switch (state) {
case SDL_QUERY:
for (i = 0; i < SDL_arraysize(event_list); ++i) {
state = SDL_EventState(event_list[i], SDL_QUERY);
if (state == SDL_ENABLE) {
break;
}
}
break;
default:
for (i = 0; i < SDL_arraysize(event_list); ++i) {
SDL_EventState(event_list[i], state);
}
break;
}
return state;
#endif /* SDL_EVENTS_DISABLED */
}
SDL_Joystick* SDL_JoystickFromInstanceID ( SDL_JoystickID  joyid)

Return the SDL_Joystick associated with an instance id.

Definition at line 594 of file SDL_joystick.c.

References SDL_joysticks, SDL_LockJoysticks, and SDL_UnlockJoysticks.

{
SDL_Joystick *joystick;
for (joystick = SDL_joysticks; joystick; joystick = joystick->next) {
if (joystick->instance_id == joyid) {
break;
}
}
return joystick;
}
SDL_bool SDL_JoystickGetAttached ( SDL_Joystick *  joystick)

Returns SDL_TRUE if the joystick has been opened and currently connected, or SDL_FALSE if it has not.

Definition at line 568 of file SDL_joystick.c.

References SDL_FALSE, and SDL_PrivateJoystickValid().

{
if (!SDL_PrivateJoystickValid(joystick)) {
return SDL_FALSE;
}
return joystick->attached;
}
Sint16 SDL_JoystickGetAxis ( SDL_Joystick *  joystick,
int  axis 
)

Get the current state of an axis control on a joystick.

The state is a value ranging from -32768 to 32767.

The axis indices start at index 0.

Definition at line 460 of file SDL_joystick.c.

References axis, SDL_PrivateJoystickValid(), SDL_SetError, and state.

{
if (!SDL_PrivateJoystickValid(joystick)) {
return 0;
}
if (axis < joystick->naxes) {
state = joystick->axes[axis].value;
} else {
SDL_SetError("Joystick only has %d axes", joystick->naxes);
state = 0;
}
return state;
}
SDL_bool SDL_JoystickGetAxisInitialState ( SDL_Joystick *  joystick,
int  axis,
Sint16 state 
)

Get the initial state of an axis control on a joystick.

The state is a value ranging from -32768 to 32767.

The axis indices start at index 0.

Returns
SDL_TRUE if this axis has any initial value, or SDL_FALSE if not.

Definition at line 480 of file SDL_joystick.c.

References axis, SDL_FALSE, SDL_PrivateJoystickValid(), and SDL_SetError.

{
if (!SDL_PrivateJoystickValid(joystick)) {
return SDL_FALSE;
}
if (axis >= joystick->naxes) {
SDL_SetError("Joystick only has %d axes", joystick->naxes);
return SDL_FALSE;
}
if (state) {
*state = joystick->axes[axis].initial_value;
}
return joystick->axes[axis].has_initial_value;
}
int SDL_JoystickGetBall ( SDL_Joystick *  joystick,
int  ball,
int *  dx,
int *  dy 
)

Get the ball axis change since the last poll.

Returns
0, or -1 if you passed it invalid parameters.

The ball indices start at index 0.

Definition at line 519 of file SDL_joystick.c.

References retval, SDL_PrivateJoystickValid(), and SDL_SetError.

{
int retval;
if (!SDL_PrivateJoystickValid(joystick)) {
return -1;
}
retval = 0;
if (ball < joystick->nballs) {
if (dx) {
*dx = joystick->balls[ball].dx;
}
if (dy) {
*dy = joystick->balls[ball].dy;
}
joystick->balls[ball].dx = 0;
joystick->balls[ball].dy = 0;
} else {
return SDL_SetError("Joystick only has %d balls", joystick->nballs);
}
return retval;
}
Uint8 SDL_JoystickGetButton ( SDL_Joystick *  joystick,
int  button 
)

Get the current state of a button on a joystick.

The button indices start at index 0.

Definition at line 547 of file SDL_joystick.c.

References button, SDL_PrivateJoystickValid(), SDL_SetError, and state.

{
if (!SDL_PrivateJoystickValid(joystick)) {
return 0;
}
if (button < joystick->nbuttons) {
state = joystick->buttons[button];
} else {
SDL_SetError("Joystick only has %d buttons", joystick->nbuttons);
state = 0;
}
return state;
}
SDL_JoystickGUID SDL_JoystickGetDeviceGUID ( int  device_index)

Return the GUID for the joystick at this index This can be called before any joysticks are opened.

Definition at line 1363 of file SDL_joystick.c.

References SDL_JoystickDriver::GetDeviceGUID, SDL_GetDriverAndJoystickIndex(), SDL_LockJoysticks, SDL_UnlockJoysticks, and SDL_zero.

{
if (SDL_GetDriverAndJoystickIndex(device_index, &driver, &device_index)) {
guid = driver->GetDeviceGUID(device_index);
} else {
SDL_zero(guid);
}
return guid;
}
int SDL_JoystickGetDeviceIndexFromInstanceID ( SDL_JoystickID  instance_id)

Definition at line 1434 of file SDL_joystick.c.

References i, SDL_JoystickGetDeviceInstanceID, SDL_LockJoysticks, SDL_NumJoysticks, and SDL_UnlockJoysticks.

Referenced by SDL_PrivateJoystickAdded().

{
int i, num_joysticks, device_index = -1;
num_joysticks = SDL_NumJoysticks();
for (i = 0; i < num_joysticks; ++i) {
if (SDL_JoystickGetDeviceInstanceID(i) == instance_id) {
device_index = i;
break;
}
}
return device_index;
}
SDL_JoystickID SDL_JoystickGetDeviceInstanceID ( int  device_index)

Get the instance ID of a joystick. This can be called before any joysticks are opened. If the index is out of range, this function will return -1.

Definition at line 1420 of file SDL_joystick.c.

References SDL_JoystickDriver::GetDeviceInstanceID, SDL_GetDriverAndJoystickIndex(), SDL_LockJoysticks, and SDL_UnlockJoysticks.

{
SDL_JoystickID instance_id = -1;
if (SDL_GetDriverAndJoystickIndex(device_index, &driver, &device_index)) {
instance_id = driver->GetDeviceInstanceID(device_index);
}
return instance_id;
}
int SDL_JoystickGetDevicePlayerIndex ( int  device_index)

Get the player index of a joystick, or -1 if it's not available This can be called before any joysticks are opened.

Definition at line 231 of file SDL_joystick.c.

References SDL_JoystickDriver::GetDevicePlayerIndex, SDL_GetDriverAndJoystickIndex(), SDL_LockJoysticks, and SDL_UnlockJoysticks.

{
int player_index = -1;
if (SDL_GetDriverAndJoystickIndex(device_index, &driver, &device_index)) {
player_index = driver->GetDevicePlayerIndex(device_index);
}
return player_index;
}
Uint16 SDL_JoystickGetDeviceProduct ( int  device_index)

Get the USB product ID of a joystick, if available. This can be called before any joysticks are opened. If the product ID isn't available this function returns 0.

Definition at line 1388 of file SDL_joystick.c.

References NULL, SDL_GetJoystickGUIDInfo(), and SDL_JoystickGetDeviceGUID.

{
Uint16 product;
SDL_GetJoystickGUIDInfo(guid, NULL, &product, NULL);
return product;
}
Uint16 SDL_JoystickGetDeviceProductVersion ( int  device_index)

Get the product version of a joystick, if available. This can be called before any joysticks are opened. If the product version isn't available this function returns 0.

Definition at line 1397 of file SDL_joystick.c.

References NULL, SDL_GetJoystickGUIDInfo(), and SDL_JoystickGetDeviceGUID.

{
Uint16 version;
SDL_GetJoystickGUIDInfo(guid, NULL, NULL, &version);
return version;
}
SDL_JoystickType SDL_JoystickGetDeviceType ( int  device_index)

Get the type of a joystick, if available. This can be called before any joysticks are opened.

Definition at line 1406 of file SDL_joystick.c.

References SDL_GetJoystickGUIDType(), SDL_IsGameController, SDL_JOYSTICK_TYPE_GAMECONTROLLER, SDL_JOYSTICK_TYPE_UNKNOWN, and SDL_JoystickGetDeviceGUID.

Uint16 SDL_JoystickGetDeviceVendor ( int  device_index)

Get the USB vendor ID of a joystick, if available. This can be called before any joysticks are opened. If the vendor ID isn't available this function returns 0.

Definition at line 1379 of file SDL_joystick.c.

References NULL, SDL_GetJoystickGUIDInfo(), and SDL_JoystickGetDeviceGUID.

{
Uint16 vendor;
SDL_GetJoystickGUIDInfo(guid, &vendor, NULL, NULL);
return vendor;
}
SDL_JoystickGUID SDL_JoystickGetGUID ( SDL_Joystick *  joystick)

Return the GUID for this opened joystick

Definition at line 1451 of file SDL_joystick.c.

References SDL_PrivateJoystickValid(), and SDL_zero.

{
if (!SDL_PrivateJoystickValid(joystick)) {
SDL_JoystickGUID emptyGUID;
SDL_zero(emptyGUID);
return emptyGUID;
}
return joystick->guid;
}
SDL_JoystickGUID SDL_JoystickGetGUIDFromString ( const char *  pchGUID)

Convert a string into a joystick guid

Definition at line 1548 of file SDL_joystick.c.

References i, nibble(), SDL_memset, and SDL_strlen.

{
int maxoutputbytes= sizeof(guid);
size_t len = SDL_strlen(pchGUID);
Uint8 *p;
size_t i;
/* Make sure it's even */
len = (len) & ~0x1;
SDL_memset(&guid, 0x00, sizeof(guid));
p = (Uint8 *)&guid;
for (i = 0; (i < len) && ((p - (Uint8 *)&guid) < maxoutputbytes); i+=2, p++) {
*p = (nibble(pchGUID[i]) << 4) | nibble(pchGUID[i+1]);
}
return guid;
}
void SDL_JoystickGetGUIDString ( SDL_JoystickGUID  guid,
char *  pszGUID,
int  cbGUID 
)

Return a string representation for this guid. pszGUID must point to at least 33 bytes (32 for the string plus a NULL terminator).

Definition at line 1503 of file SDL_joystick.c.

References SDL_JoystickGUID::data, i, and NULL.

{
static const char k_rgchHexToASCII[] = "0123456789abcdef";
int i;
if ((pszGUID == NULL) || (cbGUID <= 0)) {
return;
}
for (i = 0; i < sizeof(guid.data) && i < (cbGUID-1)/2; i++) {
/* each input byte writes 2 ascii chars, and might write a null byte. */
/* If we don't have room for next input byte, stop */
unsigned char c = guid.data[i];
*pszGUID++ = k_rgchHexToASCII[c >> 4];
*pszGUID++ = k_rgchHexToASCII[c & 0x0F];
}
*pszGUID = '\0';
}
Uint8 SDL_JoystickGetHat ( SDL_Joystick *  joystick,
int  hat 
)

Get the current state of a POV hat on a joystick.

The hat indices start at index 0.

Returns
The return value is one of the following positions:

Definition at line 499 of file SDL_joystick.c.

References SDL_PrivateJoystickValid(), SDL_SetError, and state.

{
if (!SDL_PrivateJoystickValid(joystick)) {
return 0;
}
if (hat < joystick->nhats) {
state = joystick->hats[hat];
} else {
SDL_SetError("Joystick only has %d hats", joystick->nhats);
state = 0;
}
return state;
}
int SDL_JoystickGetPlayerIndex ( SDL_Joystick *  joystick)

Get the player index of an opened joystick, or -1 if it's not available

For XInput controllers this returns the XInput user index.

Definition at line 622 of file SDL_joystick.c.

References SDL_PrivateJoystickValid().

{
if (!SDL_PrivateJoystickValid(joystick)) {
return -1;
}
return joystick->player_index;
}
Uint16 SDL_JoystickGetProduct ( SDL_Joystick *  joystick)

Get the USB product ID of an opened joystick, if available. If the product ID isn't available this function returns 0.

Definition at line 1470 of file SDL_joystick.c.

References NULL, SDL_GetJoystickGUIDInfo(), and SDL_JoystickGetGUID.

{
Uint16 product;
SDL_GetJoystickGUIDInfo(guid, NULL, &product, NULL);
return product;
}
Uint16 SDL_JoystickGetProductVersion ( SDL_Joystick *  joystick)

Get the product version of an opened joystick, if available. If the product version isn't available this function returns 0.

Definition at line 1479 of file SDL_joystick.c.

References NULL, SDL_GetJoystickGUIDInfo(), and SDL_JoystickGetGUID.

{
Uint16 version;
SDL_GetJoystickGUIDInfo(guid, NULL, NULL, &version);
return version;
}
SDL_JoystickType SDL_JoystickGetType ( SDL_Joystick *  joystick)

Get the type of an opened joystick.

Definition at line 1488 of file SDL_joystick.c.

References SDL_GetJoystickGUIDType(), SDL_JOYSTICK_TYPE_GAMECONTROLLER, SDL_JOYSTICK_TYPE_UNKNOWN, and SDL_JoystickGetGUID.

{
if (joystick && joystick->is_game_controller) {
}
}
return type;
}
Uint16 SDL_JoystickGetVendor ( SDL_Joystick *  joystick)

Get the USB vendor ID of an opened joystick, if available. If the vendor ID isn't available this function returns 0.

Definition at line 1461 of file SDL_joystick.c.

References NULL, SDL_GetJoystickGUIDInfo(), and SDL_JoystickGetGUID.

{
Uint16 vendor;
SDL_GetJoystickGUIDInfo(guid, &vendor, NULL, NULL);
return vendor;
}
int SDL_JoystickInit ( void  )

Definition at line 114 of file SDL_joystick.c.

References i, NULL, SDL_AddHintCallback, SDL_arraysize, SDL_CreateMutex, SDL_GameControllerInitMappings(), SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, SDL_INIT_EVENTS, SDL_InitSubSystem, and SDL_JoystickAllowBackgroundEventsChanged().

Referenced by SDL_InitSubSystem().

{
int i, status;
/* Create the joystick list lock */
}
/* See if we should allow joystick events while in the background */
#if !SDL_EVENTS_DISABLED
return -1;
}
#endif /* !SDL_EVENTS_DISABLED */
status = -1;
for (i = 0; i < SDL_arraysize(SDL_joystick_drivers); ++i) {
if (SDL_joystick_drivers[i]->Init() >= 0) {
status = 0;
}
}
return status;
}
SDL_JoystickID SDL_JoystickInstanceID ( SDL_Joystick *  joystick)

Get the instance ID of an opened joystick or -1 if the joystick is invalid.

Definition at line 581 of file SDL_joystick.c.

References SDL_PrivateJoystickValid().

{
if (!SDL_PrivateJoystickValid(joystick)) {
return -1;
}
return joystick->instance_id;
}
const char* SDL_JoystickName ( SDL_Joystick *  joystick)

Return the name for this currently opened joystick. If no name can be found, this function returns NULL.

Definition at line 612 of file SDL_joystick.c.

References NULL, SDL_FixupJoystickName(), and SDL_PrivateJoystickValid().

{
if (!SDL_PrivateJoystickValid(joystick)) {
return NULL;
}
return SDL_FixupJoystickName(joystick->name);
}
const char* SDL_JoystickNameForIndex ( int  device_index)

Get the implementation dependent name of a joystick. This can be called before any joysticks are opened. If no name can be found, this function returns NULL.

Definition at line 215 of file SDL_joystick.c.

References SDL_JoystickDriver::GetDeviceName, NULL, SDL_FixupJoystickName(), SDL_GetDriverAndJoystickIndex(), SDL_LockJoysticks, and SDL_UnlockJoysticks.

{
const char *name = NULL;
if (SDL_GetDriverAndJoystickIndex(device_index, &driver, &device_index)) {
name = SDL_FixupJoystickName(driver->GetDeviceName(device_index));
}
/* FIXME: Really we should reference count this name so it doesn't go away after unlock */
return name;
}
int SDL_JoystickNumAxes ( SDL_Joystick *  joystick)

Get the number of general axis controls on a joystick.

Definition at line 412 of file SDL_joystick.c.

References SDL_PrivateJoystickValid().

{
if (!SDL_PrivateJoystickValid(joystick)) {
return -1;
}
return joystick->naxes;
}
int SDL_JoystickNumBalls ( SDL_Joystick *  joystick)

Get the number of trackballs on a joystick.

Joystick trackballs have only relative motion events associated with them and their state cannot be polled.

Definition at line 436 of file SDL_joystick.c.

References SDL_PrivateJoystickValid().

{
if (!SDL_PrivateJoystickValid(joystick)) {
return -1;
}
return joystick->nballs;
}
int SDL_JoystickNumButtons ( SDL_Joystick *  joystick)

Get the number of buttons on a joystick.

Definition at line 448 of file SDL_joystick.c.

References SDL_PrivateJoystickValid().

{
if (!SDL_PrivateJoystickValid(joystick)) {
return -1;
}
return joystick->nbuttons;
}
int SDL_JoystickNumHats ( SDL_Joystick *  joystick)

Get the number of POV hats on a joystick.

Definition at line 424 of file SDL_joystick.c.

References SDL_PrivateJoystickValid().

{
if (!SDL_PrivateJoystickValid(joystick)) {
return -1;
}
return joystick->nhats;
}
SDL_Joystick* SDL_JoystickOpen ( int  device_index)

Open a joystick for use. The index passed as an argument refers to the N'th joystick on the system. This index is not the value which will identify this joystick in future joystick events. The joystick's instance id (SDL_JoystickID) will be used there instead.

Returns
A joystick identifier, or NULL if an error occurred.

Definition at line 285 of file SDL_joystick.c.

References SDL_JoystickDriver::GetDeviceGUID, SDL_JoystickDriver::GetDeviceInstanceID, SDL_JoystickDriver::GetDeviceName, i, SDL_GameController::joystick, NULL, SDL_JoystickDriver::Open, SDL_calloc, SDL_free, SDL_GetDriverAndJoystickIndex(), SDL_IsGameController, SDL_JOYSTICK_POWER_UNKNOWN, SDL_JoystickAxesCenteredAtZero(), SDL_JoystickClose, SDL_joysticks, SDL_LockJoysticks, SDL_OutOfMemory, SDL_strdup, SDL_TRUE, SDL_UnlockJoysticks, and SDL_JoystickDriver::Update.

{
SDL_JoystickID instance_id;
SDL_Joystick *joystick;
SDL_Joystick *joysticklist;
const char *joystickname = NULL;
if (!SDL_GetDriverAndJoystickIndex(device_index, &driver, &device_index)) {
return NULL;
}
joysticklist = SDL_joysticks;
/* If the joystick is already open, return it
* it is important that we have a single joystick * for each instance id
*/
instance_id = driver->GetDeviceInstanceID(device_index);
while (joysticklist) {
if (instance_id == joysticklist->instance_id) {
joystick = joysticklist;
++joystick->ref_count;
return joystick;
}
joysticklist = joysticklist->next;
}
/* Create and initialize the joystick */
joystick = (SDL_Joystick *) SDL_calloc(sizeof(*joystick), 1);
if (joystick == NULL) {
return NULL;
}
joystick->driver = driver;
joystick->instance_id = instance_id;
joystick->attached = SDL_TRUE;
joystick->player_index = -1;
if (driver->Open(joystick, device_index) < 0) {
SDL_free(joystick);
return NULL;
}
joystickname = driver->GetDeviceName(device_index);
if (joystickname) {
joystick->name = SDL_strdup(joystickname);
} else {
joystick->name = NULL;
}
joystick->guid = driver->GetDeviceGUID(device_index);
if (joystick->naxes > 0) {
joystick->axes = (SDL_JoystickAxisInfo *) SDL_calloc(joystick->naxes, sizeof(SDL_JoystickAxisInfo));
}
if (joystick->nhats > 0) {
joystick->hats = (Uint8 *) SDL_calloc(joystick->nhats, sizeof(Uint8));
}
if (joystick->nballs > 0) {
joystick->balls = (struct balldelta *) SDL_calloc(joystick->nballs, sizeof(*joystick->balls));
}
if (joystick->nbuttons > 0) {
joystick->buttons = (Uint8 *) SDL_calloc(joystick->nbuttons, sizeof(Uint8));
}
if (((joystick->naxes > 0) && !joystick->axes)
|| ((joystick->nhats > 0) && !joystick->hats)
|| ((joystick->nballs > 0) && !joystick->balls)
|| ((joystick->nbuttons > 0) && !joystick->buttons)) {
SDL_JoystickClose(joystick);
return NULL;
}
joystick->epowerlevel = SDL_JOYSTICK_POWER_UNKNOWN;
/* If this joystick is known to have all zero centered axes, skip the auto-centering code */
int i;
for (i = 0; i < joystick->naxes; ++i) {
joystick->axes[i].has_initial_value = SDL_TRUE;
}
}
joystick->is_game_controller = SDL_IsGameController(device_index);
/* Add joystick to list */
++joystick->ref_count;
/* Link the joystick in the list */
joystick->next = SDL_joysticks;
SDL_joysticks = joystick;
driver->Update(joystick);
return joystick;
}
int SDL_JoystickRumble ( SDL_Joystick *  joystick,
Uint16  low_frequency_rumble,
Uint16  high_frequency_rumble,
Uint32  duration_ms 
)

Trigger a rumble effect Each call to this function cancels any previous rumble effect, and calling it with 0 intensity stops any rumbling.

Parameters
joystickThe joystick to vibrate
low_frequency_rumbleThe intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF
high_frequency_rumbleThe intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF
duration_msThe duration of the rumble effect, in milliseconds
Returns
0, or -1 if rumble isn't supported on this joystick

Definition at line 631 of file SDL_joystick.c.

References SDL_PrivateJoystickValid().

{
if (!SDL_PrivateJoystickValid(joystick)) {
return -1;
}
return joystick->driver->Rumble(joystick, low_frequency_rumble, high_frequency_rumble, duration_ms);
}
void SDL_JoystickUpdate ( void  )

Update the current state of the open joysticks.

This is called automatically by the event loop if any joystick events are enabled.

Definition at line 1013 of file SDL_joystick.c.

References SDL_JoystickDriver::Detect, i, SDL_arraysize, SDL_FALSE, SDL_GameControllerHandleDelayedGuideButton(), SDL_HAT_CENTERED, SDL_JoystickClose, SDL_joysticks, SDL_LockJoysticks, SDL_PrivateJoystickAxis(), SDL_PrivateJoystickButton(), SDL_PrivateJoystickHat(), SDL_TRUE, SDL_UnlockJoysticks, and SDL_updating_joystick.

{
int i;
SDL_Joystick *joystick;
/* The joysticks are already being updated */
return;
}
/* Make sure the list is unlocked while dispatching events to prevent application deadlocks */
for (joystick = SDL_joysticks; joystick; joystick = joystick->next) {
if (joystick->attached) {
joystick->driver->Update(joystick);
if (joystick->delayed_guide_button) {
}
}
if (joystick->force_recentering) {
/* Tell the app that everything is centered/unpressed... */
for (i = 0; i < joystick->naxes; i++) {
if (joystick->axes[i].has_initial_value) {
SDL_PrivateJoystickAxis(joystick, i, joystick->axes[i].zero);
}
}
for (i = 0; i < joystick->nbuttons; i++) {
SDL_PrivateJoystickButton(joystick, i, 0);
}
for (i = 0; i < joystick->nhats; i++) {
}
joystick->force_recentering = SDL_FALSE;
}
}
/* If any joysticks were closed while updating, free them here */
for (joystick = SDL_joysticks; joystick; joystick = joystick->next) {
if (joystick->ref_count <= 0) {
SDL_JoystickClose(joystick);
}
}
/* this needs to happen AFTER walking the joystick list above, so that any
dangling hardware data from removed devices can be free'd
*/
for (i = 0; i < SDL_arraysize(SDL_joystick_drivers); ++i) {
}
}
void SDL_LockJoysticks ( void  )

Locking for multi-threaded access to the joystick API

If you are using the joystick API or handling events from multiple threads you should use these locking functions to protect access to the joysticks.

In particular, you are guaranteed that the joystick list won't change, so the API functions that take a joystick index will be valid, and joystick and game controller events will not be delivered.

Definition at line 87 of file SDL_joystick.c.

References SDL_LockMutex.

int SDL_NumJoysticks ( void  )

Count the number of joysticks attached to the system right now

Definition at line 148 of file SDL_joystick.c.

References SDL_JoystickDriver::GetCount, i, SDL_arraysize, SDL_LockJoysticks, and SDL_UnlockJoysticks.

{
int i, total_joysticks = 0;
for (i = 0; i < SDL_arraysize(SDL_joystick_drivers); ++i) {
total_joysticks += SDL_joystick_drivers[i]->GetCount();
}
return total_joysticks;
}
void SDL_PrivateJoystickAdded ( SDL_JoystickID  device_instance)

Definition at line 751 of file SDL_joystick.c.

References SDL_ENABLE, SDL_GetEventState, SDL_JOYDEVICEADDED, SDL_JoystickGetDeviceIndexFromInstanceID(), SDL_PushEvent, and SDL_Event::type.

Referenced by IOS_AddJoystickDevice().

{
#if !SDL_EVENTS_DISABLED
int device_index;
device_index = SDL_JoystickGetDeviceIndexFromInstanceID(device_instance);
if (device_index < 0) {
return;
}
event.type = SDL_JOYDEVICEADDED;
event.jdevice.which = device_index;
SDL_PushEvent(&event);
}
#endif /* !SDL_EVENTS_DISABLED */
}
int SDL_PrivateJoystickAxis ( SDL_Joystick *  joystick,
Uint8  axis,
Sint16  value 
)

Definition at line 828 of file SDL_joystick.c.

References axis, SDL_abs, SDL_ENABLE, SDL_GetEventState, SDL_JOYAXISMOTION, SDL_JOYSTICK_AXIS_MAX, SDL_PrivateJoystickAxis(), SDL_PrivateJoystickShouldIgnoreEvent(), SDL_PushEvent, and SDL_TRUE.

Referenced by IOS_AccelerometerUpdate(), IOS_MFIJoystickUpdate(), SDL_JoystickUpdate(), and SDL_PrivateJoystickAxis().

{
int posted;
/* Make sure we're not getting garbage or duplicate events */
if (axis >= joystick->naxes) {
return 0;
}
if (!joystick->axes[axis].has_initial_value) {
joystick->axes[axis].initial_value = value;
joystick->axes[axis].value = value;
joystick->axes[axis].zero = value;
joystick->axes[axis].has_initial_value = SDL_TRUE;
}
if (value == joystick->axes[axis].value) {
return 0;
}
if (!joystick->axes[axis].sent_initial_value) {
/* Make sure we don't send motion until there's real activity on this axis */
const int MAX_ALLOWED_JITTER = SDL_JOYSTICK_AXIS_MAX / 80; /* ShanWan PS3 controller needed 96 */
if (SDL_abs(value - joystick->axes[axis].value) <= MAX_ALLOWED_JITTER) {
return 0;
}
joystick->axes[axis].sent_initial_value = SDL_TRUE;
joystick->axes[axis].value = value; /* Just so we pass the check above */
SDL_PrivateJoystickAxis(joystick, axis, joystick->axes[axis].initial_value);
}
/* We ignore events if we don't have keyboard focus, except for centering
* events.
*/
if ((value > joystick->axes[axis].zero && value >= joystick->axes[axis].value) ||
(value < joystick->axes[axis].zero && value <= joystick->axes[axis].value)) {
return 0;
}
}
/* Update internal joystick state */
joystick->axes[axis].value = value;
/* Post the event, if desired */
posted = 0;
#if !SDL_EVENTS_DISABLED
event.type = SDL_JOYAXISMOTION;
event.jaxis.which = joystick->instance_id;
event.jaxis.axis = axis;
event.jaxis.value = value;
posted = SDL_PushEvent(&event) == 1;
}
#endif /* !SDL_EVENTS_DISABLED */
return posted;
}
int SDL_PrivateJoystickBall ( SDL_Joystick *  joystick,
Uint8  ball,
Sint16  xrel,
Sint16  yrel 
)

Definition at line 925 of file SDL_joystick.c.

References SDL_ENABLE, SDL_GetEventState, SDL_JOYBALLMOTION, SDL_PrivateJoystickShouldIgnoreEvent(), and SDL_PushEvent.

{
int posted;
/* Make sure we're not getting garbage events */
if (ball >= joystick->nballs) {
return 0;
}
/* We ignore events if we don't have keyboard focus. */
return 0;
}
/* Update internal mouse state */
joystick->balls[ball].dx += xrel;
joystick->balls[ball].dy += yrel;
/* Post the event, if desired */
posted = 0;
#if !SDL_EVENTS_DISABLED
event.jball.type = SDL_JOYBALLMOTION;
event.jball.which = joystick->instance_id;
event.jball.ball = ball;
event.jball.xrel = xrel;
event.jball.yrel = yrel;
posted = SDL_PushEvent(&event) == 1;
}
#endif /* !SDL_EVENTS_DISABLED */
return posted;
}
void SDL_PrivateJoystickBatteryLevel ( SDL_Joystick *  joystick,
SDL_JoystickPowerLevel  ePowerLevel 
)

Definition at line 1570 of file SDL_joystick.c.

{
joystick->epowerlevel = ePowerLevel;
}
int SDL_PrivateJoystickButton ( SDL_Joystick *  joystick,
Uint8  button,
Uint8  state 
)

Definition at line 961 of file SDL_joystick.c.

References button, SDL_ENABLE, SDL_GetEventState, SDL_JOYBUTTONDOWN, SDL_JOYBUTTONUP, SDL_PRESSED, SDL_PrivateJoystickShouldIgnoreEvent(), SDL_PushEvent, SDL_RELEASED, state, and SDL_Event::type.

Referenced by IOS_MFIJoystickUpdate(), and SDL_JoystickUpdate().

{
int posted;
#if !SDL_EVENTS_DISABLED
switch (state) {
event.type = SDL_JOYBUTTONDOWN;
break;
event.type = SDL_JOYBUTTONUP;
break;
default:
/* Invalid state -- bail */
return 0;
}
#endif /* !SDL_EVENTS_DISABLED */
/* Make sure we're not getting garbage or duplicate events */
if (button >= joystick->nbuttons) {
return 0;
}
if (state == joystick->buttons[button]) {
return 0;
}
/* We ignore events if we don't have keyboard focus, except for button
* release. */
if (state == SDL_PRESSED) {
return 0;
}
}
/* Update internal joystick state */
joystick->buttons[button] = state;
/* Post the event, if desired */
posted = 0;
#if !SDL_EVENTS_DISABLED
event.jbutton.which = joystick->instance_id;
event.jbutton.button = button;
event.jbutton.state = state;
posted = SDL_PushEvent(&event) == 1;
}
#endif /* !SDL_EVENTS_DISABLED */
return posted;
}
int SDL_PrivateJoystickHat ( SDL_Joystick *  joystick,
Uint8  hat,
Uint8  value 
)

Definition at line 885 of file SDL_joystick.c.

References SDL_ENABLE, SDL_GetEventState, SDL_HAT_CENTERED, SDL_JOYHATMOTION, SDL_PrivateJoystickShouldIgnoreEvent(), and SDL_PushEvent.

Referenced by IOS_MFIJoystickUpdate(), and SDL_JoystickUpdate().

{
int posted;
/* Make sure we're not getting garbage or duplicate events */
if (hat >= joystick->nhats) {
return 0;
}
if (value == joystick->hats[hat]) {
return 0;
}
/* We ignore events if we don't have keyboard focus, except for centering
* events.
*/
return 0;
}
}
/* Update internal joystick state */
joystick->hats[hat] = value;
/* Post the event, if desired */
posted = 0;
#if !SDL_EVENTS_DISABLED
event.jhat.type = SDL_JOYHATMOTION;
event.jhat.which = joystick->instance_id;
event.jhat.hat = hat;
event.jhat.value = value;
posted = SDL_PushEvent(&event) == 1;
}
#endif /* !SDL_EVENTS_DISABLED */
return posted;
}
void SDL_PrivateJoystickRemoved ( SDL_JoystickID  device_instance)

Definition at line 800 of file SDL_joystick.c.

References SDL_ENABLE, SDL_FALSE, SDL_GetEventState, SDL_JOYDEVICEREMOVED, SDL_joysticks, SDL_PushEvent, SDL_TRUE, SDL_Event::type, and UpdateEventsForDeviceRemoval().

Referenced by IOS_RemoveJoystickDevice().

{
SDL_Joystick *joystick;
#if !SDL_EVENTS_DISABLED
event.type = SDL_JOYDEVICEREMOVED;
event.jdevice.which = device_instance;
SDL_PushEvent(&event);
}
#endif /* !SDL_EVENTS_DISABLED */
/* Mark this joystick as no longer attached */
for (joystick = SDL_joysticks; joystick; joystick = joystick->next) {
if (joystick->instance_id == device_instance) {
joystick->attached = SDL_FALSE;
joystick->force_recentering = SDL_TRUE;
break;
}
}
}
static SDL_bool SDL_PrivateJoystickShouldIgnoreEvent ( )
static

Definition at line 736 of file SDL_joystick.c.

References NULL, SDL_FALSE, SDL_GetKeyboardFocus, SDL_HasWindows(), SDL_joystick_allows_background_events, and SDL_TRUE.

Referenced by SDL_PrivateJoystickAxis(), SDL_PrivateJoystickBall(), SDL_PrivateJoystickButton(), and SDL_PrivateJoystickHat().

{
return SDL_FALSE;
}
/* We have windows but we don't have focus, ignore the event. */
return SDL_TRUE;
}
return SDL_FALSE;
}
SDL_bool SDL_ShouldIgnoreJoystick ( const char *  name,
SDL_JoystickGUID  guid 
)
void SDL_UnlockJoysticks ( void  )

Definition at line 95 of file SDL_joystick.c.

References SDL_UnlockMutex.

static void UpdateEventsForDeviceRemoval ( )
static

Definition at line 776 of file SDL_joystick.c.

References events, i, SDL_Event::jdevice, NULL, SDL_ADDEVENT, SDL_GETEVENT, SDL_JOYDEVICEADDED, SDL_PEEKEVENT, SDL_PeepEvents, SDL_stack_alloc, SDL_stack_free, and SDL_JoyDeviceEvent::which.

Referenced by SDL_PrivateJoystickRemoved().

{
int i, num_events;
if (num_events <= 0) {
return;
}
events = SDL_stack_alloc(SDL_Event, num_events);
if (!events) {
return;
}
for (i = 0; i < num_events; ++i) {
--events[i].jdevice.which;
}
SDL_PeepEvents(events, num_events, SDL_ADDEVENT, 0, 0);
SDL_stack_free(events);
}

Variable Documentation

SDL_bool SDL_joystick_allows_background_events = SDL_FALSE
static
SDL_JoystickDriver* SDL_joystick_drivers[]
static

Definition at line 48 of file SDL_joystick.c.

SDL_mutex* SDL_joystick_lock = NULL
static

Definition at line 83 of file SDL_joystick.c.

SDL_atomic_t SDL_next_joystick_instance_id
static

Definition at line 84 of file SDL_joystick.c.

SDL_bool SDL_updating_joystick = SDL_FALSE
static

Definition at line 82 of file SDL_joystick.c.

Referenced by SDL_JoystickClose(), SDL_JoystickQuit(), and SDL_JoystickUpdate().