SDL_gamecontroller.c File Reference
`#include "../SDL_internal.h"`
`#include "SDL_events.h"`
`#include "SDL_assert.h"`
`#include "SDL_hints.h"`
`#include "SDL_sysjoystick.h"`
`#include "SDL_joystick_c.h"`
`#include "SDL_gamecontrollerdb.h"`
`#include "../events/SDL_events_c.h"`
Include dependency graph for SDL_gamecontroller.c:

Go to the source code of this file.

## Data Structures

struct | SDL_ExtendedGameControllerBind
struct | ControllerMapping_t
struct | SDL_GameController
struct | SDL_vidpid_list

## Macros

#define | SDL_CONTROLLER_PLATFORM_FIELD "platform:"

## Enumerations

enum | SDL_ControllerMappingPriority { SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT, SDL_CONTROLLER_MAPPING_PRIORITY_API, SDL_CONTROLLER_MAPPING_PRIORITY_USER }

## Functions

static void | SDL_LoadVIDPIDListFromHint (const char *hint, SDL_vidpid_list *list)
static void | SDL_GameControllerIgnoreDevicesChanged (void *userdata, const char *name, const char *oldValue, const char *hint)
static void | SDL_GameControllerIgnoreDevicesExceptChanged (void *userdata, const char *name, const char *oldValue, const char *hint)
static int | SDL_PrivateGameControllerAxis (SDL_GameController *gamecontroller, SDL_GameControllerAxis axis, Sint16 value)
static int | SDL_PrivateGameControllerButton (SDL_GameController *gamecontroller, SDL_GameControllerButton button, Uint8 state)
static void | UpdateEventsForDeviceRemoval ()
static SDL_bool | HasSameOutput (SDL_ExtendedGameControllerBind *a, SDL_ExtendedGameControllerBind *b)
static void | ResetOutput (SDL_GameController *gamecontroller, SDL_ExtendedGameControllerBind *bind)
static void | HandleJoystickAxis (SDL_GameController *gamecontroller, int axis, int value)
static void | HandleJoystickButton (SDL_GameController *gamecontroller, int button, Uint8 state)
static void | HandleJoystickHat (SDL_GameController *gamecontroller, int hat, Uint8 value)
static int | SDL_GameControllerEventWatcher (void *userdata, SDL_Event *event)
static ControllerMapping_t * | SDL_PrivateGetControllerMappingForGUID (SDL_JoystickGUID *guid)
SDL_GameControllerAxis | SDL_GameControllerGetAxisFromString (const char *pchString)
const char * | SDL_GameControllerGetStringForAxis (SDL_GameControllerAxis axis)
SDL_GameControllerButton | SDL_GameControllerGetButtonFromString (const char *pchString)
const char * | SDL_GameControllerGetStringForButton (SDL_GameControllerButton axis)
static void | SDL_PrivateGameControllerParseElement (SDL_GameController *gamecontroller, const char *szGameButton, const char *szJoystickButton)
static void | SDL_PrivateGameControllerParseControllerConfigString (SDL_GameController *gamecontroller, const char *pchString)
static void | SDL_PrivateLoadButtonMapping (SDL_GameController *gamecontroller, SDL_JoystickGUID guid, const char *pchName, const char *pchMapping)
static char * | SDL_PrivateGetControllerGUIDFromMappingString (const char *pMapping)
static char * | SDL_PrivateGetControllerNameFromMappingString (const char *pMapping)
static char * | SDL_PrivateGetControllerMappingFromMappingString (const char *pMapping)
static void | SDL_PrivateGameControllerRefreshMapping (ControllerMapping_t *pControllerMapping)
static ControllerMapping_t * | SDL_PrivateAddMappingForGUID (SDL_JoystickGUID jGUID, const char *mappingString, SDL_bool *existing, SDL_ControllerMappingPriority priority)
static ControllerMapping_t * | SDL_PrivateGetControllerMappingForNameAndGUID (const char *name, SDL_JoystickGUID guid)
static ControllerMapping_t * | SDL_PrivateGetControllerMapping (int device_index)
int | SDL_GameControllerAddMappingsFromRW (SDL_RWops *rw, int freerw)
static int | SDL_PrivateGameControllerAddMapping (const char *mappingString, SDL_ControllerMappingPriority priority)
int | SDL_GameControllerAddMapping (const char *mappingString)
int | SDL_GameControllerNumMappings (void)
char * | SDL_GameControllerMappingForIndex (int mapping_index)
char * | SDL_GameControllerMappingForGUID (SDL_JoystickGUID guid)
char * | SDL_GameControllerMapping (SDL_GameController *gamecontroller)
static void | SDL_GameControllerLoadHints ()
static SDL_bool | SDL_GetControllerMappingFilePath (char *path, size_t size)
int | SDL_GameControllerInitMappings (void)
int | SDL_GameControllerInit (void)
const char * | SDL_GameControllerNameForIndex (int device_index)
SDL_bool | SDL_IsGameControllerNameAndGUID (const char *name, SDL_JoystickGUID guid)
SDL_bool | SDL_IsGameController (int device_index)
SDL_bool | SDL_ShouldIgnoreGameController (const char *name, SDL_JoystickGUID guid)
SDL_GameController * | SDL_GameControllerOpen (int device_index)
void | SDL_GameControllerUpdate (void)
Sint16 | SDL_GameControllerGetAxis (SDL_GameController *gamecontroller, SDL_GameControllerAxis axis)
Uint8 | SDL_GameControllerGetButton (SDL_GameController *gamecontroller, SDL_GameControllerButton button)
const char * | SDL_GameControllerName (SDL_GameController *gamecontroller)
Uint16 | SDL_GameControllerGetVendor (SDL_GameController *gamecontroller)
Uint16 | SDL_GameControllerGetProduct (SDL_GameController *gamecontroller)
Uint16 | SDL_GameControllerGetProductVersion (SDL_GameController *gamecontroller)
SDL_bool | SDL_GameControllerGetAttached (SDL_GameController *gamecontroller)
SDL_Joystick * | SDL_GameControllerGetJoystick (SDL_GameController *gamecontroller)
SDL_GameController * | SDL_GameControllerFromInstanceID (SDL_JoystickID joyid)
SDL_GameControllerButtonBind | SDL_GameControllerGetBindForAxis (SDL_GameController *gamecontroller, SDL_GameControllerAxis axis)
SDL_GameControllerButtonBind | SDL_GameControllerGetBindForButton (SDL_GameController *gamecontroller, SDL_GameControllerButton button)
void | SDL_GameControllerClose (SDL_GameController *gamecontroller)
void | SDL_GameControllerQuit (void)
void | SDL_GameControllerQuitMappings (void)
int | SDL_GameControllerEventState (int state)

## Variables

static SDL_GameController * | SDL_gamecontrollers = NULL
static SDL_JoystickGUID | s_zeroGUID
static ControllerMapping_t * | s_pSupportedControllers = NULL
static ControllerMapping_t * | s_pXInputMapping = NULL
static ControllerMapping_t * | s_pEmscriptenMapping = NULL
static SDL_vidpid_list | SDL_allowed_controllers
static SDL_vidpid_list | SDL_ignored_controllers
static const char * | map_StringForControllerAxis []
static const char * | map_StringForControllerButton []

## Macro Definition Documentation

## SDL_CONTROLLER_PLATFORM_FIELD

#define SDL_CONTROLLER_PLATFORM_FIELD "platform:"

Definition at line 41 of file SDL_gamecontroller.c.

Referenced by SDL_GameControllerAddMappingsFromRW().

## Enumeration Type Documentation

## SDL_ControllerMappingPriority

enum SDL_ControllerMappingPriority

Enumerator
SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT |
SDL_CONTROLLER_MAPPING_PRIORITY_API |
SDL_CONTROLLER_MAPPING_PRIORITY_USER |

Definition at line 82 of file SDL_gamecontroller.c.

{
SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT,
SDL_CONTROLLER_MAPPING_PRIORITY_API,
SDL_CONTROLLER_MAPPING_PRIORITY_USER,
} SDL_ControllerMappingPriority;
SDL_CONTROLLER_MAPPING_PRIORITY_API
Definition: SDL_gamecontroller.c:85
SDL_CONTROLLER_MAPPING_PRIORITY_USER
Definition: SDL_gamecontroller.c:86
SDL_ControllerMappingPriority
SDL_ControllerMappingPriority
Definition: SDL_gamecontroller.c:82
SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT
Definition: SDL_gamecontroller.c:84

## Function Documentation

## HandleJoystickAxis()

static void HandleJoystickAxis | ( | SDL_GameController * | gamecontroller,
|  | int | axis,
|  | int | value
| ) |  |

static

Definition at line 242 of file SDL_gamecontroller.c.

References SDL_ExtendedGameControllerBind::axis, axis, SDL_ExtendedGameControllerBind::button, HasSameOutput(), i, SDL_ExtendedGameControllerBind::input, SDL_ExtendedGameControllerBind::inputType, NULL, SDL_ExtendedGameControllerBind::output, SDL_ExtendedGameControllerBind::outputType, ResetOutput(), SDL_CONTROLLER_BINDTYPE_AXIS, SDL_PRESSED, SDL_PrivateGameControllerAxis(), SDL_PrivateGameControllerButton(), SDL_RELEASED, and state.

Referenced by SDL_GameControllerEventWatcher().

{
int i;
SDL_ExtendedGameControllerBind *last_match = gamecontroller->last_match_axis[axis];
SDL_ExtendedGameControllerBind *match = NULL;
for (i = 0; i < gamecontroller->num_bindings; ++i) {
SDL_ExtendedGameControllerBind *binding = &gamecontroller->bindings[i];
if (binding->inputType == SDL_CONTROLLER_BINDTYPE_AXIS &&
axis == binding->input.axis.axis) {
if (binding->input.axis.axis_min < binding->input.axis.axis_max) {
if (value >= binding->input.axis.axis_min &&
value <= binding->input.axis.axis_max) {
match = binding;
break;
}
} else {
if (value >= binding->input.axis.axis_max &&
value <= binding->input.axis.axis_min) {
match = binding;
break;
}
}
}
}
if (last_match && (!match || !HasSameOutput(last_match, match))) {
/* Clear the last input that this axis generated */
ResetOutput(gamecontroller, last_match);
}
if (match) {
if (match->outputType == SDL_CONTROLLER_BINDTYPE_AXIS) {
if (match->input.axis.axis_min != match->output.axis.axis_min || match->input.axis.axis_max != match->output.axis.axis_max) {
float normalized_value = (float)(value - match->input.axis.axis_min) / (match->input.axis.axis_max - match->input.axis.axis_min);
value = match->output.axis.axis_min + (int)(normalized_value * (match->output.axis.axis_max - match->output.axis.axis_min));
}
SDL_PrivateGameControllerAxis(gamecontroller, match->output.axis.axis, (Sint16)value);
} else {
Uint8 state;
int threshold = match->input.axis.axis_min + (match->input.axis.axis_max - match->input.axis.axis_min) / 2;
if (match->input.axis.axis_max < match->input.axis.axis_min) {
state = (value <= threshold) ? SDL_PRESSED : SDL_RELEASED;
} else {
state = (value >= threshold) ? SDL_PRESSED : SDL_RELEASED;
}
SDL_PrivateGameControllerButton(gamecontroller, match->output.button, state);
}
}
gamecontroller->last_match_axis[axis] = match;
}
SDL_ExtendedGameControllerBind::output
union SDL_ExtendedGameControllerBind::@24 output
ResetOutput
static void ResetOutput(SDL_GameController *gamecontroller, SDL_ExtendedGameControllerBind *bind)
Definition: SDL_gamecontroller.c:233
state
struct xkb_state * state
Definition: SDL_waylandsym.h:113
SDL_ExtendedGameControllerBind::inputType
SDL_GameControllerBindType inputType
Definition: SDL_gamecontroller.c:48
axis
SDL_Texture * axis
Definition: testgamecontroller.c:67
SDL_ExtendedGameControllerBind::input
union SDL_ExtendedGameControllerBind::@23 input
input
GLenum GLenum GLenum input
Definition: SDL_opengl_glext.h:9374
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:157
SDL_ExtendedGameControllerBind::outputType
SDL_GameControllerBindType outputType
Definition: SDL_gamecontroller.c:66
HasSameOutput
static SDL_bool HasSameOutput(SDL_ExtendedGameControllerBind *a, SDL_ExtendedGameControllerBind *b)
Definition: SDL_gamecontroller.c:220
value
GLsizei const GLfloat * value
Definition: SDL_opengl_glext.h:698
SDL_PrivateGameControllerButton
static int SDL_PrivateGameControllerButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button, Uint8 state)
Definition: SDL_gamecontroller.c:1801
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
NULL
#define NULL
Definition: begin_code.h:164
SDL_ExtendedGameControllerBind::button
int button
Definition: SDL_gamecontroller.c:51
SDL_CONTROLLER_BINDTYPE_AXIS
Definition: SDL_gamecontroller.h:65
SDL_PRESSED
#define SDL_PRESSED
Definition: SDL_events.h:50
SDL_RELEASED
#define SDL_RELEASED
Definition: SDL_events.h:49
SDL_PrivateGameControllerAxis
static int SDL_PrivateGameControllerAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis, Sint16 value)
Definition: SDL_gamecontroller.c:1777
Sint16
int16_t Sint16
Definition: SDL_stdinc.h:163
SDL_ExtendedGameControllerBind
Definition: SDL_gamecontroller.c:46
SDL_ExtendedGameControllerBind::axis
int axis
Definition: SDL_gamecontroller.c:54

## HandleJoystickButton()

static void HandleJoystickButton | ( | SDL_GameController * | gamecontroller,
|  | int | button,
|  | Uint8 | state
| ) |  |

static

Definition at line 294 of file SDL_gamecontroller.c.

References SDL_ExtendedGameControllerBind::axis, SDL_ExtendedGameControllerBind::button, i, SDL_ExtendedGameControllerBind::input, SDL_ExtendedGameControllerBind::inputType, SDL_ExtendedGameControllerBind::output, SDL_ExtendedGameControllerBind::outputType, SDL_CONTROLLER_BINDTYPE_AXIS, SDL_CONTROLLER_BINDTYPE_BUTTON, SDL_PrivateGameControllerAxis(), and SDL_PrivateGameControllerButton().

Referenced by SDL_GameControllerEventWatcher().

{
int i;
for (i = 0; i < gamecontroller->num_bindings; ++i) {
SDL_ExtendedGameControllerBind *binding = &gamecontroller->bindings[i];
if (binding->inputType == SDL_CONTROLLER_BINDTYPE_BUTTON &&
button == binding->input.button) {
if (binding->outputType == SDL_CONTROLLER_BINDTYPE_AXIS) {
int value = state ? binding->output.axis.axis_max : binding->output.axis.axis_min;
SDL_PrivateGameControllerAxis(gamecontroller, binding->output.axis.axis, (Sint16)value);
} else {
SDL_PrivateGameControllerButton(gamecontroller, binding->output.button, state);
}
break;
}
}
}
SDL_ExtendedGameControllerBind::output
union SDL_ExtendedGameControllerBind::@24 output
button
SDL_Texture * button
Definition: testgamecontroller.c:67
state
struct xkb_state * state
Definition: SDL_waylandsym.h:113
SDL_ExtendedGameControllerBind::inputType
SDL_GameControllerBindType inputType
Definition: SDL_gamecontroller.c:48
SDL_CONTROLLER_BINDTYPE_BUTTON
Definition: SDL_gamecontroller.h:64
SDL_ExtendedGameControllerBind::input
union SDL_ExtendedGameControllerBind::@23 input
SDL_ExtendedGameControllerBind::outputType
SDL_GameControllerBindType outputType
Definition: SDL_gamecontroller.c:66
value
GLsizei const GLfloat * value
Definition: SDL_opengl_glext.h:698
SDL_PrivateGameControllerButton
static int SDL_PrivateGameControllerButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button, Uint8 state)
Definition: SDL_gamecontroller.c:1801
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_ExtendedGameControllerBind::button
int button
Definition: SDL_gamecontroller.c:51
SDL_CONTROLLER_BINDTYPE_AXIS
Definition: SDL_gamecontroller.h:65
SDL_PrivateGameControllerAxis
static int SDL_PrivateGameControllerAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis, Sint16 value)
Definition: SDL_gamecontroller.c:1777
Sint16
int16_t Sint16
Definition: SDL_stdinc.h:163
SDL_ExtendedGameControllerBind
Definition: SDL_gamecontroller.c:46
SDL_ExtendedGameControllerBind::axis
int axis
Definition: SDL_gamecontroller.c:54

## HandleJoystickHat()

static void HandleJoystickHat | ( | SDL_GameController * | gamecontroller,
|  | int | hat,
|  | Uint8 | value
| ) |  |

static

Definition at line 313 of file SDL_gamecontroller.c.

References SDL_ExtendedGameControllerBind::axis, SDL_ExtendedGameControllerBind::button, SDL_ExtendedGameControllerBind::hat, i, SDL_ExtendedGameControllerBind::input, SDL_ExtendedGameControllerBind::inputType, SDL_ExtendedGameControllerBind::output, SDL_ExtendedGameControllerBind::outputType, ResetOutput(), SDL_CONTROLLER_BINDTYPE_AXIS, SDL_CONTROLLER_BINDTYPE_HAT, SDL_PRESSED, SDL_PrivateGameControllerAxis(), and SDL_PrivateGameControllerButton().

Referenced by SDL_GameControllerEventWatcher().

{
int i;
Uint8 last_mask = gamecontroller->last_hat_mask[hat];
Uint8 changed_mask = (last_mask ^ value);
for (i = 0; i < gamecontroller->num_bindings; ++i) {
SDL_ExtendedGameControllerBind *binding = &gamecontroller->bindings[i];
if (binding->inputType == SDL_CONTROLLER_BINDTYPE_HAT && hat == binding->input.hat.hat) {
if ((changed_mask & binding->input.hat.hat_mask) != 0) {
if (value & binding->input.hat.hat_mask) {
if (binding->outputType == SDL_CONTROLLER_BINDTYPE_AXIS) {
SDL_PrivateGameControllerAxis(gamecontroller, binding->output.axis.axis, (Sint16)binding->output.axis.axis_max);
} else {
SDL_PrivateGameControllerButton(gamecontroller, binding->output.button, SDL_PRESSED);
}
} else {
ResetOutput(gamecontroller, binding);
}
}
}
}
gamecontroller->last_hat_mask[hat] = value;
}
SDL_ExtendedGameControllerBind::output
union SDL_ExtendedGameControllerBind::@24 output
ResetOutput
static void ResetOutput(SDL_GameController *gamecontroller, SDL_ExtendedGameControllerBind *bind)
Definition: SDL_gamecontroller.c:233
SDL_ExtendedGameControllerBind::inputType
SDL_GameControllerBindType inputType
Definition: SDL_gamecontroller.c:48
SDL_ExtendedGameControllerBind::input
union SDL_ExtendedGameControllerBind::@23 input
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:157
SDL_ExtendedGameControllerBind::outputType
SDL_GameControllerBindType outputType
Definition: SDL_gamecontroller.c:66
value
GLsizei const GLfloat * value
Definition: SDL_opengl_glext.h:698
SDL_PrivateGameControllerButton
static int SDL_PrivateGameControllerButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button, Uint8 state)
Definition: SDL_gamecontroller.c:1801
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_ExtendedGameControllerBind::hat
int hat
Definition: SDL_gamecontroller.c:60
SDL_ExtendedGameControllerBind::button
int button
Definition: SDL_gamecontroller.c:51
SDL_CONTROLLER_BINDTYPE_HAT
Definition: SDL_gamecontroller.h:66
SDL_CONTROLLER_BINDTYPE_AXIS
Definition: SDL_gamecontroller.h:65
SDL_PRESSED
#define SDL_PRESSED
Definition: SDL_events.h:50
SDL_PrivateGameControllerAxis
static int SDL_PrivateGameControllerAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis, Sint16 value)
Definition: SDL_gamecontroller.c:1777
Sint16
int16_t Sint16
Definition: SDL_stdinc.h:163
SDL_ExtendedGameControllerBind
Definition: SDL_gamecontroller.c:46
SDL_ExtendedGameControllerBind::axis
int axis
Definition: SDL_gamecontroller.c:54

