The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

SDL2::gamecontroller - SDL Game Controller Event Handling

SYNOPSIS

    use SDL2 qw[:gamecontroller];

DESCRIPTION

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.

Functions

These may be imported by name or with the :gamecontroller tag.

SDL_GameControllerAddMappingsFromRW( ... )

Load a set of Game Controller mappings from a seekable SDL data stream.

You can call this function several times, if needed, to load different database files.

If a new mapping is loaded for an already known controller GUID, the later version will overwrite the one currently loaded.

Mappings not belonging to the current platform or with no platform field specified will be ignored (i.e. mappings for Linux will be ignored in Windows, etc).

This function will load the text database entirely in memory before processing it, so take this into consideration if you are in a memory constrained environment.

Expected parameters include:

rw - the data stream for the mappings to be added
freerw - non-zero to close the stream after being read

Returns the number of mappings added or -1 on error; call SDL_GetError( ) for more information.

SDL_GameControllerAddMappingsFromRW( ... )

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

        SDL_GameControllerAddMappingsFromFile( 'gamecontrollerdb.txt' );

Expected parameters include:

file - the name of the database you want to load

Returns the number of mappings added or -1 on error; call SDL_GetError( ) for more information.

SDL_GameControllerAddMapping( ... )

Add support for controllers that SDL is unaware of or to cause an existing controller to have a different binding.

The mapping string has the format "GUID,name,mapping", 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 all XInput devices. The mapping format for joystick is:

        {| |bX |a joystickbutton, index X |- |hX.Y |hat X with value Y |- |aX |axis X of the joystick|}

Buttons can be used as a controller axes and vice versa.

This string shows an example of a valid mapping for a controller:

        341a3608000000000000504944564944,Afterglow 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

Expected parameters include:

mappingString - the mapping string

Returns 1 if a new mapping is added, 0 if an existing mapping is updated, -1 on error; call SDL_GetError( ) for more information.

SDL_GameControllerNumMappings( )

Get the number of mappings installed.

Returns the number of mappings.

SDL_GameControllerMappingForIndex( ... )

Get the mapping at a particular index.

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

SDL_GameControllerMappingForGUID( ... )

Get the game controller mapping string for a given GUID.

The returned string must be freed with SDL_free( ... ).

Expected parameters include:

guid - a structure containing the GUID for which a mapping is desired

Returns a mapping string or NULL on error; call SDL_GetError( ) for more information.

SDL_GameControllerMapping( ... )

Get the current mapping of a Game Controller.

The returned string must be freed with SDL_free( ... ).

Details about mappings are discussed with SDL_GameControllerAddMapping( ... ).

Expected parameters include:

gamecontroller - the game controller you want to get the current mapping for

Returns a string that has the controller's mapping or undef if no mapping is available; call SDL_GetError( ) for more information.

SDL_IsGameController( ... )

Check if the given joystick is supported by the game controller interface.

joystick_index is the same as the device_index passed to SDL_JoystickOpen( ... ).

Expected parameters include:

joystick_index - the device_index of a device, up to SDL_NumJoysticks( )

Returns SDL_TRUE if the given joystick is supported by the game controller interface, SDL_FALSE if it isn't or it's an invalid index.

SDL_GameControllerNameForIndex( ... )

Get the implementation dependent name for the game controller.

This function can be called before any controllers are opened.

joystick_index is the same as the device_index passed to SDL_JoystickOpen( ... ).

Expected parameters include:

joystick_index - the device_index of a device, from zero to SDL_NumJoysticks( ) - 1

Returns the implementation-dependent name for the game controller, or undef if there is no name or the index is invalid.

SDL_GameControllerTypeForIndex( ... )

Get the type of a game controller.

This can be called before any controllers are opened.

Expected parameters include:

joystick_index - the device_index of a device, from zero to SDL_NumJoysticks( ) - 1

Returns the controller type.

SDL_GameControllerMappingForDeviceIndex( ... )

Get the mapping of a game controller.

This can be called before any controllers are opened.

Expected parameters include:

joystick_index - the device_index of a device, from zero to SDL_NumJoysticks( ) - 1

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

SDL_GameControllerOpen( ... )

Open a game controller for use.

joystick_index is the same as the device_index passed to SDL_JoystickOpen( ... ).

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.

Expected parameters include;

joystick_index - the device_index of a device, up to SDL_NumJoysticks( )

Returns a gamecontroller identifier or undef if an error occurred; call SDL_GetError( ) for more information.

SDL_GameControllerFromInstanceID( ... )

Get the SDL_GameController associated with an instance id.

Expected parameters include:

joyid - the instance id to get the SDL2::GameController for

