From aee48faca8e0e9fafecaff0c06a9bfc613b15ab8 Mon Sep 17 00:00:00 2001 From: rforder Date: Sun, 9 Aug 2009 18:12:35 +0000 Subject: [PATCH] Updated input configuration GUI to work correctly with recent changes to the input system. git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/irrlicht@3826 178a84e3-b1eb-0310-8ba1-8eac791a3b58 --- src/config/device_config.cpp | 4 ++ src/config/device_config.hpp | 10 ++++- src/input/device_manager.cpp | 4 ++ src/input/device_manager.hpp | 2 + src/states_screens/options_screen.cpp | 55 +++++++++++++-------------- 5 files changed, 45 insertions(+), 30 deletions(-) diff --git a/src/config/device_config.cpp b/src/config/device_config.cpp index e2cd349ba..4f8a2b0e2 100644 --- a/src/config/device_config.cpp +++ b/src/config/device_config.cpp @@ -201,6 +201,8 @@ void KeyboardConfig::setDefaultBinds() KeyboardConfig::KeyboardConfig() { + m_name = "Keyboard"; + setInUse(true); setDefaultBinds(); } @@ -238,6 +240,7 @@ GamepadConfig::GamepadConfig ( const std::string name, m_name = name; m_axis_count = axis_count; m_button_count = btnCount; + setInUse(false); setDefaultBinds(); } @@ -254,6 +257,7 @@ GamepadConfig::GamepadConfig(irr::io::IrrXMLReader* xml) { m_name = name_string; } + setInUse(false); setDefaultBinds(); } diff --git a/src/config/device_config.hpp b/src/config/device_config.hpp index cc8d2e0e9..a683d9655 100644 --- a/src/config/device_config.hpp +++ b/src/config/device_config.hpp @@ -25,11 +25,16 @@ class DeviceConfig private: KeyBinding m_bindings[PA_COUNT]; + bool m_inuse; // Is there a device connected to the system + // which uses this config? protected: + std::string m_name; + public: + std::string getName() const { return m_name; }; std::string getBindingAsString (const PlayerAction action) const; std::string toString (); @@ -41,6 +46,9 @@ class DeviceConfig const int id, Input::AxisDirection direction = Input::AD_NEUTRAL); + void setInUse (bool inuse) {m_inuse = inuse;} + bool isInUse () {return m_inuse;} + // Don't call this directly unless you are KeyboardDevice or GamepadDevice bool getAction (Input::InputType type, const int id, @@ -75,14 +83,12 @@ class GamepadConfig : public DeviceConfig private: - std::string m_name; int m_axis_count; int m_button_count; public: std::string toString (); - std::string getName() const { return m_name; }; int getAxisCount() const { return m_axis_count; }; int getButtonCount() const { return m_button_count; }; void serialize (std::ofstream& stream); diff --git a/src/input/device_manager.cpp b/src/input/device_manager.cpp index 9810bbe72..90ff3ee76 100644 --- a/src/input/device_manager.cpp +++ b/src/input/device_manager.cpp @@ -43,11 +43,14 @@ bool DeviceManager::initialize() created = true; } m_keyboard = new KeyboardDevice(m_keyboard_configs.get(0)); + // TODO: Detect keyboard presence, if there is no keyboard, this should be false + m_keyboard_configs.get(0)->setInUse(true); printf("Initializing gamepad support.\n"); irr_driver->getDevice()->activateJoysticks(m_irrlicht_gamepads); numGamepads = m_irrlicht_gamepads.size(); + printf("Irrlicht reports %d gamepads are attached to the system.\n", numGamepads); // Create GamePadDevice for each physical gamepad and find a GamepadConfig to match for (int id = 0; id < numGamepads; id++) @@ -64,6 +67,7 @@ bool DeviceManager::initialize() printf("using existing configuration.\n"); } + gamepadConfig->setInUse(true); gamepadDevice = new GamePadDevice( id, m_irrlicht_gamepads[id].Name.c_str(), m_irrlicht_gamepads[id].Axes, diff --git a/src/input/device_manager.hpp b/src/input/device_manager.hpp index b2259fd34..6e7440116 100644 --- a/src/input/device_manager.hpp +++ b/src/input/device_manager.hpp @@ -61,7 +61,9 @@ public: void addGamepad(GamePadDevice* d); int getGamePadAmount() const { return m_gamepads.size(); } + int getGamePadConfigAmount() const { return m_gamepad_configs.size(); } GamePadDevice* getGamePad(const int i) { return m_gamepads.get(i); } + GamepadConfig* getGamepadConfig(const int i) { return m_gamepad_configs.get(i); } PlayerAssignMode playerAssignMode() const { return m_assign_mode; } KeyboardDevice* getKeyboard(const int i) { return m_keyboard; } GamePadDevice* getGamePadFromIrrID(const int i); diff --git a/src/states_screens/options_screen.cpp b/src/states_screens/options_screen.cpp index 5cacbc242..1654ad065 100644 --- a/src/states_screens/options_screen.cpp +++ b/src/states_screens/options_screen.cpp @@ -223,18 +223,8 @@ namespace OptionsScreen } // ----------------------------------------------------------------------------- - void updateInputButtons(InputDevice* device) + void updateInputButtons(DeviceConfig* config) { - DeviceConfig *config; - - // Should never happen - if (device == NULL) - { - printf("updateInputButtons: passed NULL pointer\n"); - abort(); - } - - config = device->getConfiguration(); // Should never happen if (config == NULL) @@ -265,19 +255,19 @@ namespace OptionsScreen } { ButtonWidget* btn = getCurrentScreen()->getWidget("binding_nitro"); - btn->setLabel( device->getConfiguration()->getBindingAsString(PA_NITRO).c_str() ); + btn->setLabel( config->getBindingAsString(PA_NITRO).c_str() ); } { ButtonWidget* btn = getCurrentScreen()->getWidget("binding_drift"); - btn->setLabel( device->getConfiguration()->getBindingAsString(PA_DRIFT).c_str() ); + btn->setLabel( config->getBindingAsString(PA_DRIFT).c_str() ); } { ButtonWidget* btn = getCurrentScreen()->getWidget("binding_rescue"); - btn->setLabel( device->getConfiguration()->getBindingAsString(PA_RESCUE).c_str() ); + btn->setLabel( config->getBindingAsString(PA_RESCUE).c_str() ); } { ButtonWidget* btn = getCurrentScreen()->getWidget("binding_look_back"); - btn->setLabel( device->getConfiguration()->getBindingAsString(PA_LOOK_BACK).c_str() ); + btn->setLabel( config->getBindingAsString(PA_LOOK_BACK).c_str() ); } } @@ -292,14 +282,19 @@ namespace OptionsScreen { devices->addItem("Keyboard","keyboard", file_manager->getDataDir() + "/gui/keyboard.png"); - const int gamepad_count = input_manager->getDeviceList()->getGamePadAmount(); + const int gpad_config_count = input_manager->getDeviceList()->getGamePadConfigAmount(); - for(int i=0; igetDeviceList()->getGamePad(i)->m_name; - char internal_name[32]; - sprintf(internal_name, "gamepad%i", i); - devices->addItem(name,internal_name, file_manager->getDataDir() + "/gui/gamepad.png"); + GamepadConfig *config = input_manager->getDeviceList()->getGamepadConfig(i); + // Don't display the configuration if a matching device is not available + if (config->isInUse()) + { + std::string name = config->getName(); + char internal_name[32]; + sprintf(internal_name, "gamepad%i", i); + devices->addItem(name,internal_name, file_manager->getDataDir() + "/gui/gamepad.png"); + } } getCurrentScreen()->m_inited = true; @@ -369,7 +364,7 @@ namespace OptionsScreen read = sscanf( selection.c_str(), "gamepad%i", &i ); if(read == 1 && i != -1) { - updateInputButtons( input_manager->getDeviceList()->getGamePad(i) ); + updateInputButtons( input_manager->getDeviceList()->getGamepadConfig(i) ); } else { @@ -378,7 +373,7 @@ namespace OptionsScreen } else if(selection == "keyboard") { - updateInputButtons( input_manager->getDeviceList()->getKeyboard(0) ); + updateInputButtons( input_manager->getDeviceList()->getKeyboard(0)->getConfiguration() ); } else { @@ -480,7 +475,7 @@ namespace OptionsScreen std::cout << "% Binding " << KartActionStrings[binding_to_set] << " : setting to keyboard key " << sensedInput->btnID << " \n\n"; KeyboardDevice* keyboard = input_manager->getDeviceList()->getKeyboard(0); - //keyboard->getConfiguration()->setBinding(binding_to_set, Input::IT_KEYBOARD, sensedInput->btnID, Input::AD_NEUTRAL); + keyboard->getConfiguration()->setBinding(binding_to_set, Input::IT_KEYBOARD, sensedInput->btnID, Input::AD_NEUTRAL); // refresh display initInput(NULL, "init"); @@ -500,8 +495,10 @@ namespace OptionsScreen else std::cout << "Sensed unknown gamepad event type??\n"; - int gamepadID = -1; + int configID = -1; + sscanf( devices->getSelectionIDString().c_str(), "gamepad%i", &configID ); + /* if(sscanf( devices->getSelectionIDString().c_str(), "gamepad%i", &gamepadID ) != 1 || gamepadID >= input_manager->getDeviceList()->getGamePadAmount()) { @@ -511,7 +508,7 @@ namespace OptionsScreen gamepadID = sensedInput->deviceID; } - if(input_manager->getDeviceList()->getGamePad(gamepadID)->m_index != sensedInput->deviceID) + if(input_manager->getDeviceList()->getGamepadConfig(gamepadID)->m_index != sensedInput->deviceID) { // should not happen, but let's try to be bulletproof... std::cerr << "The key that was pressed is not on the gamepad we're trying to configure! ID in list=" << gamepadID << @@ -520,8 +517,10 @@ namespace OptionsScreen } } - GamePadDevice* gamepad = input_manager->getDeviceList()->getGamePad(gamepadID); - gamepad->getConfiguration()->setBinding(binding_to_set, sensedInput->type, sensedInput->btnID, + */ + + GamepadConfig* config = input_manager->getDeviceList()->getGamepadConfig(configID); + config->setBinding(binding_to_set, sensedInput->type, sensedInput->btnID, (Input::AxisDirection)sensedInput->axisDirection); // refresh display