diff --git a/source/code/HelpGamepadState.cpp b/source/code/HelpGamepadState.cpp index 999f8dd..b4ebb37 100644 --- a/source/code/HelpGamepadState.cpp +++ b/source/code/HelpGamepadState.cpp @@ -48,12 +48,7 @@ static void setHelpGamepadFont(const sago::SagoDataHolder* holder, sago::SagoTex } -HelpGamepadState::HelpGamepadState() { - setHelpGamepadFont(&globalData.spriteHolder->GetDataHolder(), moveLabel, _("Move cursor")); - setHelpGamepadFont(&globalData.spriteHolder->GetDataHolder(), pushLabel, _("Push line")); - setHelpGamepadFont(&globalData.spriteHolder->GetDataHolder(), backLabel, _("Back (Menu)")); - setHelpGamepadFont(&globalData.spriteHolder->GetDataHolder(), switchLabel, _("Switch")); - setHelpGamepadFont(&globalData.spriteHolder->GetDataHolder(), confirmLabel, _("Confirm")); +static std::string getLabelForSupportedControllerNames() { std::string s = _("Only SDL2 compatible controllers are supported!\nSupported controllers: "); for (size_t i = 0 ; iGetDataHolder(), moveLabel, _("Move cursor")); + setHelpGamepadFont(&globalData.spriteHolder->GetDataHolder(), pushLabel, _("Push line")); + setHelpGamepadFont(&globalData.spriteHolder->GetDataHolder(), backLabel, _("Back (Menu)")); + setHelpGamepadFont(&globalData.spriteHolder->GetDataHolder(), switchLabel, _("Switch")); + setHelpGamepadFont(&globalData.spriteHolder->GetDataHolder(), confirmLabel, _("Confirm")); + std::string s = getLabelForSupportedControllerNames(); setHelpGamepadFont(&globalData.spriteHolder->GetDataHolder(), supportedControllers, s.c_str()); supportedControllers.SetMaxWidth(740); } @@ -75,6 +81,22 @@ bool HelpGamepadState::IsActive() { void HelpGamepadState::ProcessInput(const SDL_Event& event, bool& processed) { UpdateMouseCoordinates(event, globalData.mousex, globalData.mousey); + switch (event.type) { + case SDL_CONTROLLERDEVICEADDED: + case SDL_CONTROLLERDEVICEREMOVED: + case SDL_CONTROLLERDEVICEREMAPPED: + UnInitGameControllers(); + InitGameControllers(); + { + std::string s = getLabelForSupportedControllerNames(); + setHelpGamepadFont(&globalData.spriteHolder->GetDataHolder(), supportedControllers, s.c_str()); + } + break; + default: + //none + break; + }; + if (isConfirmEvent(event) || isEscapeEvent(event)) { isActive = false; processed = true; diff --git a/source/code/gamecontroller.cpp b/source/code/gamecontroller.cpp index bb1686c..368a34e 100644 --- a/source/code/gamecontroller.cpp +++ b/source/code/gamecontroller.cpp @@ -39,6 +39,7 @@ struct ControllerStatus { static std::map controllerStatusMap; static std::map gamecontrollers_assigned; static std::vector supportedControllers; +static std::vector controllersOpened; void GameControllerSetVerbose(bool value) { @@ -82,6 +83,19 @@ static int GetNextPlayerByGui(const SDL_JoystickGUID& guid) { return 1; } +void UnInitGameControllers() { + if (controllersOpened.empty()) { + return; + } + for (SDL_GameController* t : controllersOpened) { + SDL_GameControllerClose(t); + } + controllersOpened.clear(); + controllerStatusMap.clear(); + gamecontrollers_assigned.clear(); + supportedControllers.clear(); +} + void InitGameControllers() { std::string configFile = sago::getConfigHome()+"/blockattack/gamecontrollerdb.txt"; int errorCode = SDL_GameControllerAddMappingsFromFile(configFile.c_str()); @@ -101,6 +115,7 @@ void InitGameControllers() { int assingToPlayer = GetNextPlayerByGui(guid); controllerStatusMap[instanceId].player = assingToPlayer; supportedControllers.push_back(GameControllerGetName(controller)); + controllersOpened.push_back(controller); if (verbose) { std::cout << "Supported game controller detected: " << GameControllerGetName(controller) << ", mapping: " << SDL_GameControllerMapping(controller) << "\n"; std::cout << "Assigned to player: " << controllerStatusMap[instanceId].player << "\n"; diff --git a/source/code/gamecontroller.h b/source/code/gamecontroller.h index 70c5e56..51f884a 100644 --- a/source/code/gamecontroller.h +++ b/source/code/gamecontroller.h @@ -31,6 +31,7 @@ http://www.blockattack.net const int deadZoneLimit = 20000; void InitGameControllers(); +void UnInitGameControllers(); bool isPlayerDownEvent(int playerNumber, const SDL_Event& event); bool isPlayerUpEvent(int playerNumber, const SDL_Event& event);