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:
Gabriel Jacobo 2013-12-03 12:01:28 -03:00
parent 013d99823d
commit 5ac1813451
3 changed files with 38 additions and 12 deletions

View File

@ -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

View File

@ -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) {
if (freerw) {
SDL_RWclose(rw); 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) {
if (freerw) {
SDL_RWclose(rw); SDL_RWclose(rw);
}
SDL_free(buf); SDL_free(buf);
return SDL_SetError("Could not read DB"); return SDL_SetError("Could not read DB");
} }
if (freerw) {
SDL_RWclose(rw); SDL_RWclose(rw);
}
buf[db_size] = '\0'; buf[db_size] = '\0';
line = buf; line = buf;

View File

@ -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;