SDL_gamecontroller.h File Reference
`#include "SDL_stdinc.h"`
`#include "SDL_error.h"`
`#include "SDL_rwops.h"`
`#include "SDL_joystick.h"`
`#include "begin_code.h"`
`#include "close_code.h"`
Include dependency graph for SDL_gamecontroller.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

## Data Structures

struct | SDL_GameControllerButtonBind

## Macros

#define | SDL_GameControllerAddMappingsFromFile(file) SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(file, "rb"), 1)

## Enumerations

enum | SDL_GameControllerBindType { SDL_CONTROLLER_BINDTYPE_NONE = 0, SDL_CONTROLLER_BINDTYPE_BUTTON, SDL_CONTROLLER_BINDTYPE_AXIS, SDL_CONTROLLER_BINDTYPE_HAT }
enum | SDL_GameControllerAxis { SDL_CONTROLLER_AXIS_INVALID = -1, SDL_CONTROLLER_AXIS_LEFTX, SDL_CONTROLLER_AXIS_LEFTY, SDL_CONTROLLER_AXIS_RIGHTX, SDL_CONTROLLER_AXIS_RIGHTY, SDL_CONTROLLER_AXIS_TRIGGERLEFT, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, SDL_CONTROLLER_AXIS_MAX }

enum

SDL_GameControllerButton {
SDL_CONTROLLER_BUTTON_INVALID = -1,
SDL_CONTROLLER_BUTTON_A,
SDL_CONTROLLER_BUTTON_B,
SDL_CONTROLLER_BUTTON_X,
SDL_CONTROLLER_BUTTON_Y,
SDL_CONTROLLER_BUTTON_BACK,
SDL_CONTROLLER_BUTTON_GUIDE,
SDL_CONTROLLER_BUTTON_START,
SDL_CONTROLLER_BUTTON_LEFTSTICK,
SDL_CONTROLLER_BUTTON_RIGHTSTICK,
SDL_CONTROLLER_BUTTON_LEFTSHOULDER,
SDL_CONTROLLER_BUTTON_RIGHTSHOULDER,
SDL_CONTROLLER_BUTTON_DPAD_UP,
SDL_CONTROLLER_BUTTON_DPAD_DOWN,
SDL_CONTROLLER_BUTTON_DPAD_LEFT,
SDL_CONTROLLER_BUTTON_DPAD_RIGHT,
SDL_CONTROLLER_BUTTON_MAX
}

## Functions

int | SDL_GameControllerAddMappingsFromRW (SDL_RWops *rw, int freerw)
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)
SDL_bool | SDL_IsGameController (int joystick_index)
const char * | SDL_GameControllerNameForIndex (int joystick_index)
SDL_GameController * | SDL_GameControllerOpen (int joystick_index)
SDL_GameController * | SDL_GameControllerFromInstanceID (SDL_JoystickID joyid)
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)
int | SDL_GameControllerEventState (int state)
void | SDL_GameControllerUpdate (void)
SDL_GameControllerAxis | SDL_GameControllerGetAxisFromString (const char *pchString)
const char * | SDL_GameControllerGetStringForAxis (SDL_GameControllerAxis axis)
SDL_GameControllerButtonBind | SDL_GameControllerGetBindForAxis (SDL_GameController *gamecontroller, SDL_GameControllerAxis axis)
Sint16 | SDL_GameControllerGetAxis (SDL_GameController *gamecontroller, SDL_GameControllerAxis axis)
SDL_GameControllerButton | SDL_GameControllerGetButtonFromString (const char *pchString)
const char * | SDL_GameControllerGetStringForButton (SDL_GameControllerButton button)
SDL_GameControllerButtonBind | SDL_GameControllerGetBindForButton (SDL_GameController *gamecontroller, SDL_GameControllerButton button)
Uint8 | SDL_GameControllerGetButton (SDL_GameController *gamecontroller, SDL_GameControllerButton button)
void | SDL_GameControllerClose (SDL_GameController *gamecontroller)

## Detailed Description

Include file for SDL game controller event handling

In order to use these functions, SDL_Init() must have been called with the SDL_INIT_GAMECONTROLLER flag. This causes SDL to scan the system for game controllers, and load appropriate drivers.

If you would like to receive controller updates while the application is in the background, you should set the following hint before calling SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS

Definition in file SDL_gamecontroller.h.