## HasSameOutput()

static SDL_bool HasSameOutput | ( | SDL_ExtendedGameControllerBind * | a,
|  | SDL_ExtendedGameControllerBind * | b
| ) |  |

static

Definition at line 220 of file SDL_gamecontroller.c.

References SDL_ExtendedGameControllerBind::axis, SDL_ExtendedGameControllerBind::button, SDL_ExtendedGameControllerBind::output, SDL_ExtendedGameControllerBind::outputType, SDL_CONTROLLER_BINDTYPE_AXIS, and SDL_FALSE.

Referenced by HandleJoystickAxis().

{
if (a->outputType != b->outputType) {
return SDL_FALSE;
}
if (a->outputType == SDL_CONTROLLER_BINDTYPE_AXIS) {
return (a->output.axis.axis == b->output.axis.axis);
} else {
return (a->output.button == b->output.button);
}
}
SDL_ExtendedGameControllerBind::output
union SDL_ExtendedGameControllerBind::@24 output
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_ExtendedGameControllerBind::outputType
SDL_GameControllerBindType outputType
Definition: SDL_gamecontroller.c:66
SDL_ExtendedGameControllerBind::button
int button
Definition: SDL_gamecontroller.c:51
SDL_CONTROLLER_BINDTYPE_AXIS
Definition: SDL_gamecontroller.h:65
SDL_ExtendedGameControllerBind::axis
int axis
Definition: SDL_gamecontroller.c:54

## ResetOutput()

static void ResetOutput | ( | SDL_GameController * | gamecontroller,
|  | SDL_ExtendedGameControllerBind * | bind
| ) |  |

static

Definition at line 233 of file SDL_gamecontroller.c.

References SDL_ExtendedGameControllerBind::axis, SDL_ExtendedGameControllerBind::button, SDL_ExtendedGameControllerBind::output, SDL_ExtendedGameControllerBind::outputType, SDL_CONTROLLER_BINDTYPE_AXIS, SDL_PrivateGameControllerAxis(), SDL_PrivateGameControllerButton(), and SDL_RELEASED.

Referenced by HandleJoystickAxis(), and HandleJoystickHat().

{
if (bind->outputType == SDL_CONTROLLER_BINDTYPE_AXIS) {
SDL_PrivateGameControllerAxis(gamecontroller, bind->output.axis.axis, 0);
} else {
SDL_PrivateGameControllerButton(gamecontroller, bind->output.button, SDL_RELEASED);
}
}
SDL_ExtendedGameControllerBind::output
union SDL_ExtendedGameControllerBind::@24 output
SDL_ExtendedGameControllerBind::outputType
SDL_GameControllerBindType outputType
Definition: SDL_gamecontroller.c:66
SDL_PrivateGameControllerButton
static int SDL_PrivateGameControllerButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button, Uint8 state)
Definition: SDL_gamecontroller.c:1801
SDL_ExtendedGameControllerBind::button
int button
Definition: SDL_gamecontroller.c:51
SDL_CONTROLLER_BINDTYPE_AXIS
Definition: SDL_gamecontroller.h:65
SDL_RELEASED
#define SDL_RELEASED
Definition: SDL_events.h:49
SDL_PrivateGameControllerAxis
static int SDL_PrivateGameControllerAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis, Sint16 value)
Definition: SDL_gamecontroller.c:1777
SDL_ExtendedGameControllerBind::axis
int axis
Definition: SDL_gamecontroller.c:54

## SDL_GameControllerAddMapping()

int SDL_GameControllerAddMapping | ( | const char * | mappingString | ) |

Add or update an existing mapping configuration

Returns
  1 if mapping is added, 0 if updated, -1 on error

Definition at line 1065 of file SDL_gamecontroller.c.

References SDL_CONTROLLER_MAPPING_PRIORITY_API, and SDL_PrivateGameControllerAddMapping().

Referenced by SDL_GameControllerAddMappingsFromRW().

{
return SDL_PrivateGameControllerAddMapping(mappingString, SDL_CONTROLLER_MAPPING_PRIORITY_API);
}
SDL_CONTROLLER_MAPPING_PRIORITY_API
Definition: SDL_gamecontroller.c:85
SDL_PrivateGameControllerAddMapping
static int SDL_PrivateGameControllerAddMapping(const char *mappingString, SDL_ControllerMappingPriority priority)
Definition: SDL_gamecontroller.c:1017

## SDL_GameControllerAddMappingsFromRW()

int SDL_GameControllerAddMappingsFromRW | ( | SDL_RWops * | rw,
|  | int | freerw
| ) |  |

To count the number of game controllers in the system for the following: int nJoysticks = SDL_NumJoysticks(); int nGameControllers = 0; for (int i = 0; i < nJoysticks; i++) { if (SDL_IsGameController(i)) { nGameControllers++; } }

Using the SDL_HINT_GAMECONTROLLERCONFIG hint or the SDL_GameControllerAddMapping() you can add support for controllers SDL is unaware of or cause an existing controller to have a different binding. The format is: guid,name,mappings

Where GUID is the string value from SDL_JoystickGetGUIDString(), name is the human readable string for the device and mappings are controller mappings to joystick ones. Under Windows there is a reserved GUID of "xinput" that covers any XInput devices. The mapping format for joystick is: bX - a joystick button, index X hX.Y - hat X with value Y aX - axis X of the joystick Buttons can be used as a controller axis and vice versa.

This string shows an example of a valid mapping for a controller "03000000341a00003608000000000000,PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7", Load a set of mappings from a seekable SDL data stream (memory or file), filtered by the current SDL_GetPlatform() A community sourced database of controllers is available at https://raw.github.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt

If `freerw` is non-zero, the stream will be closed after being read.

Returns
  number of mappings added, -1 on error

Definition at line 946 of file SDL_gamecontroller.c.

References sort_controllers::controllers, NULL, SDL_arraysize, SDL_CONTROLLER_PLATFORM_FIELD, SDL_free, SDL_GameControllerAddMapping(), SDL_GetPlatform, SDL_malloc, SDL_RWclose, SDL_RWread, SDL_RWsize, SDL_SetError, SDL_strchr, SDL_strlcpy, SDL_strlen, SDL_strncasecmp, and SDL_strstr.

{
const char *platform = SDL_GetPlatform();
int controllers = 0;
char *buf, *line, *line_end, *tmp, *comma, line_platform[64];
size_t db_size, platform_len;
if (rw == NULL) {
return SDL_SetError("Invalid RWops");
}
db_size = (size_t)SDL_RWsize(rw);
buf = (char *)SDL_malloc(db_size + 1);
if (buf == NULL) {
if (freerw) {
SDL_RWclose(rw);
}
return SDL_SetError("Could not allocate space to read DB into memory");
}
if (SDL_RWread(rw, buf, db_size, 1) != 1) {
if (freerw) {
SDL_RWclose(rw);
}
SDL_free(buf);
return SDL_SetError("Could not read DB");
}
if (freerw) {
SDL_RWclose(rw);
}
buf[db_size] = '\0';
line = buf;
while (line < buf + db_size) {
line_end = SDL_strchr(line, '\n');
if (line_end != NULL) {
*line_end = '\0';
} else {
line_end = buf + db_size;
}
/* Extract and verify the platform */
tmp = SDL_strstr(line, SDL_CONTROLLER_PLATFORM_FIELD);
if (tmp != NULL) {
tmp += SDL_strlen(SDL_CONTROLLER_PLATFORM_FIELD);
comma = SDL_strchr(tmp, ',');
if (comma != NULL) {
platform_len = comma - tmp + 1;
if (platform_len + 1 < SDL_arraysize(line_platform)) {
SDL_strlcpy(line_platform, tmp, platform_len);
if (SDL_strncasecmp(line_platform, platform, platform_len) == 0 &&
SDL_GameControllerAddMapping(line) > 0) {
controllers++;
}
}
}
}
line = line_end + 1;
}
SDL_free(buf);
return controllers;
}
SDL_strlcpy
#define SDL_strlcpy
Definition: SDL_dynapi_overrides.h:394
SDL_CONTROLLER_PLATFORM_FIELD
#define SDL_CONTROLLER_PLATFORM_FIELD
Definition: SDL_gamecontroller.c:41
SDL_RWsize
#define SDL_RWsize(ctx)
Definition: SDL_rwops.h:184
SDL_RWread
#define SDL_RWread(ctx, ptr, size, n)
Definition: SDL_rwops.h:187
SDL_strncasecmp
#define SDL_strncasecmp
Definition: SDL_dynapi_overrides.h:420
SDL_strchr
#define SDL_strchr
Definition: SDL_dynapi_overrides.h:401
size_t
unsigned int size_t
Definition: SDL_config_windows.h:68
sort_controllers.controllers
list controllers
Definition: sort_controllers.py:12
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
SDL_GameControllerAddMapping
int SDL_GameControllerAddMapping(const char *mappingString)
Definition: SDL_gamecontroller.c:1065
SDL_GetPlatform
#define SDL_GetPlatform
Definition: SDL_dynapi_overrides.h:291
buf
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: SDL_opengl_glext.h:2480
NULL
#define NULL
Definition: begin_code.h:164
SDL_RWclose
#define SDL_RWclose(ctx)
Definition: SDL_rwops.h:189
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_strlen
#define SDL_strlen
Definition: SDL_dynapi_overrides.h:393
SDL_arraysize
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:93
SDL_malloc
#define SDL_malloc
Definition: SDL_dynapi_overrides.h:374
SDL_strstr
#define SDL_strstr
Definition: SDL_dynapi_overrides.h:403

## SDL_GameControllerClose()

void SDL_GameControllerClose | ( | SDL_GameController * | gamecontroller | ) |

Close a controller previously opened with SDL_GameControllerOpen().

Definition at line 1687 of file SDL_gamecontroller.c.

References NULL, SDL_free, SDL_gamecontrollers, SDL_JoystickClose, SDL_LockJoysticks, and SDL_UnlockJoysticks.

Referenced by SDL_GameControllerQuit().

{
SDL_GameController *gamecontrollerlist, *gamecontrollerlistprev;
if (!gamecontroller)
return;
SDL_LockJoysticks();
/* First decrement ref count */
if (--gamecontroller->ref_count > 0) {
SDL_UnlockJoysticks();
return;
}
SDL_JoystickClose(gamecontroller->joystick);
gamecontrollerlist = SDL_gamecontrollers;
gamecontrollerlistprev = NULL;
while (gamecontrollerlist) {
if (gamecontroller == gamecontrollerlist) {
if (gamecontrollerlistprev) {
/* unlink this entry */
gamecontrollerlistprev->next = gamecontrollerlist->next;
} else {
SDL_gamecontrollers = gamecontroller->next;
}
break;
}
gamecontrollerlistprev = gamecontrollerlist;
gamecontrollerlist = gamecontrollerlist->next;
}
SDL_free(gamecontroller->bindings);
SDL_free(gamecontroller->last_match_axis);
SDL_free(gamecontroller->last_hat_mask);
SDL_free(gamecontroller);
SDL_UnlockJoysticks();
}
SDL_UnlockJoysticks
#define SDL_UnlockJoysticks
Definition: SDL_dynapi_overrides.h:639
SDL_JoystickClose
#define SDL_JoystickClose
Definition: SDL_dynapi_overrides.h:215
SDL_gamecontrollers
static SDL_GameController * SDL_gamecontrollers
Definition: SDL_gamecontroller.c:44
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
NULL
#define NULL
Definition: begin_code.h:164
SDL_LockJoysticks
#define SDL_LockJoysticks
Definition: SDL_dynapi_overrides.h:638

## SDL_GameControllerEventState()

int SDL_GameControllerEventState | ( | int | state | ) |

Enable/disable controller event polling.

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

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

Definition at line 1840 of file SDL_gamecontroller.c.

References i, SDL_arraysize, SDL_CONTROLLERAXISMOTION, SDL_CONTROLLERBUTTONDOWN, SDL_CONTROLLERBUTTONUP, SDL_CONTROLLERDEVICEADDED, SDL_CONTROLLERDEVICEREMAPPED, SDL_CONTROLLERDEVICEREMOVED, SDL_ENABLE, SDL_EventState, SDL_IGNORE, and SDL_QUERY.

