mirror of https://github.com/encounter/SDL.git
Adds SDL_GameControllerAddMappingsFromRW, updates controllermap
SDL_GameControllerAddMappingsFromFile is now a convenience macro. controllermap can now skip bindings by pressing space or clicking/touching the screen.
This commit is contained in:
parent
013d99823d
commit
5ac1813451
|
@ -109,12 +109,21 @@ typedef struct SDL_GameControllerButtonBind
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load a set of mappings from a file, filtered by the current SDL_GetPlatform()
|
* 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
|
* A community sourced database of controllers is available at https://raw.github.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt
|
||||||
*
|
*
|
||||||
|
* If \c freerw is non-zero, the stream will be closed after being read.
|
||||||
|
*
|
||||||
* \return number of mappings added, -1 on error
|
* \return number of mappings added, -1 on error
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC int SDLCALL SDL_GameControllerAddMappingsFromFile( const char* mapDB );
|
extern DECLSPEC int SDLCALL SDL_GameControllerAddMappingsFromRW( SDL_RWops * rw, int freerw );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a set of mappings from a file, filtered by the current SDL_GetPlatform()
|
||||||
|
*
|
||||||
|
* Convenience macro.
|
||||||
|
*/
|
||||||
|
#define SDL_GameControllerAddMappingsFromFile(file) SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(file, "rb"), 1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add or update an existing mapping configuration
|
* Add or update an existing mapping configuration
|
||||||
|
|
|
@ -658,32 +658,37 @@ void SDL_PrivateGameControllerRefreshMapping( ControllerMapping_t *pControllerMa
|
||||||
* Add or update an entry into the Mappings Database
|
* Add or update an entry into the Mappings Database
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
SDL_GameControllerAddMappingsFromFile( const char* mapDB )
|
SDL_GameControllerAddMappingsFromRW( SDL_RWops * rw, int freerw )
|
||||||
{
|
{
|
||||||
const char *platform = SDL_GetPlatform();
|
const char *platform = SDL_GetPlatform();
|
||||||
SDL_RWops *rw;
|
|
||||||
int controllers = 0;
|
int controllers = 0;
|
||||||
char *buf, *line, *line_end, *tmp, *comma, line_platform[64];
|
char *buf, *line, *line_end, *tmp, *comma, line_platform[64];
|
||||||
size_t db_size, platform_len;
|
size_t db_size, platform_len;
|
||||||
|
|
||||||
rw = SDL_RWFromFile(mapDB, "rb");
|
|
||||||
if (rw == NULL) {
|
if (rw == NULL) {
|
||||||
return SDL_SetError("Could not open %s", mapDB);
|
return SDL_SetError("Invalid RWops");
|
||||||
}
|
}
|
||||||
db_size = SDL_RWsize(rw);
|
db_size = SDL_RWsize(rw);
|
||||||
|
|
||||||
buf = (char *) SDL_malloc(db_size + 1);
|
buf = (char *) SDL_malloc(db_size + 1);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
SDL_RWclose(rw);
|
if (freerw) {
|
||||||
|
SDL_RWclose(rw);
|
||||||
|
}
|
||||||
return SDL_SetError("Could allocate space to not read DB into memory");
|
return SDL_SetError("Could allocate space to not read DB into memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SDL_RWread(rw, buf, db_size, 1) != 1) {
|
if (SDL_RWread(rw, buf, db_size, 1) != 1) {
|
||||||
SDL_RWclose(rw);
|
if (freerw) {
|
||||||
|
SDL_RWclose(rw);
|
||||||
|
}
|
||||||
SDL_free(buf);
|
SDL_free(buf);
|
||||||
return SDL_SetError("Could not read DB");
|
return SDL_SetError("Could not read DB");
|
||||||
}
|
}
|
||||||
SDL_RWclose(rw);
|
|
||||||
|
if (freerw) {
|
||||||
|
SDL_RWclose(rw);
|
||||||
|
}
|
||||||
|
|
||||||
buf[db_size] = '\0';
|
buf[db_size] = '\0';
|
||||||
line = buf;
|
line = buf;
|
||||||
|
|
|
@ -144,7 +144,7 @@ WatchJoystick(SDL_Joystick * joystick)
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Create a window to display joystick axis position */
|
/* Create a window to display joystick axis position */
|
||||||
window = SDL_CreateWindow("Joystick Test", SDL_WINDOWPOS_CENTERED,
|
window = SDL_CreateWindow("Game Controller Map", SDL_WINDOWPOS_CENTERED,
|
||||||
SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH,
|
SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH,
|
||||||
SCREEN_HEIGHT, 0);
|
SCREEN_HEIGHT, 0);
|
||||||
if (window == NULL) {
|
if (window == NULL) {
|
||||||
|
@ -178,6 +178,7 @@ WatchJoystick(SDL_Joystick * joystick)
|
||||||
Press the buttons on your controller when indicated\n\
|
Press the buttons on your controller when indicated\n\
|
||||||
(Your controller may look different than the picture)\n\
|
(Your controller may look different than the picture)\n\
|
||||||
If you want to correct a mistake, press backspace or the back button on your device\n\
|
If you want to correct a mistake, press backspace or the back button on your device\n\
|
||||||
|
To skip a button, press SPACE or click/touch the screen\n\
|
||||||
To exit, press ESC\n\
|
To exit, press ESC\n\
|
||||||
====================================================================================\n");
|
====================================================================================\n");
|
||||||
|
|
||||||
|
@ -287,6 +288,12 @@ WatchJoystick(SDL_Joystick * joystick)
|
||||||
next=SDL_TRUE;
|
next=SDL_TRUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SDL_FINGERDOWN:
|
||||||
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
|
/* Skip this step */
|
||||||
|
s++;
|
||||||
|
next=SDL_TRUE;
|
||||||
|
break;
|
||||||
case SDL_KEYDOWN:
|
case SDL_KEYDOWN:
|
||||||
if (event.key.keysym.sym == SDLK_BACKSPACE || event.key.keysym.sym == SDLK_AC_BACK) {
|
if (event.key.keysym.sym == SDLK_BACKSPACE || event.key.keysym.sym == SDLK_AC_BACK) {
|
||||||
/* Undo! */
|
/* Undo! */
|
||||||
|
@ -297,12 +304,17 @@ WatchJoystick(SDL_Joystick * joystick)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (event.key.keysym.sym == SDLK_SPACE) {
|
||||||
|
/* Skip this step */
|
||||||
|
s++;
|
||||||
|
next=SDL_TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if ((event.key.keysym.sym != SDLK_ESCAPE)) {
|
if ((event.key.keysym.sym != SDLK_ESCAPE)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Fall through to signal quit */
|
/* Fall through to signal quit */
|
||||||
case SDL_FINGERDOWN:
|
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
|
||||||
case SDL_QUIT:
|
case SDL_QUIT:
|
||||||
done = SDL_TRUE;
|
done = SDL_TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue