Fixed love.joystick.setGamepadMapping: the generated SDL controller mapping string is no longer invalid, and joystick hats are now properly converted to the SDL representation.

This commit is contained in:
Alex Szpakowski
2014-08-27 00:58:42 -03:00
parent 1449a81bdf
commit 1e8c9e18c3
+12 -8
View File
@@ -218,8 +218,8 @@ bool JoystickModule::setGamepadMapping(const std::string &guid, Joystick::Gamepa
joyinputstream << "b" << joyinput.button; joyinputstream << "b" << joyinput.button;
break; break;
case Joystick::INPUT_TYPE_HAT: case Joystick::INPUT_TYPE_HAT:
if (joyinput.hat.value >= 0 && Joystick::getConstant(joyinput.hat.value, sdlhat)) if (joyinput.hat.index >= 0 && Joystick::getConstant(joyinput.hat.value, sdlhat))
joyinputstream << "h" << joyinput.hat.value << "." << int(sdlhat); joyinputstream << "h" << joyinput.hat.index << "." << int(sdlhat);
break; break;
default: default:
break; break;
@@ -297,7 +297,7 @@ Joystick::JoystickInput JoystickModule::getGamepadMapping(const std::string &gui
if (findpos == std::string::npos) if (findpos == std::string::npos)
return jinput; return jinput;
size_t endpos = mapstr.find_first_of(',', findpos); size_t endpos = mapstr.find_first_of(',', findpos + 1);
if (endpos == std::string::npos) if (endpos == std::string::npos)
{ {
// Assume end-of-string if we can't find the next comma. // Assume end-of-string if we can't find the next comma.
@@ -364,19 +364,19 @@ Joystick::JoystickInput JoystickModule::JoystickInputFromString(const std::strin
{ {
case 'a': case 'a':
jinput.type = Joystick::INPUT_TYPE_AXIS; jinput.type = Joystick::INPUT_TYPE_AXIS;
jinput.axis = atoi(bindvalues.c_str()); jinput.axis = (int) strtol(bindvalues.c_str(), nullptr, 10);
break; break;
case 'b': case 'b':
jinput.type = Joystick::INPUT_TYPE_BUTTON; jinput.type = Joystick::INPUT_TYPE_BUTTON;
jinput.button = atoi(bindvalues.c_str()); jinput.button = (int) strtol(bindvalues.c_str(), nullptr, 10);
break; break;
case 'h': case 'h':
// Hat string syntax is "index.value". // Hat string syntax is "index.value".
if (bindvalues.length() < 3) if (bindvalues.length() < 3)
break; break;
jinput.type = Joystick::INPUT_TYPE_HAT; jinput.type = Joystick::INPUT_TYPE_HAT;
jinput.hat.index = atoi(bindvalues.substr(0, 1).c_str()); jinput.hat.index = (int) strtol(bindvalues.substr(0, 1).c_str(), nullptr, 10);
sdlhat = (Uint8) atoi(bindvalues.substr(2, 1).c_str()); sdlhat = (Uint8) strtol(bindvalues.substr(2).c_str(), nullptr, 10);
if (!Joystick::getConstant(sdlhat, jinput.hat.value)) if (!Joystick::getConstant(sdlhat, jinput.hat.value))
{ {
// Return an invalid value if we can't find the hat constant. // Return an invalid value if we can't find the hat constant.
@@ -405,10 +405,14 @@ void JoystickModule::removeBindFromMapString(std::string &mapstr, const std::str
if (joybindpos == std::string::npos) if (joybindpos == std::string::npos)
return; return;
// Find the start of the entire bind. // Find the start of the entire bind by looking for the separator between
// the end of one section of the map string and the start of this section.
size_t bindstart = mapstr.rfind(',', joybindpos); size_t bindstart = mapstr.rfind(',', joybindpos);
if (bindstart != std::string::npos && bindstart < mapstr.length() - 1) if (bindstart != std::string::npos && bindstart < mapstr.length() - 1)
{ {
// The start of the bind is directly after the separator.
bindstart++;
size_t bindend = mapstr.find(',', bindstart + 1); size_t bindend = mapstr.find(',', bindstart + 1);
if (bindend == std::string::npos) if (bindend == std::string::npos)
bindend = mapstr.length() - 1; bindend = mapstr.length() - 1;