From 5ac1813451e91ffaf0aee95244a738d5ff704a26 Mon Sep 17 00:00:00 2001 From: Gabriel Jacobo Date: Tue, 3 Dec 2013 12:01:28 -0300 Subject: [PATCH] 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. --- include/SDL_gamecontroller.h | 13 +++++++++++-- src/joystick/SDL_gamecontroller.c | 19 ++++++++++++------- test/controllermap.c | 18 +++++++++++++++--- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/include/SDL_gamecontroller.h b/include/SDL_gamecontroller.h index 84d58d89e3739..3d49125f23a93 100644 --- a/include/SDL_gamecontroller.h +++ b/include/SDL_gamecontroller.h @@ -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 * + * If \c freerw is non-zero, the stream will be closed after being read. + * * \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 diff --git a/src/joystick/SDL_gamecontroller.c b/src/joystick/SDL_gamecontroller.c index 1563f5141637e..59c56fc469f5c 100644 --- a/src/joystick/SDL_gamecontroller.c +++ b/src/joystick/SDL_gamecontroller.c @@ -658,32 +658,37 @@ void SDL_PrivateGameControllerRefreshMapping( ControllerMapping_t *pControllerMa * Add or update an entry into the Mappings Database */ int -SDL_GameControllerAddMappingsFromFile( const char* mapDB ) +SDL_GameControllerAddMappingsFromRW( SDL_RWops * rw, int freerw ) { const char *platform = SDL_GetPlatform(); - SDL_RWops *rw; int controllers = 0; char *buf, *line, *line_end, *tmp, *comma, line_platform[64]; size_t db_size, platform_len; - rw = SDL_RWFromFile(mapDB, "rb"); if (rw == NULL) { - return SDL_SetError("Could not open %s", mapDB); + return SDL_SetError("Invalid RWops"); } db_size = SDL_RWsize(rw); buf = (char *) SDL_malloc(db_size + 1); if (buf == NULL) { - SDL_RWclose(rw); + if (freerw) { + SDL_RWclose(rw); + } return SDL_SetError("Could allocate space to not read DB into memory"); } if (SDL_RWread(rw, buf, db_size, 1) != 1) { - SDL_RWclose(rw); + if (freerw) { + SDL_RWclose(rw); + } SDL_free(buf); return SDL_SetError("Could not read DB"); } - SDL_RWclose(rw); + + if (freerw) { + SDL_RWclose(rw); + } buf[db_size] = '\0'; line = buf; diff --git a/test/controllermap.c b/test/controllermap.c index 2c943cf9e3aa5..dc943cb80ece0 100644 --- a/test/controllermap.c +++ b/test/controllermap.c @@ -144,7 +144,7 @@ WatchJoystick(SDL_Joystick * joystick) }; /* 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, SCREEN_HEIGHT, 0); if (window == NULL) { @@ -178,6 +178,7 @@ WatchJoystick(SDL_Joystick * joystick) Press the buttons on your controller when indicated\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\ + To skip a button, press SPACE or click/touch the screen\n\ To exit, press ESC\n\ ====================================================================================\n"); @@ -287,6 +288,12 @@ WatchJoystick(SDL_Joystick * joystick) next=SDL_TRUE; } break; + case SDL_FINGERDOWN: + case SDL_MOUSEBUTTONDOWN: + /* Skip this step */ + s++; + next=SDL_TRUE; + break; case SDL_KEYDOWN: if (event.key.keysym.sym == SDLK_BACKSPACE || event.key.keysym.sym == SDLK_AC_BACK) { /* Undo! */ @@ -297,12 +304,17 @@ WatchJoystick(SDL_Joystick * joystick) } break; } + if (event.key.keysym.sym == SDLK_SPACE) { + /* Skip this step */ + s++; + next=SDL_TRUE; + break; + } + if ((event.key.keysym.sym != SDLK_ESCAPE)) { break; } /* Fall through to signal quit */ - case SDL_FINGERDOWN: - case SDL_MOUSEBUTTONDOWN: case SDL_QUIT: done = SDL_TRUE; break;