{
#if SDL_EVENTS_DISABLED
return SDL_IGNORE;
#else
const Uint32 event_list[] = {
SDL_CONTROLLERAXISMOTION, SDL_CONTROLLERBUTTONDOWN, SDL_CONTROLLERBUTTONUP,
SDL_CONTROLLERDEVICEADDED, SDL_CONTROLLERDEVICEREMOVED, SDL_CONTROLLERDEVICEREMAPPED,
};
unsigned int i;
switch (state) {
case SDL_QUERY:
state = SDL_IGNORE;
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_CONTROLLERDEVICEREMOVED
Definition: SDL_events.h:121
state
struct xkb_state * state
Definition: SDL_waylandsym.h:113
SDL_ENABLE
#define SDL_ENABLE
Definition: SDL_events.h:722
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_CONTROLLERDEVICEADDED
Definition: SDL_events.h:120
SDL_CONTROLLERBUTTONUP
Definition: SDL_events.h:119
SDL_CONTROLLERBUTTONDOWN
Definition: SDL_events.h:118
SDL_CONTROLLERDEVICEREMAPPED
Definition: SDL_events.h:122
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_EventState
#define SDL_EventState
Definition: SDL_dynapi_overrides.h:131
SDL_arraysize
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:93
SDL_QUERY
#define SDL_QUERY
Definition: SDL_events.h:719
SDL_CONTROLLERAXISMOTION
Definition: SDL_events.h:117
SDL_IGNORE
#define SDL_IGNORE
Definition: SDL_events.h:720

## SDL_GameControllerEventWatcher()

static int SDL_GameControllerEventWatcher | ( | void * | userdata,
|  | SDL_Event * | event
| ) |  |

static

Definition at line 341 of file SDL_gamecontroller.c.

References SDL_JoyAxisEvent::axis, SDL_JoyButtonEvent::button, SDL_Event::cdevice, HandleJoystickAxis(), HandleJoystickButton(), HandleJoystickHat(), SDL_JoyHatEvent::hat, SDL_Event::jaxis, SDL_Event::jbutton, SDL_Event::jdevice, SDL_Event::jhat, SDL_CONTROLLERDEVICEADDED, SDL_CONTROLLERDEVICEREMOVED, SDL_gamecontrollers, SDL_IsGameController(), SDL_JOYAXISMOTION, SDL_JOYBUTTONDOWN, SDL_JOYBUTTONUP, SDL_JOYDEVICEADDED, SDL_JOYDEVICEREMOVED, SDL_JOYHATMOTION, SDL_PushEvent, SDL_JoyButtonEvent::state, SDL_Event::type, UpdateEventsForDeviceRemoval(), SDL_JoyAxisEvent::value, SDL_JoyHatEvent::value, SDL_JoyAxisEvent::which, SDL_JoyHatEvent::which, SDL_JoyButtonEvent::which, SDL_JoyDeviceEvent::which, and SDL_ControllerDeviceEvent::which.

Referenced by SDL_GameControllerInit(), and SDL_GameControllerQuitMappings().

{
switch(event->type) {
case SDL_JOYAXISMOTION:
{
SDL_GameController *controllerlist = SDL_gamecontrollers;
while (controllerlist) {
if (controllerlist->joystick->instance_id == event->jaxis.which) {
HandleJoystickAxis(controllerlist, event->jaxis.axis, event->jaxis.value);
break;
}
controllerlist = controllerlist->next;
}
}
break;
case SDL_JOYBUTTONDOWN:
case SDL_JOYBUTTONUP:
{
SDL_GameController *controllerlist = SDL_gamecontrollers;
while (controllerlist) {
if (controllerlist->joystick->instance_id == event->jbutton.which) {
HandleJoystickButton(controllerlist, event->jbutton.button, event->jbutton.state);
break;
}
controllerlist = controllerlist->next;
}
}
break;
case SDL_JOYHATMOTION:
{
SDL_GameController *controllerlist = SDL_gamecontrollers;
while (controllerlist) {
if (controllerlist->joystick->instance_id == event->jhat.which) {
HandleJoystickHat(controllerlist, event->jhat.hat, event->jhat.value);
break;
}
controllerlist = controllerlist->next;
}
}
break;
case SDL_JOYDEVICEADDED:
{
if (SDL_IsGameController(event->jdevice.which)) {
SDL_Event deviceevent;
deviceevent.type = SDL_CONTROLLERDEVICEADDED;
deviceevent.cdevice.which = event->jdevice.which;
SDL_PushEvent(&deviceevent);
}
}
break;
case SDL_JOYDEVICEREMOVED:
{
SDL_GameController *controllerlist = SDL_gamecontrollers;
while (controllerlist) {
if (controllerlist->joystick->instance_id == event->jdevice.which) {
SDL_Event deviceevent;
deviceevent.type = SDL_CONTROLLERDEVICEREMOVED;
deviceevent.cdevice.which = event->jdevice.which;
SDL_PushEvent(&deviceevent);
UpdateEventsForDeviceRemoval();
break;
}
controllerlist = controllerlist->next;
}
}
break;
default:
break;
}
return 1;
}
SDL_JOYBUTTONUP
Definition: SDL_events.h:112
SDL_JoyAxisEvent::value
Sint16 value
Definition: SDL_events.h:288
SDL_JoyButtonEvent::which
SDL_JoystickID which
Definition: SDL_events.h:335
SDL_JOYHATMOTION
Definition: SDL_events.h:110
SDL_Event::jdevice
SDL_JoyDeviceEvent jdevice
Definition: SDL_events.h:540
SDL_JoyAxisEvent::axis
Uint8 axis
Definition: SDL_events.h:284
HandleJoystickHat
static void HandleJoystickHat(SDL_GameController *gamecontroller, int hat, Uint8 value)
Definition: SDL_gamecontroller.c:313
SDL_CONTROLLERDEVICEREMOVED
Definition: SDL_events.h:121
SDL_Event::cdevice
SDL_ControllerDeviceEvent cdevice
Definition: SDL_events.h:543
SDL_Event::jbutton
SDL_JoyButtonEvent jbutton
Definition: SDL_events.h:539
UpdateEventsForDeviceRemoval
static void UpdateEventsForDeviceRemoval()
Definition: SDL_gamecontroller.c:196
SDL_JOYDEVICEADDED
Definition: SDL_events.h:113
SDL_JoyAxisEvent::which
SDL_JoystickID which
Definition: SDL_events.h:283
SDL_JoyButtonEvent::state
Uint8 state
Definition: SDL_events.h:337
SDL_JOYAXISMOTION
Definition: SDL_events.h:108
SDL_CONTROLLERDEVICEADDED
Definition: SDL_events.h:120
SDL_ControllerDeviceEvent::which
Sint32 which
Definition: SDL_events.h:392
SDL_JOYDEVICEREMOVED
Definition: SDL_events.h:114
SDL_JOYBUTTONDOWN
Definition: SDL_events.h:111
SDL_gamecontrollers
static SDL_GameController * SDL_gamecontrollers
Definition: SDL_gamecontroller.c:44
SDL_Event::jaxis
SDL_JoyAxisEvent jaxis
Definition: SDL_events.h:536
SDL_PushEvent
#define SDL_PushEvent
Definition: SDL_dynapi_overrides.h:125
HandleJoystickButton
static void HandleJoystickButton(SDL_GameController *gamecontroller, int button, Uint8 state)
Definition: SDL_gamecontroller.c:294
SDL_IsGameController
SDL_bool SDL_IsGameController(int device_index)
Definition: SDL_gamecontroller.c:1289
SDL_JoyHatEvent::hat
Uint8 hat
Definition: SDL_events.h:316
SDL_JoyDeviceEvent::which
Sint32 which
Definition: SDL_events.h:349
SDL_JoyHatEvent::value
Uint8 value
Definition: SDL_events.h:317
SDL_Event
General event structure.
Definition: SDL_events.h:525
SDL_Event::jhat
SDL_JoyHatEvent jhat
Definition: SDL_events.h:538
SDL_JoyButtonEvent::button
Uint8 button
Definition: SDL_events.h:336
SDL_JoyHatEvent::which
SDL_JoystickID which
Definition: SDL_events.h:315
HandleJoystickAxis
static void HandleJoystickAxis(SDL_GameController *gamecontroller, int axis, int value)
Definition: SDL_gamecontroller.c:242
SDL_Event::type
Uint32 type
Definition: SDL_events.h:527

## SDL_GameControllerFromInstanceID()

SDL_GameController* SDL_GameControllerFromInstanceID | ( | SDL_JoystickID | joyid | ) |

Return the SDL_GameController associated with an instance id.

Definition at line 1605 of file SDL_gamecontroller.c.

References NULL, SDL_gamecontrollers, SDL_LockJoysticks, and SDL_UnlockJoysticks.

{
SDL_GameController *gamecontroller;
SDL_LockJoysticks();
gamecontroller = SDL_gamecontrollers;
while (gamecontroller) {
if (gamecontroller->joystick->instance_id == joyid) {
SDL_UnlockJoysticks();
return gamecontroller;
}
gamecontroller = gamecontroller->next;
}
SDL_UnlockJoysticks();
return NULL;
}
SDL_UnlockJoysticks
#define SDL_UnlockJoysticks
Definition: SDL_dynapi_overrides.h:639
SDL_gamecontrollers
static SDL_GameController * SDL_gamecontrollers
Definition: SDL_gamecontroller.c:44
NULL
#define NULL
Definition: begin_code.h:164
SDL_LockJoysticks
#define SDL_LockJoysticks
Definition: SDL_dynapi_overrides.h:638

## SDL_GameControllerGetAttached()

SDL_bool SDL_GameControllerGetAttached | ( | SDL_GameController * | gamecontroller | ) |

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

Definition at line 1581 of file SDL_gamecontroller.c.

References SDL_FALSE, and SDL_JoystickGetAttached.

{
if (!gamecontroller)
return SDL_FALSE;
return SDL_JoystickGetAttached(gamecontroller->joystick);
}
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_JoystickGetAttached
#define SDL_JoystickGetAttached
Definition: SDL_dynapi_overrides.h:203

## SDL_GameControllerGetAxis()

Sint16 SDL_GameControllerGetAxis | ( | SDL_GameController * | gamecontroller,
|  | SDL_GameControllerAxis | axis
| ) |  |

Get the current state of an axis control on a game controller.

The state is a value ranging from -32768 to 32767 (except for the triggers, which range from 0 to 32767).

The axis indices start at index 0.

Definition at line 1455 of file SDL_gamecontroller.c.

References SDL_ExtendedGameControllerBind::axis, SDL_ExtendedGameControllerBind::button, SDL_ExtendedGameControllerBind::hat, i, SDL_ExtendedGameControllerBind::input, SDL_ExtendedGameControllerBind::inputType, SDL_ExtendedGameControllerBind::output, SDL_ExtendedGameControllerBind::outputType, SDL_CONTROLLER_BINDTYPE_AXIS, SDL_CONTROLLER_BINDTYPE_BUTTON, SDL_CONTROLLER_BINDTYPE_HAT, SDL_JoystickGetAxis, SDL_JoystickGetButton, SDL_JoystickGetHat, and SDL_PRESSED.

{
int i;
if (!gamecontroller)
return 0;
for (i = 0; i < gamecontroller->num_bindings; ++i) {
SDL_ExtendedGameControllerBind *binding = &gamecontroller->bindings[i];
if (binding->outputType == SDL_CONTROLLER_BINDTYPE_AXIS && binding->output.axis.axis == axis) {
int value = 0;
SDL_bool valid_input_range;
SDL_bool valid_output_range;
if (binding->inputType == SDL_CONTROLLER_BINDTYPE_AXIS) {
value = SDL_JoystickGetAxis(gamecontroller->joystick, binding->input.axis.axis);
if (binding->input.axis.axis_min < binding->input.axis.axis_max) {
valid_input_range = (value >= binding->input.axis.axis_min && value <= binding->input.axis.axis_max);
} else {
valid_input_range = (value >= binding->input.axis.axis_max && value <= binding->input.axis.axis_min);
}
if (valid_input_range) {
if (binding->input.axis.axis_min != binding->output.axis.axis_min || binding->input.axis.axis_max != binding->output.axis.axis_max) {
float normalized_value = (float)(value - binding->input.axis.axis_min) / (binding->input.axis.axis_max - binding->input.axis.axis_min);
value = binding->output.axis.axis_min + (int)(normalized_value * (binding->output.axis.axis_max - binding->output.axis.axis_min));
}
}
} else if (binding->inputType == SDL_CONTROLLER_BINDTYPE_BUTTON) {
value = SDL_JoystickGetButton(gamecontroller->joystick, binding->input.button);
if (value == SDL_PRESSED) {
value = binding->output.axis.axis_max;
}
} else if (binding->inputType == SDL_CONTROLLER_BINDTYPE_HAT) {
int hat_mask = SDL_JoystickGetHat(gamecontroller->joystick, binding->input.hat.hat);
if (hat_mask & binding->input.hat.hat_mask) {
value = binding->output.axis.axis_max;
}
}
if (binding->output.axis.axis_min < binding->output.axis.axis_max) {
valid_output_range = (value >= binding->output.axis.axis_min && value <= binding->output.axis.axis_max);
} else {
valid_output_range = (value >= binding->output.axis.axis_max && value <= binding->output.axis.axis_min);
}
/* If the value is zero, there might be another binding that makes it non-zero */
if (value != 0 && valid_output_range) {
return (Sint16)value;
}
}
}
return 0;
}
SDL_ExtendedGameControllerBind::output
union SDL_ExtendedGameControllerBind::@24 output
SDL_JoystickGetButton
#define SDL_JoystickGetButton
Definition: SDL_dynapi_overrides.h:214
SDL_ExtendedGameControllerBind::inputType
SDL_GameControllerBindType inputType
Definition: SDL_gamecontroller.c:48
SDL_CONTROLLER_BINDTYPE_BUTTON
Definition: SDL_gamecontroller.h:64
axis
SDL_Texture * axis
Definition: testgamecontroller.c:67
SDL_JoystickGetHat
#define SDL_JoystickGetHat
Definition: SDL_dynapi_overrides.h:212
SDL_ExtendedGameControllerBind::input
union SDL_ExtendedGameControllerBind::@23 input
SDL_ExtendedGameControllerBind::outputType
SDL_GameControllerBindType outputType
Definition: SDL_gamecontroller.c:66
value
GLsizei const GLfloat * value
Definition: SDL_opengl_glext.h:698
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:139
SDL_ExtendedGameControllerBind::hat
int hat
Definition: SDL_gamecontroller.c:60
SDL_JoystickGetAxis
#define SDL_JoystickGetAxis
Definition: SDL_dynapi_overrides.h:211
SDL_ExtendedGameControllerBind::button
int button
Definition: SDL_gamecontroller.c:51
SDL_CONTROLLER_BINDTYPE_HAT
Definition: SDL_gamecontroller.h:66
SDL_CONTROLLER_BINDTYPE_AXIS
Definition: SDL_gamecontroller.h:65
SDL_PRESSED
#define SDL_PRESSED
Definition: SDL_events.h:50
Sint16
int16_t Sint16
Definition: SDL_stdinc.h:163
SDL_ExtendedGameControllerBind
Definition: SDL_gamecontroller.c:46
SDL_ExtendedGameControllerBind::axis
int axis
Definition: SDL_gamecontroller.c:54

## SDL_GameControllerGetAxisFromString()

SDL_GameControllerAxis SDL_GameControllerGetAxisFromString | ( | const char * | pchString | ) |

turn this string into a axis mapping

Definition at line 444 of file SDL_gamecontroller.c.

References map_StringForControllerAxis, SDL_CONTROLLER_AXIS_INVALID, and SDL_strcasecmp.

Referenced by SDL_PrivateGameControllerParseElement().

{
int entry;
if (pchString && (*pchString == '+' || *pchString == '-')) {
++pchString;
}
if (!pchString || !pchString[0]) {
return SDL_CONTROLLER_AXIS_INVALID;
}
for (entry = 0; map_StringForControllerAxis[entry]; ++entry) {
if (!SDL_strcasecmp(pchString, map_StringForControllerAxis[entry]))
return (SDL_GameControllerAxis) entry;
}
return SDL_CONTROLLER_AXIS_INVALID;
}
map_StringForControllerAxis
static const char * map_StringForControllerAxis[]
Definition: SDL_gamecontroller.c:431
SDL_strcasecmp
#define SDL_strcasecmp
Definition: SDL_dynapi_overrides.h:419
SDL_CONTROLLER_AXIS_INVALID
Definition: SDL_gamecontroller.h:259
SDL_GameControllerAxis
SDL_GameControllerAxis
Definition: SDL_gamecontroller.h:257

## SDL_GameControllerGetBindForAxis()

SDL_GameControllerButtonBind SDL_GameControllerGetBindForAxis | ( | SDL_GameController * | gamecontroller,
|  | SDL_GameControllerAxis | axis
| ) |  |

Get the SDL joystick layer binding for this controller button mapping

Definition at line 1626 of file SDL_gamecontroller.c.

References SDL_ExtendedGameControllerBind::axis, SDL_GameControllerButtonBind::axis, SDL_GameControllerButtonBind::bindType, SDL_ExtendedGameControllerBind::button, SDL_GameControllerButtonBind::button, SDL_ExtendedGameControllerBind::hat, SDL_GameControllerButtonBind::hat, i, SDL_ExtendedGameControllerBind::input, SDL_ExtendedGameControllerBind::inputType, SDL_ExtendedGameControllerBind::output, SDL_ExtendedGameControllerBind::outputType, SDL_CONTROLLER_AXIS_INVALID, SDL_CONTROLLER_BINDTYPE_AXIS, SDL_CONTROLLER_BINDTYPE_BUTTON, SDL_CONTROLLER_BINDTYPE_HAT, SDL_zero, and SDL_GameControllerButtonBind::value.

{
int i;
SDL_GameControllerButtonBind bind;
SDL_zero(bind);
if (!gamecontroller || axis == SDL_CONTROLLER_AXIS_INVALID)
return bind;
for (i = 0; i < gamecontroller->num_bindings; ++i) {
SDL_ExtendedGameControllerBind *binding = &gamecontroller->bindings[i];
if (binding->outputType == SDL_CONTROLLER_BINDTYPE_AXIS && binding->output.axis.axis == axis) {
bind.bindType = binding->inputType;
if (binding->inputType == SDL_CONTROLLER_BINDTYPE_AXIS) {
/* FIXME: There might be multiple axes bound now that we have axis ranges... */
bind.value.axis = binding->input.axis.axis;
} else if (binding->inputType == SDL_CONTROLLER_BINDTYPE_BUTTON) {
bind.value.button = binding->input.button;
} else if (binding->inputType == SDL_CONTROLLER_BINDTYPE_HAT) {
bind.value.hat.hat = binding->input.hat.hat;
bind.value.hat.hat_mask = binding->input.hat.hat_mask;
}
break;
}
}
return bind;
}
SDL_ExtendedGameControllerBind::output
union SDL_ExtendedGameControllerBind::@24 output
SDL_GameControllerButtonBind::button
int button
Definition: SDL_gamecontroller.h:77
SDL_ExtendedGameControllerBind::inputType
SDL_GameControllerBindType inputType
Definition: SDL_gamecontroller.c:48
SDL_GameControllerButtonBind
Definition: SDL_gamecontroller.h:72
SDL_CONTROLLER_BINDTYPE_BUTTON
Definition: SDL_gamecontroller.h:64
axis
SDL_Texture * axis
Definition: testgamecontroller.c:67
SDL_ExtendedGameControllerBind::input
union SDL_ExtendedGameControllerBind::@23 input
SDL_GameControllerButtonBind::bindType
SDL_GameControllerBindType bindType
Definition: SDL_gamecontroller.h:74
SDL_ExtendedGameControllerBind::outputType
SDL_GameControllerBindType outputType
Definition: SDL_gamecontroller.c:66
SDL_zero
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
SDL_CONTROLLER_AXIS_INVALID
Definition: SDL_gamecontroller.h:259
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_ExtendedGameControllerBind::hat
int hat
Definition: SDL_gamecontroller.c:60
SDL_GameControllerButtonBind::axis
int axis
Definition: SDL_gamecontroller.h:78
SDL_GameControllerButtonBind::value
union SDL_GameControllerButtonBind::@0 value
SDL_ExtendedGameControllerBind::button
int button
Definition: SDL_gamecontroller.c:51
SDL_CONTROLLER_BINDTYPE_HAT
Definition: SDL_gamecontroller.h:66
SDL_CONTROLLER_BINDTYPE_AXIS
Definition: SDL_gamecontroller.h:65
SDL_GameControllerButtonBind::hat
int hat
Definition: SDL_gamecontroller.h:80
SDL_ExtendedGameControllerBind
Definition: SDL_gamecontroller.c:46
SDL_ExtendedGameControllerBind::axis
int axis
Definition: SDL_gamecontroller.c:54

## SDL_GameControllerGetBindForButton()

SDL_GameControllerButtonBind SDL_GameControllerGetBindForButton | ( | SDL_GameController * | gamecontroller,
|  | SDL_GameControllerButton | button
| ) |  |

Get the SDL joystick layer binding for this controller button mapping

Definition at line 1658 of file SDL_gamecontroller.c.

References SDL_ExtendedGameControllerBind::axis, SDL_GameControllerButtonBind::axis, SDL_GameControllerButtonBind::bindType, SDL_ExtendedGameControllerBind::button, SDL_GameControllerButtonBind::button, SDL_ExtendedGameControllerBind::hat, SDL_GameControllerButtonBind::hat, i, SDL_ExtendedGameControllerBind::input, SDL_ExtendedGameControllerBind::inputType, SDL_ExtendedGameControllerBind::output, SDL_ExtendedGameControllerBind::outputType, SDL_CONTROLLER_BINDTYPE_AXIS, SDL_CONTROLLER_BINDTYPE_BUTTON, SDL_CONTROLLER_BINDTYPE_HAT, SDL_CONTROLLER_BUTTON_INVALID, SDL_zero, and SDL_GameControllerButtonBind::value.

{
int i;
SDL_GameControllerButtonBind bind;
SDL_zero(bind);
if (!gamecontroller || button == SDL_CONTROLLER_BUTTON_INVALID)
return bind;
for (i = 0; i < gamecontroller->num_bindings; ++i) {
SDL_ExtendedGameControllerBind *binding = &gamecontroller->bindings[i];
if (binding->outputType == SDL_CONTROLLER_BINDTYPE_BUTTON && binding->output.button == button) {
bind.bindType = binding->inputType;
if (binding->inputType == SDL_CONTROLLER_BINDTYPE_AXIS) {
bind.value.axis = binding->input.axis.axis;
} else if (binding->inputType == SDL_CONTROLLER_BINDTYPE_BUTTON) {
bind.value.button = binding->input.button;
} else if (binding->inputType == SDL_CONTROLLER_BINDTYPE_HAT) {
bind.value.hat.hat = binding->input.hat.hat;
bind.value.hat.hat_mask = binding->input.hat.hat_mask;
}
break;
}
}
return bind;
}
SDL_CONTROLLER_BUTTON_INVALID
Definition: SDL_gamecontroller.h:303
SDL_ExtendedGameControllerBind::output
union SDL_ExtendedGameControllerBind::@24 output
SDL_GameControllerButtonBind::button
int button
Definition: SDL_gamecontroller.h:77
button
SDL_Texture * button
Definition: testgamecontroller.c:67
SDL_ExtendedGameControllerBind::inputType
SDL_GameControllerBindType inputType
Definition: SDL_gamecontroller.c:48
SDL_GameControllerButtonBind
Definition: SDL_gamecontroller.h:72
SDL_CONTROLLER_BINDTYPE_BUTTON
Definition: SDL_gamecontroller.h:64
SDL_ExtendedGameControllerBind::input
union SDL_ExtendedGameControllerBind::@23 input
SDL_GameControllerButtonBind::bindType
SDL_GameControllerBindType bindType
Definition: SDL_gamecontroller.h:74
SDL_ExtendedGameControllerBind::outputType
SDL_GameControllerBindType outputType
Definition: SDL_gamecontroller.c:66
SDL_zero
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_ExtendedGameControllerBind::hat
int hat
Definition: SDL_gamecontroller.c:60
SDL_GameControllerButtonBind::axis
int axis
Definition: SDL_gamecontroller.h:78
SDL_GameControllerButtonBind::value
union SDL_GameControllerButtonBind::@0 value
SDL_ExtendedGameControllerBind::button
int button
Definition: SDL_gamecontroller.c:51
SDL_CONTROLLER_BINDTYPE_HAT
Definition: SDL_gamecontroller.h:66
SDL_CONTROLLER_BINDTYPE_AXIS
Definition: SDL_gamecontroller.h:65
SDL_GameControllerButtonBind::hat
int hat
Definition: SDL_gamecontroller.h:80
SDL_ExtendedGameControllerBind
Definition: SDL_gamecontroller.c:46
SDL_ExtendedGameControllerBind::axis
int axis
Definition: SDL_gamecontroller.c:54

## SDL_GameControllerGetButton()

Uint8 SDL_GameControllerGetButton | ( | SDL_GameController * | gamecontroller,
|  | SDL_GameControllerButton | button
| ) |  |

Get the current state of a button on a game controller.

The button indices start at index 0.

Definition at line 1512 of file SDL_gamecontroller.c.

References SDL_ExtendedGameControllerBind::axis, SDL_ExtendedGameControllerBind::button, SDL_ExtendedGameControllerBind::hat, i, SDL_ExtendedGameControllerBind::input, SDL_ExtendedGameControllerBind::inputType, SDL_ExtendedGameControllerBind::output, SDL_ExtendedGameControllerBind::outputType, SDL_CONTROLLER_BINDTYPE_AXIS, SDL_CONTROLLER_BINDTYPE_BUTTON, SDL_CONTROLLER_BINDTYPE_HAT, SDL_JoystickGetAxis, SDL_JoystickGetButton, SDL_JoystickGetHat, SDL_PRESSED, and SDL_RELEASED.

{
int i;
if (!gamecontroller)
return 0;
for (i = 0; i < gamecontroller->num_bindings; ++i) {
SDL_ExtendedGameControllerBind *binding = &gamecontroller->bindings[i];
if (binding->outputType == SDL_CONTROLLER_BINDTYPE_BUTTON && binding->output.button == button) {
if (binding->inputType == SDL_CONTROLLER_BINDTYPE_AXIS) {
SDL_bool valid_input_range;
int value = SDL_JoystickGetAxis(gamecontroller->joystick, binding->input.axis.axis);
int threshold = binding->input.axis.axis_min + (binding->input.axis.axis_max - binding->input.axis.axis_min) / 2;
if (binding->input.axis.axis_min < binding->input.axis.axis_max) {
valid_input_range = (value >= binding->input.axis.axis_min && value <= binding->input.axis.axis_max);
if (valid_input_range) {
return (value >= threshold) ? SDL_PRESSED : SDL_RELEASED;
}
} else {
valid_input_range = (value >= binding->input.axis.axis_max && value <= binding->input.axis.axis_min);
if (valid_input_range) {
return (value <= threshold) ? SDL_PRESSED : SDL_RELEASED;
}
}
} else if (binding->inputType == SDL_CONTROLLER_BINDTYPE_BUTTON) {
return SDL_JoystickGetButton(gamecontroller->joystick, binding->input.button);
} else if (binding->inputType == SDL_CONTROLLER_BINDTYPE_HAT) {
int hat_mask = SDL_JoystickGetHat(gamecontroller->joystick, binding->input.hat.hat);
return (hat_mask & binding->input.hat.hat_mask) ? SDL_PRESSED : SDL_RELEASED;
}
}
}
return SDL_RELEASED;
}
SDL_ExtendedGameControllerBind::output
union SDL_ExtendedGameControllerBind::@24 output
SDL_JoystickGetButton
#define SDL_JoystickGetButton
Definition: SDL_dynapi_overrides.h:214
button
SDL_Texture * button
Definition: testgamecontroller.c:67
SDL_ExtendedGameControllerBind::inputType
SDL_GameControllerBindType inputType
Definition: SDL_gamecontroller.c:48
SDL_CONTROLLER_BINDTYPE_BUTTON
Definition: SDL_gamecontroller.h:64
SDL_JoystickGetHat
#define SDL_JoystickGetHat
Definition: SDL_dynapi_overrides.h:212
SDL_ExtendedGameControllerBind::input
union SDL_ExtendedGameControllerBind::@23 input
SDL_ExtendedGameControllerBind::outputType
SDL_GameControllerBindType outputType
Definition: SDL_gamecontroller.c:66
value
GLsizei const GLfloat * value
Definition: SDL_opengl_glext.h:698
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:139
SDL_ExtendedGameControllerBind::hat
int hat
Definition: SDL_gamecontroller.c:60
SDL_JoystickGetAxis
#define SDL_JoystickGetAxis
Definition: SDL_dynapi_overrides.h:211
SDL_ExtendedGameControllerBind::button
int button
Definition: SDL_gamecontroller.c:51
SDL_CONTROLLER_BINDTYPE_HAT
Definition: SDL_gamecontroller.h:66
SDL_CONTROLLER_BINDTYPE_AXIS
Definition: SDL_gamecontroller.h:65
SDL_PRESSED
#define SDL_PRESSED
Definition: SDL_events.h:50
SDL_RELEASED
#define SDL_RELEASED
Definition: SDL_events.h:49
SDL_ExtendedGameControllerBind
Definition: SDL_gamecontroller.c:46
SDL_ExtendedGameControllerBind::axis
int axis
Definition: SDL_gamecontroller.c:54

## SDL_GameControllerGetButtonFromString()

SDL_GameControllerButton SDL_GameControllerGetButtonFromString | ( | const char * | pchString | ) |

turn this string into a button mapping

Definition at line 496 of file SDL_gamecontroller.c.

References map_StringForControllerButton, SDL_CONTROLLER_BUTTON_INVALID, and SDL_strcasecmp.

Referenced by SDL_PrivateGameControllerParseElement().

{
int entry;
if (!pchString || !pchString[0])
return SDL_CONTROLLER_BUTTON_INVALID;
for (entry = 0; map_StringForControllerButton[entry]; ++entry) {
if (SDL_strcasecmp(pchString, map_StringForControllerButton[entry]) == 0)
return (SDL_GameControllerButton) entry;
}
return SDL_CONTROLLER_BUTTON_INVALID;
}
SDL_CONTROLLER_BUTTON_INVALID
Definition: SDL_gamecontroller.h:303
SDL_GameControllerButton
SDL_GameControllerButton
Definition: SDL_gamecontroller.h:301
SDL_strcasecmp
#define SDL_strcasecmp
Definition: SDL_dynapi_overrides.h:419
map_StringForControllerButton
static const char * map_StringForControllerButton[]
Definition: SDL_gamecontroller.c:474

## SDL_GameControllerGetJoystick()

SDL_Joystick* SDL_GameControllerGetJoystick | ( | SDL_GameController * | gamecontroller | ) |

Get the underlying joystick object used by a controller

Definition at line 1592 of file SDL_gamecontroller.c.

References NULL.

Referenced by SDL_GameControllerGetProduct(), SDL_GameControllerGetProductVersion(), and SDL_GameControllerGetVendor().

{
if (!gamecontroller)
return NULL;
return gamecontroller->joystick;
}
NULL
#define NULL
Definition: begin_code.h:164

## SDL_GameControllerGetProduct()

Uint16 SDL_GameControllerGetProduct | ( | SDL_GameController * | gamecontroller | ) |

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

Definition at line 1565 of file SDL_gamecontroller.c.

References SDL_GameControllerGetJoystick(), and SDL_JoystickGetProduct.

{
return SDL_JoystickGetProduct(SDL_GameControllerGetJoystick(gamecontroller));
}
SDL_JoystickGetProduct
#define SDL_JoystickGetProduct
Definition: SDL_dynapi_overrides.h:613
SDL_GameControllerGetJoystick
SDL_Joystick * SDL_GameControllerGetJoystick(SDL_GameController *gamecontroller)
Definition: SDL_gamecontroller.c:1592

## SDL_GameControllerGetProductVersion()

Uint16 SDL_GameControllerGetProductVersion | ( | SDL_GameController * | gamecontroller | ) |

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

Definition at line 1571 of file SDL_gamecontroller.c.

References SDL_GameControllerGetJoystick(), and SDL_JoystickGetProductVersion.

{
return SDL_JoystickGetProductVersion(SDL_GameControllerGetJoystick(gamecontroller));
}
SDL_GameControllerGetJoystick
SDL_Joystick * SDL_GameControllerGetJoystick(SDL_GameController *gamecontroller)
Definition: SDL_gamecontroller.c:1592
SDL_JoystickGetProductVersion
#define SDL_JoystickGetProductVersion
Definition: SDL_dynapi_overrides.h:614

## SDL_GameControllerGetStringForAxis()

const char* SDL_GameControllerGetStringForAxis | ( | SDL_GameControllerAxis | axis | ) |

turn this axis enum into a string mapping

Definition at line 466 of file SDL_gamecontroller.c.

References axis, map_StringForControllerAxis, NULL, SDL_CONTROLLER_AXIS_INVALID, and SDL_CONTROLLER_AXIS_MAX.

{
if (axis > SDL_CONTROLLER_AXIS_INVALID && axis < SDL_CONTROLLER_AXIS_MAX) {
return map_StringForControllerAxis[axis];
}
return NULL;
}
map_StringForControllerAxis
static const char * map_StringForControllerAxis[]
Definition: SDL_gamecontroller.c:431
SDL_CONTROLLER_AXIS_MAX
Definition: SDL_gamecontroller.h:266
axis
SDL_Texture * axis
Definition: testgamecontroller.c:67
SDL_CONTROLLER_AXIS_INVALID
Definition: SDL_gamecontroller.h:259
NULL
#define NULL
Definition: begin_code.h:164

## SDL_GameControllerGetStringForButton()

const char* SDL_GameControllerGetStringForButton | ( | SDL_GameControllerButton | button | ) |

turn this button enum into a string mapping

Definition at line 512 of file SDL_gamecontroller.c.

References axis, map_StringForControllerButton, NULL, SDL_CONTROLLER_BUTTON_INVALID, and SDL_CONTROLLER_BUTTON_MAX.

{
if (axis > SDL_CONTROLLER_BUTTON_INVALID && axis < SDL_CONTROLLER_BUTTON_MAX) {
return map_StringForControllerButton[axis];
}
return NULL;
}
SDL_CONTROLLER_BUTTON_INVALID
Definition: SDL_gamecontroller.h:303
axis
SDL_Texture * axis
Definition: testgamecontroller.c:67
SDL_CONTROLLER_BUTTON_MAX
Definition: SDL_gamecontroller.h:319
map_StringForControllerButton
static const char * map_StringForControllerButton[]
Definition: SDL_gamecontroller.c:474
NULL
#define NULL
Definition: begin_code.h:164

## SDL_GameControllerGetVendor()

Uint16 SDL_GameControllerGetVendor | ( | SDL_GameController * | gamecontroller | ) |

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

Definition at line 1559 of file SDL_gamecontroller.c.

References SDL_GameControllerGetJoystick(), and SDL_JoystickGetVendor.

{
return SDL_JoystickGetVendor(SDL_GameControllerGetJoystick(gamecontroller));
}
SDL_JoystickGetVendor
#define SDL_JoystickGetVendor
Definition: SDL_dynapi_overrides.h:612
SDL_GameControllerGetJoystick
SDL_Joystick * SDL_GameControllerGetJoystick(SDL_GameController *gamecontroller)
Definition: SDL_gamecontroller.c:1592

## SDL_GameControllerIgnoreDevicesChanged()

static void SDL_GameControllerIgnoreDevicesChanged | ( | void * | userdata,
|  | const char * | name,
|  | const char * | oldValue,
|  | const char * | hint
| ) |  |

static

Definition at line 177 of file SDL_gamecontroller.c.

References SDL_LoadVIDPIDListFromHint(), and SDLCALL.

Referenced by SDL_GameControllerInitMappings(), and SDL_GameControllerQuitMappings().

{
SDL_LoadVIDPIDListFromHint(hint, &SDL_ignored_controllers);
}
SDL_ignored_controllers
static SDL_vidpid_list SDL_ignored_controllers
Definition: SDL_gamecontroller.c:128
SDL_LoadVIDPIDListFromHint
static void SDL_LoadVIDPIDListFromHint(const char *hint, SDL_vidpid_list *list)
Definition: SDL_gamecontroller.c:131

## SDL_GameControllerIgnoreDevicesExceptChanged()

static void SDL_GameControllerIgnoreDevicesExceptChanged | ( | void * | userdata,
|  | const char * | name,
|  | const char * | oldValue,
|  | const char * | hint
| ) |  |

static

Definition at line 183 of file SDL_gamecontroller.c.

References axis, button, SDL_LoadVIDPIDListFromHint(), SDL_PrivateGameControllerAxis(), SDL_PrivateGameControllerButton(), and state.

Referenced by SDL_GameControllerInitMappings(), and SDL_GameControllerQuitMappings().

{
SDL_LoadVIDPIDListFromHint(hint, &SDL_allowed_controllers);
}
SDL_allowed_controllers
static SDL_vidpid_list SDL_allowed_controllers
Definition: SDL_gamecontroller.c:127
SDL_LoadVIDPIDListFromHint
static void SDL_LoadVIDPIDListFromHint(const char *hint, SDL_vidpid_list *list)
Definition: SDL_gamecontroller.c:131

## SDL_GameControllerInit()

int SDL_GameControllerInit | ( | void |  | ) |

Definition at line 1237 of file SDL_gamecontroller.c.

References SDL_Event::cdevice, i, NULL, SDL_AddEventWatch, SDL_CONTROLLERDEVICEADDED, SDL_GameControllerEventWatcher(), SDL_IsGameController(), SDL_NumJoysticks, SDL_PushEvent, SDL_Event::type, and SDL_ControllerDeviceEvent::which.

Referenced by SDL_InitSubSystem().

{
int i;
/* watch for joy events and fire controller ones if needed */
SDL_AddEventWatch(SDL_GameControllerEventWatcher, NULL);
/* Send added events for controllers currently attached */
for (i = 0; i < SDL_NumJoysticks(); ++i) {
if (SDL_IsGameController(i)) {
SDL_Event deviceevent;
deviceevent.type = SDL_CONTROLLERDEVICEADDED;
deviceevent.cdevice.which = i;
SDL_PushEvent(&deviceevent);
}
}
return (0);
}
SDL_GameControllerEventWatcher
static int SDL_GameControllerEventWatcher(void *userdata, SDL_Event *event)
Definition: SDL_gamecontroller.c:341
SDL_Event::cdevice
SDL_ControllerDeviceEvent cdevice
Definition: SDL_events.h:543
SDL_NumJoysticks
#define SDL_NumJoysticks
Definition: SDL_dynapi_overrides.h:195
SDL_CONTROLLERDEVICEADDED
Definition: SDL_events.h:120
SDL_ControllerDeviceEvent::which
Sint32 which
Definition: SDL_events.h:392
SDL_PushEvent
#define SDL_PushEvent
Definition: SDL_dynapi_overrides.h:125
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_IsGameController
SDL_bool SDL_IsGameController(int device_index)
Definition: SDL_gamecontroller.c:1289
NULL
#define NULL
Definition: begin_code.h:164
SDL_AddEventWatch
#define SDL_AddEventWatch
Definition: SDL_dynapi_overrides.h:128
SDL_Event
General event structure.
Definition: SDL_events.h:525
SDL_Event::type
Uint32 type
Definition: SDL_events.h:527

## SDL_GameControllerInitMappings()

int SDL_GameControllerInitMappings | ( | void |  | ) |

Definition at line 1208 of file SDL_gamecontroller.c.

References i, NULL, s_ControllerMappings, SDL_AddHintCallback, SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT, SDL_GameControllerAddMappingsFromFile, SDL_GameControllerIgnoreDevicesChanged(), SDL_GameControllerIgnoreDevicesExceptChanged(), SDL_GameControllerLoadHints(), SDL_GetControllerMappingFilePath(), SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES, SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT, and SDL_PrivateGameControllerAddMapping().

Referenced by SDL_JoystickInit().

{
char szControllerMapPath[1024];
int i = 0;
const char *pMappingString = NULL;
pMappingString = s_ControllerMappings[i];
while (pMappingString) {
SDL_PrivateGameControllerAddMapping(pMappingString, SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT);
i++;
pMappingString = s_ControllerMappings[i];
}
if (SDL_GetControllerMappingFilePath(szControllerMapPath, sizeof(szControllerMapPath))) {
SDL_GameControllerAddMappingsFromFile(szControllerMapPath);
}
/* load in any user supplied config */
SDL_GameControllerLoadHints();
SDL_AddHintCallback(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES,
SDL_GameControllerIgnoreDevicesChanged, NULL);
SDL_AddHintCallback(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT,
SDL_GameControllerIgnoreDevicesExceptChanged, NULL);
return (0);
}
SDL_GetControllerMappingFilePath
static SDL_bool SDL_GetControllerMappingFilePath(char *path, size_t size)
Definition: SDL_gamecontroller.c:1192
SDL_GameControllerLoadHints
static void SDL_GameControllerLoadHints()
Definition: SDL_gamecontroller.c:1159
SDL_PrivateGameControllerAddMapping
static int SDL_PrivateGameControllerAddMapping(const char *mappingString, SDL_ControllerMappingPriority priority)
Definition: SDL_gamecontroller.c:1017
SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT
#define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT
Definition: SDL_hints.h:453
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
NULL
#define NULL
Definition: begin_code.h:164
SDL_GameControllerIgnoreDevicesExceptChanged
static void SDL_GameControllerIgnoreDevicesExceptChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
Definition: SDL_gamecontroller.c:183
s_ControllerMappings
static const char * s_ControllerMappings[]
Definition: SDL_gamecontrollerdb.h:32
SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT
Definition: SDL_gamecontroller.c:84
SDL_AddHintCallback
#define SDL_AddHintCallback
Definition: SDL_dynapi_overrides.h:192
SDL_GameControllerAddMappingsFromFile
#define SDL_GameControllerAddMappingsFromFile(file)
Definition: SDL_gamecontroller.h:129
SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES
#define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES
Definition: SDL_hints.h:440
SDL_GameControllerIgnoreDevicesChanged
static void SDL_GameControllerIgnoreDevicesChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
Definition: SDL_gamecontroller.c:177

## SDL_GameControllerLoadHints()

static void SDL_GameControllerLoadHints | ( |  | ) |

static

Definition at line 1159 of file SDL_gamecontroller.c.

References NULL, SDL_CONTROLLER_MAPPING_PRIORITY_USER, SDL_free, SDL_GetHint, SDL_HINT_GAMECONTROLLERCONFIG, SDL_malloc, SDL_memcpy, SDL_PrivateGameControllerAddMapping(), SDL_strchr, and SDL_strlen.

Referenced by SDL_GameControllerInitMappings().

{
const char *hint = SDL_GetHint(SDL_HINT_GAMECONTROLLERCONFIG);
if (hint && hint[0]) {
size_t nchHints = SDL_strlen(hint);
char *pUserMappings = SDL_malloc(nchHints + 1);
char *pTempMappings = pUserMappings;
SDL_memcpy(pUserMappings, hint, nchHints);
pUserMappings[nchHints] = '\0';
while (pUserMappings) {
char *pchNewLine = NULL;
pchNewLine = SDL_strchr(pUserMappings, '\n');
if (pchNewLine)
*pchNewLine = '\0';
SDL_PrivateGameControllerAddMapping(pUserMappings, SDL_CONTROLLER_MAPPING_PRIORITY_USER);
if (pchNewLine) {
pUserMappings = pchNewLine + 1;
} else {
pUserMappings = NULL;
}
}
SDL_free(pTempMappings);
}
}
SDL_GetHint
#define SDL_GetHint
Definition: SDL_dynapi_overrides.h:191
SDL_strchr
#define SDL_strchr
Definition: SDL_dynapi_overrides.h:401
SDL_PrivateGameControllerAddMapping
static int SDL_PrivateGameControllerAddMapping(const char *mappingString, SDL_ControllerMappingPriority priority)
Definition: SDL_gamecontroller.c:1017
SDL_memcpy
#define SDL_memcpy
Definition: SDL_dynapi_overrides.h:387
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
SDL_CONTROLLER_MAPPING_PRIORITY_USER
Definition: SDL_gamecontroller.c:86
NULL
#define NULL
Definition: begin_code.h:164
SDL_strlen
#define SDL_strlen
Definition: SDL_dynapi_overrides.h:393
SDL_HINT_GAMECONTROLLERCONFIG
#define SDL_HINT_GAMECONTROLLERCONFIG
A variable that lets you manually hint extra gamecontroller db entries.
Definition: SDL_hints.h:427
SDL_malloc
#define SDL_malloc
Definition: SDL_dynapi_overrides.h:374

## SDL_GameControllerMapping()

char* SDL_GameControllerMapping | ( | SDL_GameController * | gamecontroller | ) |

Get a mapping string for an open GameController

Returns
  the mapping string. Must be freed with SDL_free(). Returns NULL if no mapping is available

Definition at line 1149 of file SDL_gamecontroller.c.

References NULL, and SDL_GameControllerMappingForGUID().

{
if (!gamecontroller) {
return NULL;
}
return SDL_GameControllerMappingForGUID(gamecontroller->guid);
}
NULL
#define NULL
Definition: begin_code.h:164
SDL_GameControllerMappingForGUID
char * SDL_GameControllerMappingForGUID(SDL_JoystickGUID guid)
Definition: SDL_gamecontroller.c:1125

## SDL_GameControllerMappingForGUID()

char* SDL_GameControllerMappingForGUID | ( | SDL_JoystickGUID | guid | ) |

Get a mapping string for a GUID

Returns
  the mapping string. Must be freed with SDL_free(). Returns NULL if no mapping is available

Definition at line 1125 of file SDL_gamecontroller.c.

References ControllerMapping_t::mapping, ControllerMapping_t::name, NULL, SDL_JoystickGetGUIDString, SDL_malloc, SDL_OutOfMemory, SDL_PrivateGetControllerMappingForGUID(), SDL_snprintf, and SDL_strlen.

Referenced by SDL_GameControllerMapping().

{
char *pMappingString = NULL;
ControllerMapping_t *mapping = SDL_PrivateGetControllerMappingForGUID(&guid);
if (mapping) {
char pchGUID[33];
size_t needed;
SDL_JoystickGetGUIDString(guid, pchGUID, sizeof(pchGUID));
/* allocate enough memory for GUID + ',' + name + ',' + mapping + \0 */
needed = SDL_strlen(pchGUID) + 1 + SDL_strlen(mapping->name) + 1 + SDL_strlen(mapping->mapping) + 1;
pMappingString = SDL_malloc(needed);
if (!pMappingString) {
SDL_OutOfMemory();
return NULL;
}
SDL_snprintf(pMappingString, needed, "%s,%s,%s", pchGUID, mapping->name, mapping->mapping);
}
return pMappingString;
}
SDL_JoystickGetGUIDString
#define SDL_JoystickGetGUIDString
Definition: SDL_dynapi_overrides.h:201
SDL_PrivateGetControllerMappingForGUID
static ControllerMapping_t * SDL_PrivateGetControllerMappingForGUID(SDL_JoystickGUID *guid)
Definition: SDL_gamecontroller.c:419
ControllerMapping_t::name
char * name
Definition: SDL_gamecontroller.c:92
ControllerMapping_t::mapping
char * mapping
Definition: SDL_gamecontroller.c:93
NULL
#define NULL
Definition: begin_code.h:164
SDL_OutOfMemory
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
ControllerMapping_t
Definition: SDL_gamecontroller.c:89
SDL_strlen
#define SDL_strlen
Definition: SDL_dynapi_overrides.h:393
SDL_snprintf
#define SDL_snprintf
Definition: SDL_dynapi_overrides.h:40
mapping
GLenum GLenum GLenum GLenum mapping
Definition: SDL_opengl_glext.h:9374
SDL_malloc
#define SDL_malloc
Definition: SDL_dynapi_overrides.h:374

## SDL_GameControllerMappingForIndex()

char* SDL_GameControllerMappingForIndex | ( | int | mapping_index | ) |

Get the mapping at a particular index.

Returns
  the mapping string. Must be freed with SDL_free(). Returns NULL if the index is out of range.

Definition at line 1092 of file SDL_gamecontroller.c.

References ControllerMapping_t::guid, ControllerMapping_t::mapping, ControllerMapping_t::name, ControllerMapping_t::next, NULL, SDL_JoystickGetGUIDString, SDL_malloc, SDL_memcmp, SDL_OutOfMemory, SDL_snprintf, and SDL_strlen.

{
ControllerMapping_t *mapping;
for (mapping = s_pSupportedControllers; mapping; mapping = mapping->next) {
if (SDL_memcmp(&mapping->guid, &s_zeroGUID, sizeof(mapping->guid)) == 0) {
continue;
}
if (mapping_index == 0) {
char *pMappingString;
char pchGUID[33];
size_t needed;
SDL_JoystickGetGUIDString(mapping->guid, pchGUID, sizeof(pchGUID));
/* allocate enough memory for GUID + ',' + name + ',' + mapping + \0 */
needed = SDL_strlen(pchGUID) + 1 + SDL_strlen(mapping->name) + 1 + SDL_strlen(mapping->mapping) + 1;
pMappingString = SDL_malloc(needed);
if (!pMappingString) {
SDL_OutOfMemory();
return NULL;
}
SDL_snprintf(pMappingString, needed, "%s,%s,%s", pchGUID, mapping->name, mapping->mapping);
return pMappingString;
}
--mapping_index;
}
return NULL;
}
ControllerMapping_t::next
struct _ControllerMapping_t * next
Definition: SDL_gamecontroller.c:95
SDL_JoystickGetGUIDString
#define SDL_JoystickGetGUIDString
Definition: SDL_dynapi_overrides.h:201
ControllerMapping_t::guid
SDL_JoystickGUID guid
Definition: SDL_gamecontroller.c:91
s_pSupportedControllers
static ControllerMapping_t * s_pSupportedControllers
Definition: SDL_gamecontroller.c:99
SDL_memcmp
#define SDL_memcmp
Definition: SDL_dynapi_overrides.h:389
ControllerMapping_t::name
char * name
Definition: SDL_gamecontroller.c:92
ControllerMapping_t::mapping
char * mapping
Definition: SDL_gamecontroller.c:93
NULL
#define NULL
Definition: begin_code.h:164
SDL_OutOfMemory
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
s_zeroGUID
static SDL_JoystickGUID s_zeroGUID
Definition: SDL_gamecontroller.c:98
ControllerMapping_t
Definition: SDL_gamecontroller.c:89
SDL_strlen
#define SDL_strlen
Definition: SDL_dynapi_overrides.h:393
SDL_snprintf
#define SDL_snprintf
Definition: SDL_dynapi_overrides.h:40
mapping
GLenum GLenum GLenum GLenum mapping
Definition: SDL_opengl_glext.h:9374
SDL_malloc
#define SDL_malloc
Definition: SDL_dynapi_overrides.h:374

## SDL_GameControllerName()

const char* SDL_GameControllerName | ( | SDL_GameController * | gamecontroller | ) |

Return the name for this currently opened controller

Definition at line 1550 of file SDL_gamecontroller.c.

References NULL.

{
if (!gamecontroller)
return NULL;
return gamecontroller->name;
}
NULL
#define NULL
Definition: begin_code.h:164

## SDL_GameControllerNameForIndex()

const char* SDL_GameControllerNameForIndex | ( | int | joystick_index | ) |

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

Definition at line 1262 of file SDL_gamecontroller.c.

References ControllerMapping_t::name, NULL, and SDL_PrivateGetControllerMapping().

{
ControllerMapping_t *pSupportedController = SDL_PrivateGetControllerMapping(device_index);
if (pSupportedController) {
return pSupportedController->name;
}
return NULL;
}
SDL_PrivateGetControllerMapping
static ControllerMapping_t * SDL_PrivateGetControllerMapping(int device_index)
Definition: SDL_gamecontroller.c:907
ControllerMapping_t::name
char * name
Definition: SDL_gamecontroller.c:92
NULL
#define NULL
Definition: begin_code.h:164
ControllerMapping_t
Definition: SDL_gamecontroller.c:89

## SDL_GameControllerNumMappings()

int SDL_GameControllerNumMappings | ( | void |  | ) |

Get the number of mappings installed

Returns
  the number of mappings

Definition at line 1074 of file SDL_gamecontroller.c.

References ControllerMapping_t::guid, ControllerMapping_t::next, and SDL_memcmp.

{
int num_mappings = 0;
ControllerMapping_t *mapping;
for (mapping = s_pSupportedControllers; mapping; mapping = mapping->next) {
if (SDL_memcmp(&mapping->guid, &s_zeroGUID, sizeof(mapping->guid)) == 0) {
continue;
}
++num_mappings;
}
return num_mappings;
}
ControllerMapping_t::next
struct _ControllerMapping_t * next
Definition: SDL_gamecontroller.c:95
ControllerMapping_t::guid
SDL_JoystickGUID guid
Definition: SDL_gamecontroller.c:91
s_pSupportedControllers
static ControllerMapping_t * s_pSupportedControllers
Definition: SDL_gamecontroller.c:99
SDL_memcmp
#define SDL_memcmp
Definition: SDL_dynapi_overrides.h:389
s_zeroGUID
static SDL_JoystickGUID s_zeroGUID
Definition: SDL_gamecontroller.c:98
ControllerMapping_t
Definition: SDL_gamecontroller.c:89
mapping
GLenum GLenum GLenum GLenum mapping
Definition: SDL_opengl_glext.h:9374

## SDL_GameControllerOpen()

SDL_GameController* SDL_GameControllerOpen | ( | int | joystick_index | ) |

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

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

Definition at line 1357 of file SDL_gamecontroller.c.

References ControllerMapping_t::guid, ControllerMapping_t::mapping, ControllerMapping_t::name, NULL, SDL_calloc, SDL_free, SDL_gamecontrollers, SDL_JoystickClose, SDL_JoystickOpen, SDL_LockJoysticks, SDL_NumJoysticks, SDL_OutOfMemory, SDL_PrivateGetControllerMapping(), SDL_PrivateLoadButtonMapping(), SDL_SetError, SDL_SYS_GetInstanceIdOfDeviceIndex(), and SDL_UnlockJoysticks.

{
SDL_GameController *gamecontroller;
SDL_GameController *gamecontrollerlist;
ControllerMapping_t *pSupportedController = NULL;
SDL_LockJoysticks();
if ((device_index < 0) || (device_index >= SDL_NumJoysticks())) {
SDL_SetError("There are %d joysticks available", SDL_NumJoysticks());
SDL_UnlockJoysticks();
return (NULL);
}
gamecontrollerlist = SDL_gamecontrollers;
/* If the controller is already open, return it */
while (gamecontrollerlist) {
if (SDL_SYS_GetInstanceIdOfDeviceIndex(device_index) == gamecontrollerlist->joystick->instance_id) {
gamecontroller = gamecontrollerlist;
++gamecontroller->ref_count;
SDL_UnlockJoysticks();
return (gamecontroller);
}
gamecontrollerlist = gamecontrollerlist->next;
}
/* Find a controller mapping */
pSupportedController = SDL_PrivateGetControllerMapping(device_index);
if (!pSupportedController) {
SDL_SetError("Couldn't find mapping for device (%d)", device_index);
SDL_UnlockJoysticks();
return NULL;
}
/* Create and initialize the controller */
gamecontroller = (SDL_GameController *) SDL_calloc(1, sizeof(*gamecontroller));
if (gamecontroller == NULL) {
SDL_OutOfMemory();
SDL_UnlockJoysticks();
return NULL;
}
gamecontroller->joystick = SDL_JoystickOpen(device_index);
if (!gamecontroller->joystick) {
SDL_free(gamecontroller);
SDL_UnlockJoysticks();
return NULL;
}
if (gamecontroller->joystick->naxes) {
gamecontroller->last_match_axis = (SDL_ExtendedGameControllerBind **)SDL_calloc(gamecontroller->joystick->naxes, sizeof(*gamecontroller->last_match_axis));
if (!gamecontroller->last_match_axis) {
SDL_OutOfMemory();
SDL_JoystickClose(gamecontroller->joystick);
SDL_free(gamecontroller);
SDL_UnlockJoysticks();
return NULL;
}
}
if (gamecontroller->joystick->nhats) {
gamecontroller->last_hat_mask = (Uint8 *)SDL_calloc(gamecontroller->joystick->nhats, sizeof(*gamecontroller->last_hat_mask));
if (!gamecontroller->last_hat_mask) {
SDL_OutOfMemory();
SDL_JoystickClose(gamecontroller->joystick);
SDL_free(gamecontroller->last_match_axis);
SDL_free(gamecontroller);
SDL_UnlockJoysticks();
return NULL;
}
}
SDL_PrivateLoadButtonMapping(gamecontroller, pSupportedController->guid, pSupportedController->name, pSupportedController->mapping);
/* Add the controller to list */
++gamecontroller->ref_count;
/* Link the controller in the list */
gamecontroller->next = SDL_gamecontrollers;
SDL_gamecontrollers = gamecontroller;
SDL_UnlockJoysticks();
return (gamecontroller);
}
SDL_UnlockJoysticks
#define SDL_UnlockJoysticks
Definition: SDL_dynapi_overrides.h:639
SDL_JoystickClose
#define SDL_JoystickClose
Definition: SDL_dynapi_overrides.h:215
SDL_JoystickOpen
#define SDL_JoystickOpen
Definition: SDL_dynapi_overrides.h:197
SDL_NumJoysticks
#define SDL_NumJoysticks
Definition: SDL_dynapi_overrides.h:195
ControllerMapping_t::guid
SDL_JoystickGUID guid
Definition: SDL_gamecontroller.c:91
SDL_gamecontrollers
static SDL_GameController * SDL_gamecontrollers
Definition: SDL_gamecontroller.c:44
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:157
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
SDL_PrivateGetControllerMapping
static ControllerMapping_t * SDL_PrivateGetControllerMapping(int device_index)
Definition: SDL_gamecontroller.c:907
ControllerMapping_t::name
char * name
Definition: SDL_gamecontroller.c:92
ControllerMapping_t::mapping
char * mapping
Definition: SDL_gamecontroller.c:93
NULL
#define NULL
Definition: begin_code.h:164
SDL_OutOfMemory
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
ControllerMapping_t
Definition: SDL_gamecontroller.c:89
SDL_calloc
#define SDL_calloc
Definition: SDL_dynapi_overrides.h:375
SDL_SYS_GetInstanceIdOfDeviceIndex
SDL_JoystickID SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index)
Definition: SDL_sysjoystick.m:409
SDL_PrivateLoadButtonMapping
static void SDL_PrivateLoadButtonMapping(SDL_GameController *gamecontroller, SDL_JoystickGUID guid, const char *pchName, const char *pchMapping)
Definition: SDL_gamecontroller.c:668
SDL_LockJoysticks
#define SDL_LockJoysticks
Definition: SDL_dynapi_overrides.h:638
SDL_ExtendedGameControllerBind
Definition: SDL_gamecontroller.c:46

## SDL_GameControllerQuit()

void SDL_GameControllerQuit | ( | void |  | ) |

Definition at line 1733 of file SDL_gamecontroller.c.

References SDL_GameControllerClose(), SDL_gamecontrollers, SDL_LockJoysticks, and SDL_UnlockJoysticks.

Referenced by SDL_QuitSubSystem().

{
SDL_LockJoysticks();
while (SDL_gamecontrollers) {
SDL_gamecontrollers->ref_count = 1;
SDL_GameControllerClose(SDL_gamecontrollers);
}
SDL_UnlockJoysticks();
}
SDL_UnlockJoysticks
#define SDL_UnlockJoysticks
Definition: SDL_dynapi_overrides.h:639
SDL_GameControllerClose
void SDL_GameControllerClose(SDL_GameController *gamecontroller)
Definition: SDL_gamecontroller.c:1687
SDL_gamecontrollers
static SDL_GameController * SDL_gamecontrollers
Definition: SDL_gamecontroller.c:44
SDL_LockJoysticks
#define SDL_LockJoysticks
Definition: SDL_dynapi_overrides.h:638

## SDL_GameControllerQuitMappings()

void SDL_GameControllerQuitMappings | ( | void |  | ) |

Definition at line 1744 of file SDL_gamecontroller.c.

References SDL_vidpid_list::entries, ControllerMapping_t::mapping, ControllerMapping_t::name, ControllerMapping_t::next, NULL, s_pSupportedControllers, SDL_DelEventWatch, SDL_DelHintCallback, SDL_free, SDL_GameControllerEventWatcher(), SDL_GameControllerIgnoreDevicesChanged(), SDL_GameControllerIgnoreDevicesExceptChanged(), SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES, SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT, and SDL_zero.

Referenced by SDL_JoystickQuit().

{
ControllerMapping_t *pControllerMap;
while (s_pSupportedControllers) {
pControllerMap = s_pSupportedControllers;
s_pSupportedControllers = s_pSupportedControllers->next;
SDL_free(pControllerMap->name);
SDL_free(pControllerMap->mapping);
SDL_free(pControllerMap);
}
SDL_DelEventWatch(SDL_GameControllerEventWatcher, NULL);
SDL_DelHintCallback(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES,
SDL_GameControllerIgnoreDevicesChanged, NULL);
SDL_DelHintCallback(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT,
SDL_GameControllerIgnoreDevicesExceptChanged, NULL);
if (SDL_allowed_controllers.entries) {
SDL_free(SDL_allowed_controllers.entries);
SDL_zero(SDL_allowed_controllers);
}
if (SDL_ignored_controllers.entries) {
SDL_free(SDL_ignored_controllers.entries);
SDL_zero(SDL_ignored_controllers);
}
}
SDL_DelEventWatch
#define SDL_DelEventWatch
Definition: SDL_dynapi_overrides.h:129
SDL_GameControllerEventWatcher
static int SDL_GameControllerEventWatcher(void *userdata, SDL_Event *event)
Definition: SDL_gamecontroller.c:341
ControllerMapping_t::next
struct _ControllerMapping_t * next
Definition: SDL_gamecontroller.c:95
SDL_ignored_controllers
static SDL_vidpid_list SDL_ignored_controllers
Definition: SDL_gamecontroller.c:128
s_pSupportedControllers
static ControllerMapping_t * s_pSupportedControllers
Definition: SDL_gamecontroller.c:99
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT
#define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT
Definition: SDL_hints.h:453
SDL_zero
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
ControllerMapping_t::name
char * name
Definition: SDL_gamecontroller.c:92
SDL_vidpid_list::entries
Uint32 * entries
Definition: SDL_gamecontroller.c:124
ControllerMapping_t::mapping
char * mapping
Definition: SDL_gamecontroller.c:93
NULL
#define NULL
Definition: begin_code.h:164
SDL_GameControllerIgnoreDevicesExceptChanged
static void SDL_GameControllerIgnoreDevicesExceptChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
Definition: SDL_gamecontroller.c:183
ControllerMapping_t
Definition: SDL_gamecontroller.c:89
SDL_allowed_controllers
static SDL_vidpid_list SDL_allowed_controllers
Definition: SDL_gamecontroller.c:127
SDL_DelHintCallback
#define SDL_DelHintCallback
Definition: SDL_dynapi_overrides.h:193
SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES
#define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES
Definition: SDL_hints.h:440
SDL_GameControllerIgnoreDevicesChanged
static void SDL_GameControllerIgnoreDevicesChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
Definition: SDL_gamecontroller.c:177

## SDL_GameControllerUpdate()

void SDL_GameControllerUpdate | ( | void |  | ) |

Update the current state of the open game controllers.

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

Definition at line 1445 of file SDL_gamecontroller.c.

References SDL_JoystickUpdate.

{
/* Just for API completeness; the joystick API does all the work. */
SDL_JoystickUpdate();
}
SDL_JoystickUpdate
#define SDL_JoystickUpdate
Definition: SDL_dynapi_overrides.h:209

## SDL_GetControllerMappingFilePath()

static SDL_bool SDL_GetControllerMappingFilePath | ( | char * | path,
|  | size_t | size
| ) |  |

static

Definition at line 1192 of file SDL_gamecontroller.c.

References SDL_AndroidGetInternalStoragePath, SDL_FALSE, SDL_snprintf, and SDL_strlcpy.

Referenced by SDL_GameControllerInitMappings().

{
#ifdef CONTROLLER_MAPPING_FILE
#define STRING(X) SDL_STRINGIFY_ARG(X)
return SDL_strlcpy(path, STRING(CONTROLLER_MAPPING_FILE), size) < size;
#elif defined(__ANDROID__)
return SDL_snprintf(path, size, "%s/controller_map.txt", SDL_AndroidGetInternalStoragePath()) < size;
#else
return SDL_FALSE;
#endif
}
SDL_strlcpy
#define SDL_strlcpy
Definition: SDL_dynapi_overrides.h:394
SDL_FALSE
Definition: SDL_stdinc.h:141
size
GLsizeiptr size
Definition: SDL_opengl_glext.h:537
SDL_snprintf
#define SDL_snprintf
Definition: SDL_dynapi_overrides.h:40
path
GLsizei const GLchar *const * path
Definition: SDL_opengl_glext.h:3730
SDL_AndroidGetInternalStoragePath
#define SDL_AndroidGetInternalStoragePath
Definition: SDL_dynapi_overrides.h:51

## SDL_IsGameController()

SDL_bool SDL_IsGameController | ( | int | joystick_index | ) |

Is the joystick on this index supported by the game controller interface?

Definition at line 1289 of file SDL_gamecontroller.c.

References SDL_FALSE, SDL_PrivateGetControllerMapping(), and SDL_TRUE.

Referenced by SDL_GameControllerEventWatcher(), and SDL_GameControllerInit().

{
ControllerMapping_t *pSupportedController = SDL_PrivateGetControllerMapping(device_index);
if (pSupportedController) {
return SDL_TRUE;
}
return SDL_FALSE;
}
SDL_TRUE
Definition: SDL_stdinc.h:142
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_PrivateGetControllerMapping
static ControllerMapping_t * SDL_PrivateGetControllerMapping(int device_index)
Definition: SDL_gamecontroller.c:907
ControllerMapping_t
Definition: SDL_gamecontroller.c:89

## SDL_IsGameControllerNameAndGUID()

SDL_bool SDL_IsGameControllerNameAndGUID | ( | const char * | name,
|  | SDL_JoystickGUID | guid
| ) |  |

Definition at line 1276 of file SDL_gamecontroller.c.

References SDL_FALSE, SDL_PrivateGetControllerMappingForNameAndGUID(), and SDL_TRUE.

{
ControllerMapping_t *pSupportedController = SDL_PrivateGetControllerMappingForNameAndGUID(name, guid);
if (pSupportedController) {
return SDL_TRUE;
}
return SDL_FALSE;
}
SDL_TRUE
Definition: SDL_stdinc.h:142
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_PrivateGetControllerMappingForNameAndGUID
static ControllerMapping_t * SDL_PrivateGetControllerMappingForNameAndGUID(const char *name, SDL_JoystickGUID guid)
Definition: SDL_gamecontroller.c:875
name
GLuint const GLchar * name
Definition: SDL_opengl_glext.h:660
ControllerMapping_t
Definition: SDL_gamecontroller.c:89

## SDL_LoadVIDPIDListFromHint()

static void SDL_LoadVIDPIDListFromHint | ( | const char * | hint,
|  | SDL_vidpid_list * | list
| ) |  |

static

Definition at line 131 of file SDL_gamecontroller.c.

References SDL_vidpid_list::entries, SDL_vidpid_list::max_entries, NULL, SDL_vidpid_list::num_entries, SDL_free, SDL_LoadFile, SDL_realloc, SDL_strstr, SDL_strtol, and SDLCALL.

Referenced by SDL_GameControllerIgnoreDevicesChanged(), and SDL_GameControllerIgnoreDevicesExceptChanged().

{
Uint32 entry;
char *spot;
char *file = NULL;
list->num_entries = 0;
if (hint && *hint == '@') {
spot = file = (char *)SDL_LoadFile(hint+1, NULL);
} else {
spot = (char *)hint;
}
if (!spot) {
return;
}
while ((spot = SDL_strstr(spot, "0x")) != NULL) {
entry = (Uint16)SDL_strtol(spot, &spot, 0);
entry <<= 16;
spot = SDL_strstr(spot, "0x");
if (!spot) {
break;
}
entry |= (Uint16)SDL_strtol(spot, &spot, 0);
if (list->num_entries == list->max_entries) {
int max_entries = list->max_entries + 16;
Uint32 *entries = (Uint32 *)SDL_realloc(list->entries, max_entries*sizeof(*list->entries));
if (entries == NULL) {
/* Out of memory, go with what we have already */
break;
}
list->entries = entries;
list->max_entries = max_entries;
}
list->entries[list->num_entries++] = entry;
}
if (file) {
SDL_free(file);
}
}
SDL_vidpid_list::num_entries
int num_entries
Definition: SDL_gamecontroller.c:122
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_realloc
#define SDL_realloc
Definition: SDL_dynapi_overrides.h:376
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
SDL_vidpid_list::max_entries
int max_entries
Definition: SDL_gamecontroller.c:123
SDL_strtol
#define SDL_strtol
Definition: SDL_dynapi_overrides.h:412
SDL_vidpid_list::entries
Uint32 * entries
Definition: SDL_gamecontroller.c:124
NULL
#define NULL
Definition: begin_code.h:164
Uint16
uint16_t Uint16
Definition: SDL_stdinc.h:169
SDL_LoadFile
#define SDL_LoadFile(file, datasize)
Definition: SDL_rwops.h:214
SDL_strstr
#define SDL_strstr
Definition: SDL_dynapi_overrides.h:403

## SDL_PrivateAddMappingForGUID()

static ControllerMapping_t* SDL_PrivateAddMappingForGUID | ( | SDL_JoystickGUID | jGUID,
|  | const char * | mappingString,
|  | SDL_bool * | existing,
|  | SDL_ControllerMappingPriority | priority
| ) |  |

static

Definition at line 804 of file SDL_gamecontroller.c.

References ControllerMapping_t::guid, ControllerMapping_t::mapping, ControllerMapping_t::name, ControllerMapping_t::next, NULL, ControllerMapping_t::priority, SDL_FALSE, SDL_free, SDL_malloc, SDL_OutOfMemory, SDL_PrivateGameControllerRefreshMapping(), SDL_PrivateGetControllerMappingForGUID(), SDL_PrivateGetControllerMappingFromMappingString(), SDL_PrivateGetControllerNameFromMappingString(), SDL_SetError, and SDL_TRUE.

Referenced by SDL_PrivateGameControllerAddMapping(), SDL_PrivateGetControllerMapping(), and SDL_PrivateGetControllerMappingForNameAndGUID().

{
char *pchName;
char *pchMapping;
ControllerMapping_t *pControllerMapping;
pchName = SDL_PrivateGetControllerNameFromMappingString(mappingString);
if (!pchName) {
SDL_SetError("Couldn't parse name from %s", mappingString);
return NULL;
}
pchMapping = SDL_PrivateGetControllerMappingFromMappingString(mappingString);
if (!pchMapping) {
SDL_free(pchName);
SDL_SetError("Couldn't parse %s", mappingString);
return NULL;
}
pControllerMapping = SDL_PrivateGetControllerMappingForGUID(&jGUID);
if (pControllerMapping) {
/* Only overwrite the mapping if the priority is the same or higher. */
if (pControllerMapping->priority <= priority) {
/* Update existing mapping */
SDL_free(pControllerMapping->name);
pControllerMapping->name = pchName;
SDL_free(pControllerMapping->mapping);
pControllerMapping->mapping = pchMapping;
pControllerMapping->priority = priority;
/* refresh open controllers */
SDL_PrivateGameControllerRefreshMapping(pControllerMapping);
} else {
SDL_free(pchName);
SDL_free(pchMapping);
}
*existing = SDL_TRUE;
} else {
pControllerMapping = SDL_malloc(sizeof(*pControllerMapping));
if (!pControllerMapping) {
SDL_free(pchName);
SDL_free(pchMapping);
SDL_OutOfMemory();
return NULL;
}
pControllerMapping->guid = jGUID;
pControllerMapping->name = pchName;
pControllerMapping->mapping = pchMapping;
pControllerMapping->next = NULL;
pControllerMapping->priority = priority;
if (s_pSupportedControllers) {
/* Add the mapping to the end of the list */
ControllerMapping_t *pCurrMapping, *pPrevMapping;
for ( pPrevMapping = s_pSupportedControllers, pCurrMapping = pPrevMapping->next;
pCurrMapping;
pPrevMapping = pCurrMapping, pCurrMapping = pCurrMapping->next ) {
continue;
}
pPrevMapping->next = pControllerMapping;
} else {
s_pSupportedControllers = pControllerMapping;
}
*existing = SDL_FALSE;
}
return pControllerMapping;
}
SDL_TRUE
Definition: SDL_stdinc.h:142
ControllerMapping_t::priority
SDL_ControllerMappingPriority priority
Definition: SDL_gamecontroller.c:94
ControllerMapping_t::next
struct _ControllerMapping_t * next
Definition: SDL_gamecontroller.c:95
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_PrivateGetControllerMappingForGUID
static ControllerMapping_t * SDL_PrivateGetControllerMappingForGUID(SDL_JoystickGUID *guid)
Definition: SDL_gamecontroller.c:419
ControllerMapping_t::guid
SDL_JoystickGUID guid
Definition: SDL_gamecontroller.c:91
s_pSupportedControllers
static ControllerMapping_t * s_pSupportedControllers
Definition: SDL_gamecontroller.c:99
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
SDL_PrivateGetControllerMappingFromMappingString
static char * SDL_PrivateGetControllerMappingFromMappingString(const char *pMapping)
Definition: SDL_gamecontroller.c:764
ControllerMapping_t::name
char * name
Definition: SDL_gamecontroller.c:92
ControllerMapping_t::mapping
char * mapping
Definition: SDL_gamecontroller.c:93
SDL_PrivateGameControllerRefreshMapping
static void SDL_PrivateGameControllerRefreshMapping(ControllerMapping_t *pControllerMapping)
Definition: SDL_gamecontroller.c:782
NULL
#define NULL
Definition: begin_code.h:164
SDL_OutOfMemory
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
SDL_PrivateGetControllerNameFromMappingString
static char * SDL_PrivateGetControllerNameFromMappingString(const char *pMapping)
Definition: SDL_gamecontroller.c:737
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
ControllerMapping_t
Definition: SDL_gamecontroller.c:89
SDL_malloc
#define SDL_malloc
Definition: SDL_dynapi_overrides.h:374

## SDL_PrivateGameControllerAddMapping()

static int SDL_PrivateGameControllerAddMapping | ( | const char * | mappingString,
|  | SDL_ControllerMappingPriority | priority
| ) |  |

static

Definition at line 1017 of file SDL_gamecontroller.c.

References SDL_FALSE, SDL_free, SDL_InvalidParamError, SDL_JoystickGetGUIDFromString, SDL_PrivateAddMappingForGUID(), SDL_PrivateGetControllerGUIDFromMappingString(), SDL_SetError, SDL_strcasecmp, and SDL_TRUE.

Referenced by SDL_GameControllerAddMapping(), SDL_GameControllerInitMappings(), and SDL_GameControllerLoadHints().

{
char *pchGUID;
SDL_JoystickGUID jGUID;
SDL_bool is_xinput_mapping = SDL_FALSE;
SDL_bool is_emscripten_mapping = SDL_FALSE;
SDL_bool existing = SDL_FALSE;
ControllerMapping_t *pControllerMapping;
if (!mappingString) {
return SDL_InvalidParamError("mappingString");
}
pchGUID = SDL_PrivateGetControllerGUIDFromMappingString(mappingString);
if (!pchGUID) {
return SDL_SetError("Couldn't parse GUID from %s", mappingString);
}
if (!SDL_strcasecmp(pchGUID, "xinput")) {
is_xinput_mapping = SDL_TRUE;
}
if (!SDL_strcasecmp(pchGUID, "emscripten")) {
is_emscripten_mapping = SDL_TRUE;
}
jGUID = SDL_JoystickGetGUIDFromString(pchGUID);
SDL_free(pchGUID);
pControllerMapping = SDL_PrivateAddMappingForGUID(jGUID, mappingString, &existing, priority);
if (!pControllerMapping) {
return -1;
}
if (existing) {
return 0;
} else {
if (is_xinput_mapping) {
s_pXInputMapping = pControllerMapping;
}
if (is_emscripten_mapping) {
s_pEmscriptenMapping = pControllerMapping;
}
return 1;
}
}
SDL_TRUE
Definition: SDL_stdinc.h:142
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_InvalidParamError
#define SDL_InvalidParamError(param)
Definition: SDL_error.h:54
SDL_strcasecmp
#define SDL_strcasecmp
Definition: SDL_dynapi_overrides.h:419
s_pEmscriptenMapping
static ControllerMapping_t * s_pEmscriptenMapping
Definition: SDL_gamecontroller.c:101
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
SDL_PrivateGetControllerGUIDFromMappingString
static char * SDL_PrivateGetControllerGUIDFromMappingString(const char *pMapping)
Definition: SDL_gamecontroller.c:698
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:139
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
ControllerMapping_t
Definition: SDL_gamecontroller.c:89
SDL_JoystickGUID
Definition: SDL_joystick.h:70
s_pXInputMapping
static ControllerMapping_t * s_pXInputMapping
Definition: SDL_gamecontroller.c:100
SDL_PrivateAddMappingForGUID
static ControllerMapping_t * SDL_PrivateAddMappingForGUID(SDL_JoystickGUID jGUID, const char *mappingString, SDL_bool *existing, SDL_ControllerMappingPriority priority)
Definition: SDL_gamecontroller.c:804
SDL_JoystickGetGUIDFromString
#define SDL_JoystickGetGUIDFromString
Definition: SDL_dynapi_overrides.h:202

## SDL_PrivateGameControllerAxis()

static int SDL_PrivateGameControllerAxis | ( | SDL_GameController * | gamecontroller,
|  | SDL_GameControllerAxis | axis,
|  | Sint16 | value
| ) |  |

static

Definition at line 1777 of file SDL_gamecontroller.c.

References axis, SDL_CONTROLLERAXISMOTION, SDL_ENABLE, SDL_GetEventState, and SDL_PushEvent.

Referenced by HandleJoystickAxis(), HandleJoystickButton(), HandleJoystickHat(), ResetOutput(), and SDL_GameControllerIgnoreDevicesExceptChanged().

{
int posted;
/* translate the event, if desired */
posted = 0;
#if !SDL_EVENTS_DISABLED
if (SDL_GetEventState(SDL_CONTROLLERAXISMOTION) == SDL_ENABLE) {
SDL_Event event;
event.type = SDL_CONTROLLERAXISMOTION;
event.caxis.which = gamecontroller->joystick->instance_id;
event.caxis.axis = axis;
event.caxis.value = value;
posted = SDL_PushEvent(&event) == 1;
}
#endif /* !SDL_EVENTS_DISABLED */
return (posted);
}
SDL_ENABLE
#define SDL_ENABLE
Definition: SDL_events.h:722
axis
SDL_Texture * axis
Definition: testgamecontroller.c:67
SDL_GetEventState
#define SDL_GetEventState(type)
Definition: SDL_events.h:735
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2649
SDL_PushEvent
#define SDL_PushEvent
Definition: SDL_dynapi_overrides.h:125
value
GLsizei const GLfloat * value
Definition: SDL_opengl_glext.h:698
SDL_Event
General event structure.
Definition: SDL_events.h:525
SDL_CONTROLLERAXISMOTION
Definition: SDL_events.h:117

## SDL_PrivateGameControllerButton()

static int SDL_PrivateGameControllerButton | ( | SDL_GameController * | gamecontroller,
|  | SDL_GameControllerButton | button,
|  | Uint8 | state
| ) |  |

static

Definition at line 1801 of file SDL_gamecontroller.c.

References button, SDL_CONTROLLER_BUTTON_INVALID, SDL_CONTROLLERBUTTONDOWN, SDL_CONTROLLERBUTTONUP, SDL_ENABLE, SDL_GetEventState, SDL_PRESSED, SDL_PushEvent, SDL_RELEASED, state, and SDL_Event::type.

Referenced by HandleJoystickAxis(), HandleJoystickButton(), HandleJoystickHat(), ResetOutput(), and SDL_GameControllerIgnoreDevicesExceptChanged().

{
int posted;
#if !SDL_EVENTS_DISABLED
SDL_Event event;
if (button == SDL_CONTROLLER_BUTTON_INVALID)
return (0);
switch (state) {
case SDL_PRESSED:
event.type = SDL_CONTROLLERBUTTONDOWN;
break;
case SDL_RELEASED:
event.type = SDL_CONTROLLERBUTTONUP;
break;
default:
/* Invalid state -- bail */
return (0);
}
#endif /* !SDL_EVENTS_DISABLED */
/* translate the event, if desired */
posted = 0;
#if !SDL_EVENTS_DISABLED
if (SDL_GetEventState(event.type) == SDL_ENABLE) {
event.cbutton.which = gamecontroller->joystick->instance_id;
event.cbutton.button = button;
event.cbutton.state = state;
posted = SDL_PushEvent(&event) == 1;
}
#endif /* !SDL_EVENTS_DISABLED */
return (posted);
}
SDL_CONTROLLER_BUTTON_INVALID
Definition: SDL_gamecontroller.h:303
button
SDL_Texture * button
Definition: testgamecontroller.c:67
state
struct xkb_state * state
Definition: SDL_waylandsym.h:113
SDL_ENABLE
#define SDL_ENABLE
Definition: SDL_events.h:722
SDL_CONTROLLERBUTTONUP
Definition: SDL_events.h:119
SDL_GetEventState
#define SDL_GetEventState(type)
Definition: SDL_events.h:735
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2649
SDL_PushEvent
#define SDL_PushEvent
Definition: SDL_dynapi_overrides.h:125
SDL_CONTROLLERBUTTONDOWN
Definition: SDL_events.h:118
SDL_Event
General event structure.
Definition: SDL_events.h:525
SDL_PRESSED
#define SDL_PRESSED
Definition: SDL_events.h:50
SDL_RELEASED
#define SDL_RELEASED
Definition: SDL_events.h:49
SDL_Event::type
Uint32 type
Definition: SDL_events.h:527

## SDL_PrivateGameControllerParseControllerConfigString()

static void SDL_PrivateGameControllerParseControllerConfigString | ( | SDL_GameController * | gamecontroller,
|  | const char * | pchString
| ) |  |

static

Definition at line 619 of file SDL_gamecontroller.c.

References i, SDL_FALSE, SDL_PrivateGameControllerParseElement(), SDL_SetError, SDL_TRUE, and SDL_zero.

Referenced by SDL_PrivateLoadButtonMapping().

{
char szGameButton[20];
char szJoystickButton[20];
SDL_bool bGameButton = SDL_TRUE;
int i = 0;
const char *pchPos = pchString;
SDL_zero(szGameButton);
SDL_zero(szJoystickButton);
while (pchPos && *pchPos) {
if (*pchPos == ':') {
i = 0;
bGameButton = SDL_FALSE;
} else if (*pchPos == ' ') {
} else if (*pchPos == ',') {
i = 0;
bGameButton = SDL_TRUE;
SDL_PrivateGameControllerParseElement(gamecontroller, szGameButton, szJoystickButton);
SDL_zero(szGameButton);
SDL_zero(szJoystickButton);
} else if (bGameButton) {
if (i >= sizeof(szGameButton)) {
SDL_SetError("Button name too large: %s", szGameButton);
return;
}
szGameButton[i] = *pchPos;
i++;
} else {
if (i >= sizeof(szJoystickButton)) {
SDL_SetError("Joystick button name too large: %s", szJoystickButton);
return;
}
szJoystickButton[i] = *pchPos;
i++;
}
pchPos++;
}
SDL_PrivateGameControllerParseElement(gamecontroller, szGameButton, szJoystickButton);
}
SDL_TRUE
Definition: SDL_stdinc.h:142
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_zero
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_PrivateGameControllerParseElement
static void SDL_PrivateGameControllerParseElement(SDL_GameController *gamecontroller, const char *szGameButton, const char *szJoystickButton)
Definition: SDL_gamecontroller.c:523
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:139
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30

## SDL_PrivateGameControllerParseElement()

static void SDL_PrivateGameControllerParseElement | ( | SDL_GameController * | gamecontroller,
|  | const char * | szGameButton,
|  | const char * | szJoystickButton
| ) |  |

static

Definition at line 523 of file SDL_gamecontroller.c.

References SDL_ExtendedGameControllerBind::axis, axis, SDL_ExtendedGameControllerBind::button, button, SDL_ExtendedGameControllerBind::hat, SDL_ExtendedGameControllerBind::input, SDL_ExtendedGameControllerBind::inputType, SDL_ExtendedGameControllerBind::output, SDL_ExtendedGameControllerBind::outputType, SDL_atoi, SDL_CONTROLLER_AXIS_INVALID, SDL_CONTROLLER_AXIS_TRIGGERLEFT, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, SDL_CONTROLLER_BINDTYPE_AXIS, SDL_CONTROLLER_BINDTYPE_BUTTON, SDL_CONTROLLER_BINDTYPE_HAT, SDL_CONTROLLER_BUTTON_INVALID, SDL_FALSE, SDL_GameControllerGetAxisFromString(), SDL_GameControllerGetButtonFromString(), SDL_isdigit, SDL_JOYSTICK_AXIS_MAX, SDL_JOYSTICK_AXIS_MIN, SDL_OutOfMemory, SDL_realloc, SDL_SetError, SDL_strlen, and SDL_TRUE.

Referenced by SDL_PrivateGameControllerParseControllerConfigString().

{
SDL_ExtendedGameControllerBind bind;
SDL_GameControllerButton button;
SDL_GameControllerAxis axis;
SDL_bool invert_input = SDL_FALSE;
char half_axis_input = 0;
char half_axis_output = 0;
if (*szGameButton == '+' || *szGameButton == '-') {
half_axis_output = *szGameButton++;
}
axis = SDL_GameControllerGetAxisFromString(szGameButton);
button = SDL_GameControllerGetButtonFromString(szGameButton);
if (axis != SDL_CONTROLLER_AXIS_INVALID) {
bind.outputType = SDL_CONTROLLER_BINDTYPE_AXIS;
bind.output.axis.axis = axis;
if (axis == SDL_CONTROLLER_AXIS_TRIGGERLEFT || axis == SDL_CONTROLLER_AXIS_TRIGGERRIGHT) {
bind.output.axis.axis_min = 0;
bind.output.axis.axis_max = SDL_JOYSTICK_AXIS_MAX;
} else {
if (half_axis_output == '+') {
bind.output.axis.axis_min = 0;
bind.output.axis.axis_max = SDL_JOYSTICK_AXIS_MAX;
} else if (half_axis_output == '-') {
bind.output.axis.axis_min = 0;
bind.output.axis.axis_max = SDL_JOYSTICK_AXIS_MIN;
} else {
bind.output.axis.axis_min = SDL_JOYSTICK_AXIS_MIN;
bind.output.axis.axis_max = SDL_JOYSTICK_AXIS_MAX;
}
}
} else if (button != SDL_CONTROLLER_BUTTON_INVALID) {
bind.outputType = SDL_CONTROLLER_BINDTYPE_BUTTON;
bind.output.button = button;
} else {
SDL_SetError("Unexpected controller element %s", szGameButton);
return;
}
if (*szJoystickButton == '+' || *szJoystickButton == '-') {
half_axis_input = *szJoystickButton++;
}
if (szJoystickButton[SDL_strlen(szJoystickButton) - 1] == '~') {
invert_input = SDL_TRUE;
}
if (szJoystickButton[0] == 'a' && SDL_isdigit(szJoystickButton[1])) {
bind.inputType = SDL_CONTROLLER_BINDTYPE_AXIS;
bind.input.axis.axis = SDL_atoi(&szJoystickButton[1]);
if (half_axis_input == '+') {
bind.input.axis.axis_min = 0;
bind.input.axis.axis_max = SDL_JOYSTICK_AXIS_MAX;
} else if (half_axis_input == '-') {
bind.input.axis.axis_min = 0;
bind.input.axis.axis_max = SDL_JOYSTICK_AXIS_MIN;
} else {
bind.input.axis.axis_min = SDL_JOYSTICK_AXIS_MIN;
bind.input.axis.axis_max = SDL_JOYSTICK_AXIS_MAX;
}
if (invert_input) {
int tmp = bind.input.axis.axis_min;
bind.input.axis.axis_min = bind.input.axis.axis_max;
bind.input.axis.axis_max = tmp;
}
} else if (szJoystickButton[0] == 'b' && SDL_isdigit(szJoystickButton[1])) {
bind.inputType = SDL_CONTROLLER_BINDTYPE_BUTTON;
bind.input.button = SDL_atoi(&szJoystickButton[1]);
} else if (szJoystickButton[0] == 'h' && SDL_isdigit(szJoystickButton[1]) &&
szJoystickButton[2] == '.' && SDL_isdigit(szJoystickButton[3])) {
int hat = SDL_atoi(&szJoystickButton[1]);
int mask = SDL_atoi(&szJoystickButton[3]);
bind.inputType = SDL_CONTROLLER_BINDTYPE_HAT;
bind.input.hat.hat = hat;
bind.input.hat.hat_mask = mask;
} else {
SDL_SetError("Unexpected joystick element: %s", szJoystickButton);
return;
}
++gamecontroller->num_bindings;
gamecontroller->bindings = (SDL_ExtendedGameControllerBind *)SDL_realloc(gamecontroller->bindings, gamecontroller->num_bindings * sizeof(*gamecontroller->bindings));
if (!gamecontroller->bindings) {
gamecontroller->num_bindings = 0;
SDL_OutOfMemory();
return;
}
gamecontroller->bindings[gamecontroller->num_bindings - 1] = bind;
}
SDL_CONTROLLER_BUTTON_INVALID
Definition: SDL_gamecontroller.h:303
SDL_ExtendedGameControllerBind::output
union SDL_ExtendedGameControllerBind::@24 output
SDL_GameControllerGetButtonFromString
SDL_GameControllerButton SDL_GameControllerGetButtonFromString(const char *pchString)
Definition: SDL_gamecontroller.c:496
button
SDL_Texture * button
Definition: testgamecontroller.c:67
SDL_TRUE
Definition: SDL_stdinc.h:142
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_GameControllerGetAxisFromString
SDL_GameControllerAxis SDL_GameControllerGetAxisFromString(const char *pchString)
Definition: SDL_gamecontroller.c:444
SDL_ExtendedGameControllerBind::inputType
SDL_GameControllerBindType inputType
Definition: SDL_gamecontroller.c:48
SDL_CONTROLLER_BINDTYPE_BUTTON
Definition: SDL_gamecontroller.h:64
axis
SDL_Texture * axis
Definition: testgamecontroller.c:67
SDL_GameControllerButton
SDL_GameControllerButton
Definition: SDL_gamecontroller.h:301
SDL_realloc
#define SDL_realloc
Definition: SDL_dynapi_overrides.h:376
SDL_JOYSTICK_AXIS_MIN
#define SDL_JOYSTICK_AXIS_MIN
Definition: SDL_joystick.h:289
SDL_ExtendedGameControllerBind::input
union SDL_ExtendedGameControllerBind::@23 input
SDL_JOYSTICK_AXIS_MAX
#define SDL_JOYSTICK_AXIS_MAX
Definition: SDL_joystick.h:288
SDL_isdigit
#define SDL_isdigit
Definition: SDL_dynapi_overrides.h:382
mask
GLenum GLint GLuint mask
Definition: SDL_opengl_glext.h:657
SDL_ExtendedGameControllerBind::outputType
SDL_GameControllerBindType outputType
Definition: SDL_gamecontroller.c:66
SDL_CONTROLLER_AXIS_INVALID
Definition: SDL_gamecontroller.h:259
SDL_atoi
#define SDL_atoi
Definition: SDL_dynapi_overrides.h:410
SDL_CONTROLLER_AXIS_TRIGGERRIGHT
Definition: SDL_gamecontroller.h:265
SDL_CONTROLLER_AXIS_TRIGGERLEFT
Definition: SDL_gamecontroller.h:264
SDL_OutOfMemory
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:139
SDL_ExtendedGameControllerBind::hat
int hat
Definition: SDL_gamecontroller.c:60
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_strlen
#define SDL_strlen
Definition: SDL_dynapi_overrides.h:393
SDL_ExtendedGameControllerBind::button
int button
Definition: SDL_gamecontroller.c:51
SDL_CONTROLLER_BINDTYPE_HAT
Definition: SDL_gamecontroller.h:66
SDL_CONTROLLER_BINDTYPE_AXIS
Definition: SDL_gamecontroller.h:65
SDL_GameControllerAxis
SDL_GameControllerAxis
Definition: SDL_gamecontroller.h:257
SDL_ExtendedGameControllerBind
Definition: SDL_gamecontroller.c:46
SDL_ExtendedGameControllerBind::axis
int axis
Definition: SDL_gamecontroller.c:54

## SDL_PrivateGameControllerRefreshMapping()

static void SDL_PrivateGameControllerRefreshMapping | ( | ControllerMapping_t * | pControllerMapping | ) |

static

Definition at line 782 of file SDL_gamecontroller.c.

References ControllerMapping_t::guid, ControllerMapping_t::mapping, ControllerMapping_t::name, SDL_CONTROLLERDEVICEREMAPPED, SDL_gamecontrollers, SDL_memcmp, SDL_PrivateLoadButtonMapping(), and SDL_PushEvent.

Referenced by SDL_PrivateAddMappingForGUID().

{
SDL_GameController *gamecontrollerlist = SDL_gamecontrollers;
while (gamecontrollerlist) {
if (!SDL_memcmp(&gamecontrollerlist->guid, &pControllerMapping->guid, sizeof(pControllerMapping->guid))) {
SDL_Event event;
event.type = SDL_CONTROLLERDEVICEREMAPPED;
event.cdevice.which = gamecontrollerlist->joystick->instance_id;
SDL_PushEvent(&event);
/* Not really threadsafe. Should this lock access within SDL_GameControllerEventWatcher? */
SDL_PrivateLoadButtonMapping(gamecontrollerlist, pControllerMapping->guid, pControllerMapping->name, pControllerMapping->mapping);
}
gamecontrollerlist = gamecontrollerlist->next;
}
}
ControllerMapping_t::guid
SDL_JoystickGUID guid
Definition: SDL_gamecontroller.c:91
SDL_gamecontrollers
static SDL_GameController * SDL_gamecontrollers
Definition: SDL_gamecontroller.c:44
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2649
SDL_PushEvent
#define SDL_PushEvent
Definition: SDL_dynapi_overrides.h:125
SDL_memcmp
#define SDL_memcmp
Definition: SDL_dynapi_overrides.h:389
SDL_CONTROLLERDEVICEREMAPPED
Definition: SDL_events.h:122
ControllerMapping_t::name
char * name
Definition: SDL_gamecontroller.c:92
ControllerMapping_t::mapping
char * mapping
Definition: SDL_gamecontroller.c:93
SDL_Event
General event structure.
Definition: SDL_events.h:525
SDL_PrivateLoadButtonMapping
static void SDL_PrivateLoadButtonMapping(SDL_GameController *gamecontroller, SDL_JoystickGUID guid, const char *pchName, const char *pchMapping)
Definition: SDL_gamecontroller.c:668

## SDL_PrivateGetControllerGUIDFromMappingString()

static char* SDL_PrivateGetControllerGUIDFromMappingString | ( | const char * | pMapping | ) |

static

Definition at line 698 of file SDL_gamecontroller.c.

References NULL, SDL_malloc, SDL_memcmp, SDL_memcpy, SDL_OutOfMemory, SDL_strchr, and SDL_strlen.

Referenced by SDL_PrivateGameControllerAddMapping().

{
const char *pFirstComma = SDL_strchr(pMapping, ',');
if (pFirstComma) {
char *pchGUID = SDL_malloc(pFirstComma - pMapping + 1);
if (!pchGUID) {
SDL_OutOfMemory();
return NULL;
}
SDL_memcpy(pchGUID, pMapping, pFirstComma - pMapping);
pchGUID[pFirstComma - pMapping] = '\0';
/* Convert old style GUIDs to the new style in 2.0.5 */
#if __WIN32__
if (SDL_strlen(pchGUID) == 32 &&
SDL_memcmp(&pchGUID[20], "504944564944", 12) == 0) {
SDL_memcpy(&pchGUID[20], "000000000000", 12);
SDL_memcpy(&pchGUID[16], &pchGUID[4], 4);
SDL_memcpy(&pchGUID[8], &pchGUID[0], 4);
SDL_memcpy(&pchGUID[0], "03000000", 8);
}
#elif __MACOSX__
if (SDL_strlen(pchGUID) == 32 &&
SDL_memcmp(&pchGUID[4], "000000000000", 12) == 0 &&
SDL_memcmp(&pchGUID[20], "000000000000", 12) == 0) {
SDL_memcpy(&pchGUID[20], "000000000000", 12);
SDL_memcpy(&pchGUID[8], &pchGUID[0], 4);
SDL_memcpy(&pchGUID[0], "03000000", 8);
}
#endif
return pchGUID;
}
return NULL;
}
SDL_strchr
#define SDL_strchr
Definition: SDL_dynapi_overrides.h:401
SDL_memcpy
#define SDL_memcpy
Definition: SDL_dynapi_overrides.h:387
SDL_memcmp
#define SDL_memcmp
Definition: SDL_dynapi_overrides.h:389
NULL
#define NULL
Definition: begin_code.h:164
SDL_OutOfMemory
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
SDL_strlen
#define SDL_strlen
Definition: SDL_dynapi_overrides.h:393
SDL_malloc
#define SDL_malloc
Definition: SDL_dynapi_overrides.h:374

## SDL_PrivateGetControllerMapping()

static ControllerMapping_t* SDL_PrivateGetControllerMapping | ( | int | device_index | ) |

static

Definition at line 907 of file SDL_gamecontroller.c.

References recDevice::guid, recDevice::name, NULL, s_pXInputMapping, SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT, SDL_JoystickGetDeviceGUID, SDL_JoystickNameForIndex, SDL_LockJoysticks, SDL_NumJoysticks, SDL_PrivateAddMappingForGUID(), SDL_PrivateGetControllerMappingForNameAndGUID(), SDL_SetError, SDL_snprintf, and SDL_UnlockJoysticks.

Referenced by SDL_GameControllerNameForIndex(), SDL_GameControllerOpen(), and SDL_IsGameController().

{
const char *name;
SDL_JoystickGUID guid;
ControllerMapping_t *mapping;
SDL_LockJoysticks();
if ((device_index < 0) || (device_index >= SDL_NumJoysticks())) {
SDL_SetError("There are %d joysticks available", SDL_NumJoysticks());
SDL_UnlockJoysticks();
return (NULL);
}
name = SDL_JoystickNameForIndex(device_index);
guid = SDL_JoystickGetDeviceGUID(device_index);
mapping = SDL_PrivateGetControllerMappingForNameAndGUID(name, guid);
#if SDL_JOYSTICK_XINPUT
if (!mapping && SDL_SYS_IsXInputGamepad_DeviceIndex(device_index)) {
mapping = s_pXInputMapping;
}
#endif
#if defined(__ANDROID__)
if (!mapping && SDL_SYS_IsDPAD_DeviceIndex(device_index)) {
SDL_bool existing;
char mapping_string[1024];
SDL_snprintf(mapping_string, sizeof(mapping_string), "none,%s,a:b0,b:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,", name);
mapping = SDL_PrivateAddMappingForGUID(guid, mapping_string,
&existing, SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT);
}
#endif /* __ANDROID__ */
SDL_UnlockJoysticks();
return mapping;
}
SDL_UnlockJoysticks
#define SDL_UnlockJoysticks
Definition: SDL_dynapi_overrides.h:639
SDL_JoystickNameForIndex
#define SDL_JoystickNameForIndex
Definition: SDL_dynapi_overrides.h:196
SDL_PrivateGetControllerMappingForNameAndGUID
static ControllerMapping_t * SDL_PrivateGetControllerMappingForNameAndGUID(const char *name, SDL_JoystickGUID guid)
Definition: SDL_gamecontroller.c:875
SDL_NumJoysticks
#define SDL_NumJoysticks
Definition: SDL_dynapi_overrides.h:195
name
GLuint const GLchar * name
Definition: SDL_opengl_glext.h:660
SDL_JoystickGetDeviceGUID
#define SDL_JoystickGetDeviceGUID
Definition: SDL_dynapi_overrides.h:199
NULL
#define NULL
Definition: begin_code.h:164
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:139
SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT
Definition: SDL_gamecontroller.c:84
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
ControllerMapping_t
Definition: SDL_gamecontroller.c:89
SDL_JoystickGUID
Definition: SDL_joystick.h:70
s_pXInputMapping
static ControllerMapping_t * s_pXInputMapping
Definition: SDL_gamecontroller.c:100
SDL_snprintf
#define SDL_snprintf
Definition: SDL_dynapi_overrides.h:40
mapping
GLenum GLenum GLenum GLenum mapping
Definition: SDL_opengl_glext.h:9374
SDL_LockJoysticks
#define SDL_LockJoysticks
Definition: SDL_dynapi_overrides.h:638
SDL_PrivateAddMappingForGUID
static ControllerMapping_t * SDL_PrivateAddMappingForGUID(SDL_JoystickGUID jGUID, const char *mappingString, SDL_bool *existing, SDL_ControllerMappingPriority priority)
Definition: SDL_gamecontroller.c:804

## SDL_PrivateGetControllerMappingForGUID()

static ControllerMapping_t* SDL_PrivateGetControllerMappingForGUID | ( | SDL_JoystickGUID * | guid | ) |

static

Definition at line 419 of file SDL_gamecontroller.c.

References ControllerMapping_t::guid, ControllerMapping_t::next, NULL, s_pSupportedControllers, and SDL_memcmp.

Referenced by SDL_GameControllerMappingForGUID(), SDL_PrivateAddMappingForGUID(), and SDL_PrivateGetControllerMappingForNameAndGUID().

{
ControllerMapping_t *pSupportedController = s_pSupportedControllers;
while (pSupportedController) {
if (SDL_memcmp(guid, &pSupportedController->guid, sizeof(*guid)) == 0) {
return pSupportedController;
}
pSupportedController = pSupportedController->next;
}
return NULL;
}
ControllerMapping_t::next
struct _ControllerMapping_t * next
Definition: SDL_gamecontroller.c:95
ControllerMapping_t::guid
SDL_JoystickGUID guid
Definition: SDL_gamecontroller.c:91
s_pSupportedControllers
static ControllerMapping_t * s_pSupportedControllers
Definition: SDL_gamecontroller.c:99
SDL_memcmp
#define SDL_memcmp
Definition: SDL_dynapi_overrides.h:389
NULL
#define NULL
Definition: begin_code.h:164
ControllerMapping_t
Definition: SDL_gamecontroller.c:89

## SDL_PrivateGetControllerMappingForNameAndGUID()

static ControllerMapping_t* SDL_PrivateGetControllerMappingForNameAndGUID | ( | const char * | name,
|  | SDL_JoystickGUID | guid
| ) |  |

static

Definition at line 875 of file SDL_gamecontroller.c.

References s_pEmscriptenMapping, s_pXInputMapping, SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT, SDL_PrivateAddMappingForGUID(), SDL_PrivateGetControllerMappingForGUID(), SDL_strstr, and void.

Referenced by SDL_IsGameControllerNameAndGUID(), and SDL_PrivateGetControllerMapping().

{
ControllerMapping_t *mapping;
mapping = SDL_PrivateGetControllerMappingForGUID(&guid);
#if defined(SDL_JOYSTICK_EMSCRIPTEN)
if (!mapping && s_pEmscriptenMapping) {
mapping = s_pEmscriptenMapping;
}
#else
(void) s_pEmscriptenMapping; /* pacify ARMCC */
#endif
#ifdef __LINUX__
if (!mapping && name) {
if (SDL_strstr(name, "Xbox 360 Wireless Receiver")) {
/* The Linux driver xpad.c maps the wireless dpad to buttons */
SDL_bool existing;
mapping = SDL_PrivateAddMappingForGUID(guid,
"none,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,",
&existing, SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT);
}
}
#endif /* __LINUX__ */
if (!mapping && name) {
if (SDL_strstr(name, "Xbox") || SDL_strstr(name, "X-Box") || SDL_strstr(name, "XBOX")) {
mapping = s_pXInputMapping;
}
}
return mapping;
}
s_pEmscriptenMapping
static ControllerMapping_t * s_pEmscriptenMapping
Definition: SDL_gamecontroller.c:101
name
GLuint const GLchar * name
Definition: SDL_opengl_glext.h:660
SDL_PrivateGetControllerMappingForGUID
static ControllerMapping_t * SDL_PrivateGetControllerMappingForGUID(SDL_JoystickGUID *guid)
Definition: SDL_gamecontroller.c:419
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:139
SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT
Definition: SDL_gamecontroller.c:84
ControllerMapping_t
Definition: SDL_gamecontroller.c:89
void
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
Definition: SDL_dynapi_procs.h:89
s_pXInputMapping
static ControllerMapping_t * s_pXInputMapping
Definition: SDL_gamecontroller.c:100
mapping
GLenum GLenum GLenum GLenum mapping
Definition: SDL_opengl_glext.h:9374
SDL_PrivateAddMappingForGUID
static ControllerMapping_t * SDL_PrivateAddMappingForGUID(SDL_JoystickGUID jGUID, const char *mappingString, SDL_bool *existing, SDL_ControllerMappingPriority priority)
Definition: SDL_gamecontroller.c:804
SDL_strstr
#define SDL_strstr
Definition: SDL_dynapi_overrides.h:403

## SDL_PrivateGetControllerMappingFromMappingString()

static char* SDL_PrivateGetControllerMappingFromMappingString | ( | const char * | pMapping | ) |

static

Definition at line 764 of file SDL_gamecontroller.c.

References NULL, SDL_strchr, and SDL_strdup.

Referenced by SDL_PrivateAddMappingForGUID().

{
const char *pFirstComma, *pSecondComma;
pFirstComma = SDL_strchr(pMapping, ',');
if (!pFirstComma)
return NULL;
pSecondComma = SDL_strchr(pFirstComma + 1, ',');
if (!pSecondComma)
return NULL;
return SDL_strdup(pSecondComma + 1); /* mapping is everything after the 3rd comma */
}
SDL_strchr
#define SDL_strchr
Definition: SDL_dynapi_overrides.h:401
NULL
#define NULL
Definition: begin_code.h:164
SDL_strdup
#define SDL_strdup
Definition: SDL_dynapi_overrides.h:397

## SDL_PrivateGetControllerNameFromMappingString()

static char* SDL_PrivateGetControllerNameFromMappingString | ( | const char * | pMapping | ) |

static

Definition at line 737 of file SDL_gamecontroller.c.

References NULL, SDL_malloc, SDL_memcpy, SDL_OutOfMemory, and SDL_strchr.

Referenced by SDL_PrivateAddMappingForGUID().

{
const char *pFirstComma, *pSecondComma;
char *pchName;
pFirstComma = SDL_strchr(pMapping, ',');
if (!pFirstComma)
return NULL;
pSecondComma = SDL_strchr(pFirstComma + 1, ',');
if (!pSecondComma)
return NULL;
pchName = SDL_malloc(pSecondComma - pFirstComma);
if (!pchName) {
SDL_OutOfMemory();
return NULL;
}
SDL_memcpy(pchName, pFirstComma + 1, pSecondComma - pFirstComma);
pchName[pSecondComma - pFirstComma - 1] = 0;
return pchName;
}
SDL_strchr
#define SDL_strchr
Definition: SDL_dynapi_overrides.h:401
SDL_memcpy
#define SDL_memcpy
Definition: SDL_dynapi_overrides.h:387
NULL
#define NULL
Definition: begin_code.h:164
SDL_OutOfMemory
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
SDL_malloc
#define SDL_malloc
Definition: SDL_dynapi_overrides.h:374

## SDL_PrivateLoadButtonMapping()

static void SDL_PrivateLoadButtonMapping | ( | SDL_GameController * | gamecontroller,
|  | SDL_JoystickGUID | guid,
|  | const char * | pchName,
|  | const char * | pchMapping
| ) |  |

static

Definition at line 668 of file SDL_gamecontroller.c.

References SDL_ExtendedGameControllerBind::axis, recDevice::guid, i, SDL_ExtendedGameControllerBind::input, SDL_ExtendedGameControllerBind::inputType, SDL_ExtendedGameControllerBind::output, SDL_ExtendedGameControllerBind::outputType, SDL_CONTROLLER_AXIS_TRIGGERLEFT, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, SDL_CONTROLLER_BINDTYPE_AXIS, SDL_memset, and SDL_PrivateGameControllerParseControllerConfigString().

Referenced by SDL_GameControllerOpen(), and SDL_PrivateGameControllerRefreshMapping().

{
int i;
gamecontroller->guid = guid;
gamecontroller->name = pchName;
gamecontroller->num_bindings = 0;
SDL_memset(gamecontroller->last_match_axis, 0, gamecontroller->joystick->naxes * sizeof(*gamecontroller->last_match_axis));
SDL_PrivateGameControllerParseControllerConfigString(gamecontroller, pchMapping);
/* Set the zero point for triggers */
for (i = 0; i < gamecontroller->num_bindings; ++i) {
SDL_ExtendedGameControllerBind *binding = &gamecontroller->bindings[i];
if (binding->inputType == SDL_CONTROLLER_BINDTYPE_AXIS &&
binding->outputType == SDL_CONTROLLER_BINDTYPE_AXIS &&
(binding->output.axis.axis == SDL_CONTROLLER_AXIS_TRIGGERLEFT ||
binding->output.axis.axis == SDL_CONTROLLER_AXIS_TRIGGERRIGHT)) {
if (binding->input.axis.axis < gamecontroller->joystick->naxes) {
gamecontroller->joystick->axes[binding->input.axis.axis].value =
gamecontroller->joystick->axes[binding->input.axis.axis].zero = (Sint16)binding->input.axis.axis_min;
}
}
}
}
SDL_ExtendedGameControllerBind::output
union SDL_ExtendedGameControllerBind::@24 output
SDL_ExtendedGameControllerBind::inputType
SDL_GameControllerBindType inputType
Definition: SDL_gamecontroller.c:48
SDL_ExtendedGameControllerBind::input
union SDL_ExtendedGameControllerBind::@23 input
SDL_PrivateGameControllerParseControllerConfigString
static void SDL_PrivateGameControllerParseControllerConfigString(SDL_GameController *gamecontroller, const char *pchString)
Definition: SDL_gamecontroller.c:619
SDL_ExtendedGameControllerBind::outputType
SDL_GameControllerBindType outputType
Definition: SDL_gamecontroller.c:66
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_CONTROLLER_AXIS_TRIGGERRIGHT
Definition: SDL_gamecontroller.h:265
SDL_CONTROLLER_AXIS_TRIGGERLEFT
Definition: SDL_gamecontroller.h:264
SDL_CONTROLLER_BINDTYPE_AXIS
Definition: SDL_gamecontroller.h:65
SDL_memset
#define SDL_memset
Definition: SDL_dynapi_overrides.h:386
Sint16
int16_t Sint16
Definition: SDL_stdinc.h:163
SDL_ExtendedGameControllerBind
Definition: SDL_gamecontroller.c:46
SDL_ExtendedGameControllerBind::axis
int axis
Definition: SDL_gamecontroller.c:54

## SDL_ShouldIgnoreGameController()

SDL_bool SDL_ShouldIgnoreGameController | ( | const char * | name,
|  | SDL_JoystickGUID | guid
| ) |  |

Definition at line 1301 of file SDL_gamecontroller.c.

References SDL_vidpid_list::entries, i, MAKE_VIDPID, NULL, SDL_vidpid_list::num_entries, recDevice::product, SDL_FALSE, SDL_GetHintBoolean, SDL_GetJoystickGUIDInfo(), SDL_strncmp, and SDL_TRUE.

{
int i;
Uint16 vendor;
Uint16 product;
Uint32 vidpid;
if (SDL_allowed_controllers.num_entries == 0 &&
SDL_ignored_controllers.num_entries == 0) {
return SDL_FALSE;
}
SDL_GetJoystickGUIDInfo(guid, &vendor, &product, NULL);
vidpid = MAKE_VIDPID(vendor, product);
if (SDL_GetHintBoolean("SDL_GAMECONTROLLER_ALLOW_STEAM_VIRTUAL_GAMEPAD", SDL_FALSE)) {
/* We shouldn't ignore Steam's virtual gamepad since it's using the hints to filter out the real controllers so it can remap input for the virtual controller */
SDL_bool bSteamVirtualGamepad = SDL_FALSE;
#if defined(__LINUX__)
bSteamVirtualGamepad = (vendor == 0x28DE && product == 0x11FF);
#elif defined(__MACOSX__)
bSteamVirtualGamepad = (SDL_strncmp(name, "GamePad-", 8) == 0);
#elif defined(__WIN32__)
/* We can't tell on Windows, but Steam will block others in input hooks */
bSteamVirtualGamepad = SDL_TRUE;
#endif
if (bSteamVirtualGamepad) {
return SDL_FALSE;
}
}
if (SDL_allowed_controllers.num_entries > 0) {
for (i = 0; i < SDL_allowed_controllers.num_entries; ++i) {
if (vidpid == SDL_allowed_controllers.entries[i]) {
return SDL_FALSE;
}
}
return SDL_TRUE;
} else {
for (i = 0; i < SDL_ignored_controllers.num_entries; ++i) {
if (vidpid == SDL_ignored_controllers.entries[i]) {
return SDL_TRUE;
}
}
return SDL_FALSE;
}
}
SDL_vidpid_list::num_entries
int num_entries
Definition: SDL_gamecontroller.c:122
MAKE_VIDPID
#define MAKE_VIDPID(VID, PID)
Definition: SDL_sysjoystick.h:72
SDL_TRUE
Definition: SDL_stdinc.h:142
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_ignored_controllers
static SDL_vidpid_list SDL_ignored_controllers
Definition: SDL_gamecontroller.c:128
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_strncmp
#define SDL_strncmp
Definition: SDL_dynapi_overrides.h:418
name
GLuint const GLchar * name
Definition: SDL_opengl_glext.h:660
SDL_GetHintBoolean
#define SDL_GetHintBoolean
Definition: SDL_dynapi_overrides.h:608
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_vidpid_list::entries
Uint32 * entries
Definition: SDL_gamecontroller.c:124
NULL
#define NULL
Definition: begin_code.h:164
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:139
SDL_allowed_controllers
static SDL_vidpid_list SDL_allowed_controllers
Definition: SDL_gamecontroller.c:127
SDL_GetJoystickGUIDInfo
void SDL_GetJoystickGUIDInfo(SDL_JoystickGUID guid, Uint16 *vendor, Uint16 *product, Uint16 *version)
Definition: SDL_joystick.c:933
Uint16
uint16_t Uint16
Definition: SDL_stdinc.h:169

## UpdateEventsForDeviceRemoval()

static void UpdateEventsForDeviceRemoval | ( |  | ) |

static

Definition at line 196 of file SDL_gamecontroller.c.

References SDL_Event::cdevice, events, i, NULL, SDL_ADDEVENT, SDL_CONTROLLERDEVICEADDED, SDL_GETEVENT, SDL_PEEKEVENT, SDL_PeepEvents, SDL_stack_alloc, SDL_stack_free, and SDL_ControllerDeviceEvent::which.

Referenced by SDL_GameControllerEventWatcher().

{
int i, num_events;
SDL_Event *events;
num_events = SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, SDL_CONTROLLERDEVICEADDED, SDL_CONTROLLERDEVICEADDED);
if (num_events <= 0) {
return;
}
events = SDL_stack_alloc(SDL_Event, num_events);
if (!events) {
return;
}
num_events = SDL_PeepEvents(events, num_events, SDL_GETEVENT, SDL_CONTROLLERDEVICEADDED, SDL_CONTROLLERDEVICEADDED);
for (i = 0; i < num_events; ++i) {
--events[i].cdevice.which;
}
SDL_PeepEvents(events, num_events, SDL_ADDEVENT, 0, 0);
SDL_stack_free(events);
}
SDL_Event::cdevice
SDL_ControllerDeviceEvent cdevice
Definition: SDL_events.h:543
SDL_PEEKEVENT
Definition: SDL_events.h:579
events
static SDL_Event events[EVENT_BUF_SIZE]
Definition: testgesture.c:35
SDL_CONTROLLERDEVICEADDED
Definition: SDL_events.h:120
SDL_ControllerDeviceEvent::which
Sint32 which
Definition: SDL_events.h:392
SDL_PeepEvents
#define SDL_PeepEvents
Definition: SDL_dynapi_overrides.h:117
SDL_stack_alloc
#define SDL_stack_alloc(type, count)
Definition: SDL_stdinc.h:354
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
NULL
#define NULL
Definition: begin_code.h:164
SDL_Event
General event structure.
Definition: SDL_events.h:525
SDL_GETEVENT
Definition: SDL_events.h:580
SDL_ADDEVENT
Definition: SDL_events.h:578
SDL_stack_free
#define SDL_stack_free(data)
Definition: SDL_stdinc.h:355