Returns an SDL2::GameController on success or undef on failure; call SDL_GetError( ) for more information.

SDL_GameControllerFromPlayerIndex( ... )

Get the SDL2::GameController associated with a player index.

Please note that the player index is _not_ the device index, nor is it the instance id!

Expected parameters include:

player_index - the player index (which is not the device index or the instance id)

Returns the SDL2::GameController associated with a player index.

SDL_GameControllerName( ... )

Get the implementation-dependent name for an opened game controller.

This is the same name as returned by SDL_GameControllerNameForIndex(), but it takes a controller identifier instead of the (unstable) device index.

Expected parameters include:

gamecontroller a game controller identifier previously returned by SDL_GameControllerOpen( ... )

Returns the implementation dependent name for the game controller, or undef if there is no name or the identifier passed is invalid.

SDL_GameControllerGetType( ... )

Get the type of this currently opened controller

This is the same name as returned by SDL_GameControllerTypeForIndex( ... ), but it takes a controller identifier instead of the (unstable) device index.

Expected parameters include:

gamecontroller - the game controller object to query

Returns the controller type.

SDL_GameControllerGetPlayerIndex( ... )

Get the player index of an opened game controller.

For XInput controllers this returns the XInput user index.

Expected parameters include:

gamecontroller - the game controller object to query

Returns player index for controller, or -1 if it's not available.

SDL_GameControllerSetPlayerIndex( ... )

Set the player index of an opened game controller.

Expected parameters include:

gamecontroller - the game controller object to adjust
player_index - player index to assign to this controller

SDL_GameControllerGetVendor( ... )

Get the USB vendor ID of an opened controller, if available.

If the vendor ID isn't available this function returns 0.

Expected parameters include:

gamecontroller - the game controller object to query

Return USB vendor ID, or zero if unavailable.

SDL_GameControllerGetProduct( ... )

Get the USB product ID of an opened controller, if available.

If the product ID isn't available this function returns 0.

Expected parameters include:

gamecontroller - the game controller object to query

Return USB product ID, or zero if unavailable.

SDL_GameControllerGetProductVersion( ... )

Get the product version of an opened controller, if available.

If the product version isn't available this function returns 0.

Expected parameters include:

gamecontroller - the game controller object to query

Return USB product version, or zero if unavailable.

SDL_GameControllerGetSerial( ... )

Get the serial number of an opened controller, if available.

Returns the serial number of the controller, or undef if it is not available.

Expected parameters include:

gamecontroller - the game controller object to query

Returns a serial number, or undef if unavailable.

SDL_GameControllerGetAttached( ... )

Check if a controller has been opened and is currently connected.

Expected parameters include:

gamecontroller - a game controller identifier previously returned by SDL_GameControllerOpen( ... )

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

SDL_GameControllerGetJoystick( ... )

Get the Joystick ID from a Game Controller.

