mirror of
https://github.com/encounter/SDL.git
synced 2025-05-29 10:41:36 +00:00
Jan Bujak I wrote a new driver for my gamepad on Linux. I'd like SDL to support it out-of-box, as currently it just treats it as a generic joystick instead of a gamepad. From what I can see the only way to do that is to either 1) pick one of the already supported controllers' PID, VID and button layouts and have my driver send that (effectively lying that it's something else), or 2) submit a preconfigured, hardcoded mapping to SDL. Both of those, in my opinion, are silly when we already have the Linux Gamepad Specification which standarizes this: https://www.kernel.org/doc/html/v4.15/input/gamepad.html Unfortunately SDL doesn't make use of it currently. So I've took it upon myself to add it; patch is in the attachments. Basically what the patch does is that if SDL finds no built-it controller mappings for a given joystick it then asks the joystick backend to autodetect it, and that uses the relevant evdev bits to figure out which button/axis is which. (See the specs for more details.) With this patch applied my own driver for my controller works out-of-box with SDL with no extra configuration and is correctly recognized as a gamepad; this is also going to be the case for any other driver which follows the Linux Gamepad Specification.
134 lines
2.9 KiB
C
134 lines
2.9 KiB
C
/*
|
|
Simple DirectMedia Layer
|
|
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
|
|
|
|
This software is provided 'as-is', without any express or implied
|
|
warranty. In no event will the authors be held liable for any damages
|
|
arising from the use of this software.
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
including commercial applications, and to alter it and redistribute it
|
|
freely, subject to the following restrictions:
|
|
|
|
1. The origin of this software must not be misrepresented; you must not
|
|
claim that you wrote the original software. If you use this software
|
|
in a product, an acknowledgment in the product documentation would be
|
|
appreciated but is not required.
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
misrepresented as being the original software.
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
*/
|
|
#include "../../SDL_internal.h"
|
|
|
|
#if defined(SDL_JOYSTICK_DUMMY) || defined(SDL_JOYSTICK_DISABLED)
|
|
|
|
/* This is the dummy implementation of the SDL joystick API */
|
|
|
|
#include "SDL_joystick.h"
|
|
#include "../SDL_sysjoystick.h"
|
|
#include "../SDL_joystick_c.h"
|
|
|
|
|
|
static int
|
|
DUMMY_JoystickInit(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
DUMMY_JoystickGetCount(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static void
|
|
DUMMY_JoystickDetect(void)
|
|
{
|
|
}
|
|
|
|
static const char *
|
|
DUMMY_JoystickGetDeviceName(int device_index)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static int
|
|
DUMMY_JoystickGetDevicePlayerIndex(int device_index)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
static void
|
|
DUMMY_JoystickSetDevicePlayerIndex(int device_index, int player_index)
|
|
{
|
|
}
|
|
|
|
static SDL_JoystickGUID
|
|
DUMMY_JoystickGetDeviceGUID(int device_index)
|
|
{
|
|
SDL_JoystickGUID guid;
|
|
SDL_zero(guid);
|
|
return guid;
|
|
}
|
|
|
|
static SDL_JoystickID
|
|
DUMMY_JoystickGetDeviceInstanceID(int device_index)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
static int
|
|
DUMMY_JoystickOpen(SDL_Joystick * joystick, int device_index)
|
|
{
|
|
return SDL_SetError("Logic error: No joysticks available");
|
|
}
|
|
|
|
static int
|
|
DUMMY_JoystickRumble(SDL_Joystick * joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble)
|
|
{
|
|
return SDL_Unsupported();
|
|
}
|
|
|
|
static void
|
|
DUMMY_JoystickUpdate(SDL_Joystick * joystick)
|
|
{
|
|
}
|
|
|
|
static void
|
|
DUMMY_JoystickClose(SDL_Joystick * joystick)
|
|
{
|
|
}
|
|
|
|
static void
|
|
DUMMY_JoystickQuit(void)
|
|
{
|
|
}
|
|
|
|
static SDL_bool
|
|
DUMMY_JoystickGetGamepadMapping(int device_index, SDL_GamepadMapping *out)
|
|
{
|
|
return SDL_FALSE;
|
|
}
|
|
|
|
SDL_JoystickDriver SDL_DUMMY_JoystickDriver =
|
|
{
|
|
DUMMY_JoystickInit,
|
|
DUMMY_JoystickGetCount,
|
|
DUMMY_JoystickDetect,
|
|
DUMMY_JoystickGetDeviceName,
|
|
DUMMY_JoystickGetDevicePlayerIndex,
|
|
DUMMY_JoystickSetDevicePlayerIndex,
|
|
DUMMY_JoystickGetDeviceGUID,
|
|
DUMMY_JoystickGetDeviceInstanceID,
|
|
DUMMY_JoystickOpen,
|
|
DUMMY_JoystickRumble,
|
|
DUMMY_JoystickUpdate,
|
|
DUMMY_JoystickClose,
|
|
DUMMY_JoystickQuit,
|
|
DUMMY_JoystickGetGamepadMapping
|
|
};
|
|
|
|
#endif /* SDL_JOYSTICK_DUMMY || SDL_JOYSTICK_DISABLED */
|
|
|
|
/* vi: set ts=4 sw=4 expandtab: */
|