## Variable Documentation

## map_StringForControllerAxis

const char* map_StringForControllerAxis[]

static

Initial value:
= {
"leftx",
"lefty",
"rightx",
"righty",
"lefttrigger",
"righttrigger",
NULL
}
NULL
#define NULL
Definition: begin_code.h:164

Definition at line 431 of file SDL_gamecontroller.c.

Referenced by SDL_GameControllerGetAxisFromString(), and SDL_GameControllerGetStringForAxis().

## map_StringForControllerButton

const char* map_StringForControllerButton[]

static

Initial value:
= {
"a",
"b",
"x",
"y",
"back",
"guide",
"start",
"leftstick",
"rightstick",
"leftshoulder",
"rightshoulder",
"dpup",
"dpdown",
"dpleft",
"dpright",
NULL
}
NULL
#define NULL
Definition: begin_code.h:164

Definition at line 474 of file SDL_gamecontroller.c.

Referenced by SDL_GameControllerGetButtonFromString(), and SDL_GameControllerGetStringForButton().

## s_pEmscriptenMapping

ControllerMapping_t* s_pEmscriptenMapping = NULL

static

Definition at line 101 of file SDL_gamecontroller.c.

Referenced by SDL_PrivateGetControllerMappingForNameAndGUID().

## s_pSupportedControllers