This function will give you a SDL2::Joystick object, which allows you to use the SDL2::Joystick functions with a SDL2::GameController object. This would be useful for getting a joystick's position at any given time, even if it hasn't moved (moving it would produce an event, which would have the axis' value).

The pointer returned is owned by the SDL2::GameController. You should not call SDL_JoystickClose( ... ) on it, for example, since doing so will likely cause SDL to crash.

Expected parameters include:

gamecontroller - the game controller object that you want to get a joystick from

Returns a SDL2::Joystick object; call SDL_GetError( ) for more information.

SDL_GameControllerEventState( ... )

Query or change current state of Game Controller events.

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

Any number can be passed to SDL_GameControllerEventState( ... ), but only -1, 0, and 1 will have any effect. Other numbers will just be returned.

state - can be one of SDL_QUERY, SDL_IGNORE, or SDL_ENABLE

Returns the same value passed to the function, with exception to -1 (SDL_QUERY), which will return the current state.

SDL_GameControllerUpdate( )

Manually pump game controller updates if not using the loop.

This function is called automatically by the event loop if events are enabled. Under such circumstances, it will not be necessary to call this function.

SDL_GameControllerGetAxisFromString( ... )

Convert a string into SDL_GameControllerAxis enum.

This function is called internally to translate SDL2::GameController mapping strings for the underlying joystick device into the consistent SDL2::GameController mapping. You do not normally need to call this function unless you are parsing SDL2::GameController mappings in your own code.

Expected parameters include:

str - string representing a SDL2::GameController axis

Returns the SDL_GameControllerAxis enum corresponding to the input string, or SDL_CONTROLLER_AXIS_INVALID if no match was found.

SDL_GameControllerGetStringForAxis( ... )

Convert from an SDL_GameControllerAxis enum to a string.

The caller should not SDL_free( ... ) the returned string.

Expected parameters include:

axis - an enum value for a given SDL_GameControllerAxis

Returns a string for the given axis, or undef if an invalid axis is specified. The string returned is of the format used by SDL2::GameController mapping strings.

SDL_GameControllerGetBindForAxis( ... )

Get the SDL joystick layer binding for a controller axis mapping.

Expected parameters include:

gamecontroller - a game controller
axis - an axis enum value (one of the SDL_GameControllerAxis values)

Returns a SDL2::GameControllerButtonBind describing the bind. On failure (like the given Controller axis doesn't exist on the device), its bindType will be SDL_CONTROLLER_BINDTYPE_NONE.

SDL_GameControllerHasAxis( ... )

Query whether a game controller has a given axis.

This merely reports whether the controller's mapping defined this axis, as that is all the information SDL has about the physical device.

Expected parameters include:

gamecontroller - a game controller
axis - an axis enum value (an SDL_GameControllerAxis value)

Returns SDL_TRUE if the controller has this axis, SDL_FALSE otherwise.

SDL_GameControllerGetAxis( ... )

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

The axis indices start at index 0.

The state is a value ranging from -32768 to 32767. Triggers, however, range from 0 to 32767 (they never return a negative value).

Expected parameters include:

gamecontroller - a game controller
axis - an axis index (one of the SDL_GameControllerAxis values)

Returns axis state (including 0) on success or 0 (also) on failure; call SDL_GetError( ) for more information.

SDL_GameControllerGetButtonFromString( ... )

Convert a string into an SDL_GameControllerButton enum.

This function is called internally to translate SDL2::GameController mapping strings for the underlying joystick device into the consistent SDL2::GameController mapping. You do not normally need to call this function unless you are parsing SDL2::GameController mappings in your own code.

Expected parameters include:

str - string representing a SDL2::GameController axis

Returns the SDL_GameControllerButton enum corresponding to the input string, or SDL_CONTROLLER_AXIS_INVALID if no match was found.

SDL_GameControllerGetStringForButton( ... )

Convert from an SDL_GameControllerButton enum to a string.

The caller should not SDL_free( ) the returned string.

Expected parameters include:

button - an enum value for a given SDL2::GameControllerButton

Returns a string for the given button, or undef if an invalid axis is specified. The string returned is of the format used by SDL2::GameController mapping strings.

SDL_GameControllerGetBindForButton( ... )

Get the SDL joystick layer binding for a controller button mapping.

Expected parameters includes:

gamecontroller - a game controller
button - an button enum value (an SDL_GameControllerButton value)

Returns a SDL_GameControllerButtonBind describing the bind. On failure (like the given Controller button doesn't exist on the device), its bindType will be SDL_CONTROLLER_BINDTYPE_NONE.

SDL_GameControllerHasButton( ... )

Query whether a game controller has a given button.

This merely reports whether the controller's mapping defined this button, as that is all the information SDL has about the physical device.

Expected parameters include:

gamecontroller - a game controller
button - a button enum value (an SDL_GameControllerButton value)

Returns SDL_TRUE if the controller has this button, SDL_FALSE otherwise.

SDL_GameControllerGetButton( ... )

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

Expected parameters include:

gamecontroller - a game controller
button - a button index (one of the SDL_GameControllerButton values)

Returns 1 for pressed state or 0 for not pressed state or error; call SDL_GetError( ) for more information.

SDL_GameControllerGetNumTouchpads( ... )

Get the number of touchpads on a game controller.

Expected parameters include:

gamecontroller - a game controller

Returns the number of touchpads.

SDL_GameControllerGetNumTouchpadFingers( ... )

Get the number of supported simultaneous fingers on a touchpad on a game controller.

Expected parameters include:

gamecontroller - a game controller
touchpad - index of the touchpad to query

Returns the number of supported simultaneous fingers.

SDL_GameControllerGetTouchpadFinger( ... )

Get the current state of a finger on a touchpad on a game controller.

Expected parameters include:

gamecontroller - a game controller
touchpad - touchpad index to query
finger - finger index to query
state - pointer
x - pointer
y - pointer
pressure - pointer

Returns 0 if the given finger is defined on the given touchpad on the given controller, -1 otherwise.

SDL_GameControllerHasSensor( ... )

Return whether a game controller has a particular sensor.

Expected parameters include:

gamecontroller - the controller to query
type - the type of sensor to query

Returns SDL_TRUE if the sensor exists, SDL_FALSE otherwise.

SDL_GameControllerSetSensorEnabled( ... )

Set whether data reporting for a game controller sensor is enabled.

Expected parameters include:

gamecontroller - the controller to update
type - the type of sensor to enable/disable
enabled - whether data reporting should be enabled

Returns 0 or -1 if an error occurred.

SDL_GameControllerIsSensorEnabled( ... )

Query whether sensor data reporting is enabled for a game controller.

Expected parameters include:

gamecontroller - the controller to query
type - the type of sensor to query

Returns SDL_TRUE if the sensor is enabled, SDL_FALSE otherwise.

SDL_GameControllerGetSensorData( ... )

Get the current state of a game controller sensor.

The number of values and interpretation of the data is sensor dependent. See SDL_sensor.h for the details for each type of sensor.

Expected parameters include;

gamecontroller - the controller to query
type - the type of sensor to query
data - a pointer filled with the current sensor state
num_values - the number of values to write to data

Return 0 or -1 if an error occurred.

SDL_GameControllerRumble( ... )

Start a rumble effect on a game controller.

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

Expected parameters include:

gamecontroller - the controller to vibrate
low_frequency_rumble - the intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF
high_frequency_rumble - the intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF
duration_ms - the duration of the rumble effect, in milliseconds

Returns 0, or -1 if rumble isn't supported on this controller

SDL_GameControllerRumbleTriggers( ... )

Start a rumble effect in the game controller's triggers.

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

Note that this is rumbling of the _triggers_ and not the game controller as a whole. The first controller to offer this feature was the PlayStation 5's DualShock 5.

Expected parameters include:

gamecontroller - the controller to vibrate
left_rumble - the intensity of the left trigger rumble motor, from 0 to 0xFFFF
right_rumble - the intensity of the right trigger rumble motor, from 0 to 0xFFFF
duration_ms - the duration of the rumble effect, in milliseconds

Returns 0, or -1 if trigger rumble isn't supported on this controller.

SDL_GameControllerHasLED( ... )

Query whether a game controller has an LED.

Expected parameters include:

gamecontroller - the controller to query

Returns SDL_TRUE, or SDL_FALSE if this controller does not have a modifiable LED.

SDL_GameControllerSetLED( ... )

Update a game controller's LED color.

Expected parameters include:

gamecontroller - the controller to update
red - the intensity of the red LED
green - the intensity of the green LED
blue - the intensity of the blue LED

Returns 0, or -1 if this controller does not have a modifiable LED

SDL_GameControllerClose( ... )

Close a game controller previously opened with SDL_GameControllerOpen( ... ).

Expected parameters include:

gamecontroller - a game controller identifier previously returned by SDL_GameControllerOpen( ... )

Defined Values and Enumerations

These may be imported by name or with the given tag.

SDL_GameControllerType

SDL_CONTROLLER_TYPE_UNKNOWN
SDL_CONTROLLER_TYPE_XBOX360
SDL_CONTROLLER_TYPE_XBOXONE
SDL_CONTROLLER_TYPE_PS3
SDL_CONTROLLER_TYPE_PS4
SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO
SDL_CONTROLLER_TYPE_VIRTUAL
SDL_CONTROLLER_TYPE_PS5

SDL_GameControllerBindType

SDL_CONTROLLER_BINDTYPE_NONE
SDL_CONTROLLER_BINDTYPE_BUTTON
SDL_CONTROLLER_BINDTYPE_AXIS
SDL_CONTROLLER_BINDTYPE_HAT

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.

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

SDL_GameControllerButton

The list of buttons available from a controller.

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_MISC1 - Xbox Series X share button, PS5 microphone button, Nintendo Switch Pro capture button
SDL_CONTROLLER_BUTTON_PADDLE1 - Xbox Elite paddle P1
SDL_CONTROLLER_BUTTON_PADDLE2 - Xbox Elite paddle P3
SDL_CONTROLLER_BUTTON_PADDLE3 - Xbox Elite paddle P2
SDL_CONTROLLER_BUTTON_PADDLE4 - Xbox Elite paddle P4
SDL_CONTROLLER_BUTTON_TOUCHPAD - PS4/PS5 touchpad button
SDL_CONTROLLER_BUTTON_MAX

Notes

To count the number of game controllers in the system for the following:

        my $nJoysticks = SDL_NumJoysticks();
        my $nGameControllers = 0;
        for my $i (0 .. $nJoysticks) {
                $nGameControllers++ if SDL_IsGameController($i);
        }

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

LICENSE

Copyright (C) Sanko Robinson.

This library is free software; you can redistribute it and/or modify it under the terms found in the Artistic License 2. Other copyrights, terms, and conditions may apply to data transmitted through this module.

AUTHOR

Sanko Robinson <sanko@cpan.org>