## Macro Definition Documentation

## SDL_GameControllerAddMappingsFromFile

#define SDL_GameControllerAddMappingsFromFile | ( |  | file | ) | SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(file, "rb"), 1)

Load a set of mappings from a file, filtered by the current SDL_GetPlatform()

Convenience macro.

Definition at line 129 of file SDL_gamecontroller.h.

Referenced by main(), and SDL_GameControllerInitMappings().

## Enumeration Type Documentation

## SDL_GameControllerAxis

enum SDL_GameControllerAxis

The list of axes available from a controller

Thumbstick axis values range from SDL_JOYSTICK_AXIS_MIN to SDL_JOYSTICK_AXIS_MAX, and are centered within ~8000 of zero, though advanced UI will allow users to set or autodetect the dead zone, which varies between controllers.

Trigger axis values range from 0 to SDL_JOYSTICK_AXIS_MAX.

Enumerator
SDL_CONTROLLER_AXIS_INVALID |
SDL_CONTROLLER_AXIS_LEFTX |
SDL_CONTROLLER_AXIS_LEFTY |
SDL_CONTROLLER_AXIS_RIGHTX |
SDL_CONTROLLER_AXIS_RIGHTY |
SDL_CONTROLLER_AXIS_TRIGGERLEFT |
SDL_CONTROLLER_AXIS_TRIGGERRIGHT |
SDL_CONTROLLER_AXIS_MAX |

Definition at line 257 of file SDL_gamecontroller.h.

{
SDL_CONTROLLER_AXIS_INVALID = -1,
SDL_CONTROLLER_AXIS_LEFTX,
SDL_CONTROLLER_AXIS_LEFTY,
SDL_CONTROLLER_AXIS_RIGHTX,
SDL_CONTROLLER_AXIS_RIGHTY,
SDL_CONTROLLER_AXIS_TRIGGERLEFT,
SDL_CONTROLLER_AXIS_TRIGGERRIGHT,
SDL_CONTROLLER_AXIS_MAX
} SDL_GameControllerAxis;
SDL_CONTROLLER_AXIS_LEFTY
Definition: SDL_gamecontroller.h:261
SDL_CONTROLLER_AXIS_RIGHTY
Definition: SDL_gamecontroller.h:263
SDL_CONTROLLER_AXIS_MAX
Definition: SDL_gamecontroller.h:266
SDL_CONTROLLER_AXIS_LEFTX
Definition: SDL_gamecontroller.h:260
SDL_CONTROLLER_AXIS_INVALID
Definition: SDL_gamecontroller.h:259
SDL_CONTROLLER_AXIS_TRIGGERRIGHT
Definition: SDL_gamecontroller.h:265
SDL_CONTROLLER_AXIS_TRIGGERLEFT
Definition: SDL_gamecontroller.h:264
SDL_CONTROLLER_AXIS_RIGHTX
Definition: SDL_gamecontroller.h:262
SDL_GameControllerAxis
SDL_GameControllerAxis
Definition: SDL_gamecontroller.h:257

## SDL_GameControllerBindType

enum SDL_GameControllerBindType

Enumerator
SDL_CONTROLLER_BINDTYPE_NONE |
SDL_CONTROLLER_BINDTYPE_BUTTON |
SDL_CONTROLLER_BINDTYPE_AXIS |
SDL_CONTROLLER_BINDTYPE_HAT |

Definition at line 61 of file SDL_gamecontroller.h.

{
SDL_CONTROLLER_BINDTYPE_NONE = 0,
SDL_CONTROLLER_BINDTYPE_BUTTON,
SDL_CONTROLLER_BINDTYPE_AXIS,
SDL_CONTROLLER_BINDTYPE_HAT
} SDL_GameControllerBindType;
SDL_GameControllerBindType
SDL_GameControllerBindType
Definition: SDL_gamecontroller.h:61
SDL_CONTROLLER_BINDTYPE_BUTTON
Definition: SDL_gamecontroller.h:64
SDL_CONTROLLER_BINDTYPE_HAT
Definition: SDL_gamecontroller.h:66
SDL_CONTROLLER_BINDTYPE_AXIS
Definition: SDL_gamecontroller.h:65
SDL_CONTROLLER_BINDTYPE_NONE
Definition: SDL_gamecontroller.h:63

## SDL_GameControllerButton

