diff --git a/changelog.txt b/changelog.txt index f8e5c2354..ac2589ec2 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +September 14 +-Joystick names are now saved during input configuration to es_input.cfg. +-When loading an input config, if JOYNAME is defined, load the first joystick with that name. If it is not present, load the first joystick (old behavior). +-Joysticks should re-initialize properly with SDL on the desktop configuration. + September 10 -Fixed multiple extensions breaking things. -Added Makefile.x86 for building on a desktop (acquire OpenGL context through SDL instead of EGL). diff --git a/src/InputManager.cpp b/src/InputManager.cpp index f0eddedb9..f9d18ebb7 100644 --- a/src/InputManager.cpp +++ b/src/InputManager.cpp @@ -190,6 +190,8 @@ void InputManager::loadConfig() std::ifstream file(path.c_str()); + std::string joystickName = ""; + while(file.good()) { std::string line; @@ -208,12 +210,17 @@ void InputManager::loadConfig() while(std::getline(stream, token[tokNum], ' ')) { - if(tokNum >= 3) - { - std::cerr << "Error - input config line \"" << line << "\" has more than three tokens!\n"; - return; - } tokNum++; + + //JOYNAME can have spaces + if(tokNum == 1 && token[0] == "JOYNAME") + { + std::getline(stream, token[1]); + break; + } + + if(tokNum >= 3) + break; } @@ -226,6 +233,9 @@ void InputManager::loadConfig() }else if(token[0] == "AXISNEG") { joystickAxisNegMap[atoi(token[1].c_str())] = (InputButton)atoi(token[2].c_str()); + }else if(token[0] == "JOYNAME") + { + joystickName = token[1]; }else{ std::cerr << "Invalid input type - " << token[0] << "\n"; return; @@ -233,9 +243,23 @@ void InputManager::loadConfig() } + //if any joystick is plugged in if(SDL_NumJoysticks() > 0) { - SDL_JoystickOpen(0); + if(!joystickName.empty()) + { + for(int i = 0; i < SDL_NumJoysticks(); i++) + { + if(strcmp(SDL_JoystickName(i), joystickName.c_str()) == 0) + { + std::cout << "opening joystick " << joystickName << "\n"; + SDL_JoystickOpen(i); + break; + } + } + }else{ + SDL_JoystickOpen(0); //if we don't have a specific joystick in mind, take the first + } } } diff --git a/src/Renderer_init_sdlgl.cpp b/src/Renderer_init_sdlgl.cpp index c00ab07e7..7dc3f3b36 100644 --- a/src/Renderer_init_sdlgl.cpp +++ b/src/Renderer_init_sdlgl.cpp @@ -4,6 +4,7 @@ #include GLHEADER #include "Font.h" #include +#include "InputManager.h" namespace Renderer { @@ -34,6 +35,9 @@ namespace Renderer return false; } + //we need to reload input too since SDL shut down + InputManager::loadConfig(); + //usually display width/height are not specified, i.e. zero, which SDL automatically takes as "native resolution" //so, since other things rely on the size of the screen (damn currently unnormalized coordinate system), we set it here //even though the system was already initialized diff --git a/src/components/GuiInputConfig.cpp b/src/components/GuiInputConfig.cpp index e4fe5f586..e10f48abf 100644 --- a/src/components/GuiInputConfig.cpp +++ b/src/components/GuiInputConfig.cpp @@ -23,7 +23,7 @@ GuiInputConfig::GuiInputConfig() mDone = true; return; }else{ - std::cout << "Opening joystick \"" << SDL_JoystickName(0) << "\"\n"; + std::cout << "Opening joystick \"" << SDL_JoystickName(0) << "\" for configuration...\n"; mJoystick = SDL_JoystickOpen(0); } } @@ -44,10 +44,11 @@ void GuiInputConfig::onRender() Renderer::drawCenteredText("POV hats (some D-Pads) are automatically mapped to directions.", 0, height, 0x000000); Renderer::drawCenteredText("You can press a keyboard key to skip any input.", 0, height * 2, 0x000000); Renderer::drawCenteredText("If you want to remap later, just delete ~/.es_input.cfg.", 0, height * 3, 0x000000); + Renderer::drawCenteredText("This interface only configures the first joystick plugged in.", 0, height * 4, 0x000000); Renderer::drawCenteredText("Remember - you'll need to set up your emulator separately!", 0, Renderer::getScreenHeight() - height, 0x000000); if(mDone) - Renderer::drawCenteredText("All done! Press a keyboard key to continue.", 0, height * 5, 0x00BB00); + Renderer::drawCenteredText("All done! Press a keyboard key to save.", 0, height * 5, 0x00BB00); else Renderer::drawCenteredText("Please press the axis/button for " + sInputs[mInputNum], 0, height * 5, 0x00C000); } @@ -116,6 +117,9 @@ void GuiInputConfig::writeConfig() std::ofstream file(path.c_str()); + if(SDL_JoystickName(0)) + file << "JOYNAME " << SDL_JoystickName(0) << "\n"; + typedef std::map::iterator it_type; for(it_type iter = mButtonMap.begin(); iter != mButtonMap.end(); iter++) {