commit 8c5c4f5a
Now possible to connect and disconnect game controllers while on the game controller page
Changed files
| M | source/code/HelpGamepadState.cpp before |
| M | source/code/gamecontroller.cpp before |
| M | source/code/gamecontroller.h before |
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 ; i<GetSupportedControllerNames().size(); ++i ) {
if (i != 0) {
@@ -61,6 +56,17 @@ HelpGamepadState::HelpGamepadState() {
}
s+= GetSupportedControllerNames().at(i);
}
+ return s;
+}
+
+
+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"));
+ 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<SDL_JoystickID, ControllerStatus> controllerStatusMap;
static std::map<std::string, int> gamecontrollers_assigned;
static std::vector<std::string> supportedControllers;
+static std::vector<SDL_GameController*> 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);