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.
--- a/include/SDL_gamecontroller.h Mon Dec 02 23:54:35 2013 -0800
+++ b/include/SDL_gamecontroller.h Tue Dec 03 12:01:28 2013 -0300
@@ -109,12 +109,21 @@
*/
/**
- * 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
--- a/src/joystick/SDL_gamecontroller.c Mon Dec 02 23:54:35 2013 -0800
+++ b/src/joystick/SDL_gamecontroller.c Tue Dec 03 12:01:28 2013 -0300
@@ -658,32 +658,37 @@
* 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;
--- a/test/controllermap.c Mon Dec 02 23:54:35 2013 -0800
+++ b/test/controllermap.c Tue Dec 03 12:01:28 2013 -0300
@@ -144,7 +144,7 @@
};
/* 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 @@
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 @@
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 @@
}
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;