ControllerMapping_t* s_pSupportedControllers = NULL

static

Definition at line 99 of file SDL_gamecontroller.c.

Referenced by SDL_GameControllerQuitMappings(), and SDL_PrivateGetControllerMappingForGUID().

## s_pXInputMapping

ControllerMapping_t* s_pXInputMapping = NULL

static

Definition at line 100 of file SDL_gamecontroller.c.

Referenced by SDL_PrivateGetControllerMapping(), and SDL_PrivateGetControllerMappingForNameAndGUID().

## s_zeroGUID

SDL_JoystickGUID s_zeroGUID

static

Definition at line 98 of file SDL_gamecontroller.c.

## SDL_allowed_controllers

SDL_vidpid_list SDL_allowed_controllers

static

Definition at line 127 of file SDL_gamecontroller.c.

## SDL_gamecontrollers

SDL_GameController* SDL_gamecontrollers = NULL

static

Definition at line 44 of file SDL_gamecontroller.c.

Referenced by SDL_GameControllerClose(), SDL_GameControllerEventWatcher(), SDL_GameControllerFromInstanceID(), SDL_GameControllerOpen(), SDL_GameControllerQuit(), and SDL_PrivateGameControllerRefreshMapping().

## SDL_ignored_controllers

SDL_vidpid_list SDL_ignored_controllers

static

Definition at line 128 of file SDL_gamecontroller.c.