enum SDL_GameControllerButton

The list of buttons available from a controller

Enumerator
SDL_CONTROLLER_BUTTON_INVALID |
SDL_CONTROLLER_BUTTON_A |
SDL_CONTROLLER_BUTTON_B |
SDL_CONTROLLER_BUTTON_X |
SDL_CONTROLLER_BUTTON_Y |
SDL_CONTROLLER_BUTTON_BACK |
SDL_CONTROLLER_BUTTON_GUIDE |
SDL_CONTROLLER_BUTTON_START |
SDL_CONTROLLER_BUTTON_LEFTSTICK |
SDL_CONTROLLER_BUTTON_RIGHTSTICK |
SDL_CONTROLLER_BUTTON_LEFTSHOULDER |
SDL_CONTROLLER_BUTTON_RIGHTSHOULDER |
SDL_CONTROLLER_BUTTON_DPAD_UP |
SDL_CONTROLLER_BUTTON_DPAD_DOWN |
SDL_CONTROLLER_BUTTON_DPAD_LEFT |
SDL_CONTROLLER_BUTTON_DPAD_RIGHT |
SDL_CONTROLLER_BUTTON_MAX |

Definition at line 301 of file SDL_gamecontroller.h.

{
SDL_CONTROLLER_BUTTON_INVALID = -1,
SDL_CONTROLLER_BUTTON_A,
SDL_CONTROLLER_BUTTON_B,
SDL_CONTROLLER_BUTTON_X,
SDL_CONTROLLER_BUTTON_Y,
SDL_CONTROLLER_BUTTON_BACK,
SDL_CONTROLLER_BUTTON_GUIDE,
SDL_CONTROLLER_BUTTON_START,
SDL_CONTROLLER_BUTTON_LEFTSTICK,
SDL_CONTROLLER_BUTTON_RIGHTSTICK,
SDL_CONTROLLER_BUTTON_LEFTSHOULDER,
SDL_CONTROLLER_BUTTON_RIGHTSHOULDER,
SDL_CONTROLLER_BUTTON_DPAD_UP,
SDL_CONTROLLER_BUTTON_DPAD_DOWN,
SDL_CONTROLLER_BUTTON_DPAD_LEFT,
SDL_CONTROLLER_BUTTON_DPAD_RIGHT,
SDL_CONTROLLER_BUTTON_MAX
} SDL_GameControllerButton;
SDL_CONTROLLER_BUTTON_INVALID
Definition: SDL_gamecontroller.h:303
SDL_CONTROLLER_BUTTON_BACK
Definition: SDL_gamecontroller.h:308
SDL_CONTROLLER_BUTTON_GUIDE
Definition: SDL_gamecontroller.h:309
SDL_CONTROLLER_BUTTON_A
Definition: SDL_gamecontroller.h:304
SDL_CONTROLLER_BUTTON_DPAD_RIGHT
Definition: SDL_gamecontroller.h:318
SDL_CONTROLLER_BUTTON_B
Definition: SDL_gamecontroller.h:305
SDL_GameControllerButton
SDL_GameControllerButton
Definition: SDL_gamecontroller.h:301
SDL_CONTROLLER_BUTTON_START
Definition: SDL_gamecontroller.h:310
SDL_CONTROLLER_BUTTON_RIGHTSTICK
Definition: SDL_gamecontroller.h:312
SDL_CONTROLLER_BUTTON_LEFTSHOULDER
Definition: SDL_gamecontroller.h:313
SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
Definition: SDL_gamecontroller.h:314
SDL_CONTROLLER_BUTTON_MAX
Definition: SDL_gamecontroller.h:319
SDL_CONTROLLER_BUTTON_DPAD_UP
Definition: SDL_gamecontroller.h:315
SDL_CONTROLLER_BUTTON_X
Definition: SDL_gamecontroller.h:306
SDL_CONTROLLER_BUTTON_DPAD_LEFT
Definition: SDL_gamecontroller.h:317
SDL_CONTROLLER_BUTTON_Y
Definition: SDL_gamecontroller.h:307
SDL_CONTROLLER_BUTTON_LEFTSTICK
Definition: SDL_gamecontroller.h:311
SDL_CONTROLLER_BUTTON_DPAD_DOWN
Definition: SDL_gamecontroller.h:316

## Function Documentation

## 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_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_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_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_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