diff options
author | Martin Ellis <malard@gmail.com> | 2011-06-12 14:24:17 +0100 |
---|---|---|
committer | Martin Ellis <malard@gmail.com> | 2011-06-12 15:43:09 +0100 |
commit | 742f64bdec217a662ff0d8b7e519aa8e4bba2681 (patch) | |
tree | 421b90dadfe8ba806dec17ce0093522f22101cbf | |
parent | 755c63248575433ee89c0f3986767fe3f3336c2a (diff) |
changed: multiple mappings support in keymap files specifically orientated towards keyboards
-rw-r--r-- | xbmc/input/ButtonTranslator.cpp | 51 | ||||
-rw-r--r-- | xbmc/input/ButtonTranslator.h | 3 | ||||
-rw-r--r-- | xbmc/settings/Settings.cpp | 2 | ||||
-rw-r--r-- | xbmc/settings/Settings.h | 2 |
4 files changed, 42 insertions, 16 deletions
diff --git a/xbmc/input/ButtonTranslator.cpp b/xbmc/input/ButtonTranslator.cpp index 90a0b4a6f0..f85da89a75 100644 --- a/xbmc/input/ButtonTranslator.cpp +++ b/xbmc/input/ButtonTranslator.cpp @@ -360,7 +360,7 @@ CButtonTranslator::~CButtonTranslator() bool CButtonTranslator::Load() { - translatorMap.clear(); + deviceMappings.clear(); //directories to search for keymaps //they're applied in this order, @@ -785,8 +785,14 @@ CAction CButtonTranslator::GetAction(int window, const CKey &key, bool fallback) int CButtonTranslator::GetActionCode(int window, const CKey &key, CStdString &strAction) { uint32_t code = key.GetButtonCode(); - map<int, buttonMap>::iterator it = translatorMap.find(window); - if (it == translatorMap.end()) + + map<CStdString, std::map<int, buttonMap>>::iterator activeMapIt = deviceMappings.find(g_settings.m_activeKeyboardMapping); + if (activeMapIt == deviceMappings.end()) + return 0; + + std::map<int, buttonMap> deviceMap = (*activeMapIt).second; + map<int, buttonMap>::iterator it = deviceMap.find(window); + if (it == deviceMap.end()) return 0; buttonMap::iterator it2 = (*it).second.find(code); int action = 0; @@ -844,13 +850,7 @@ void CButtonTranslator::MapWindowActions(TiXmlNode *pWindow, int windowID) { if (!pWindow || windowID == WINDOW_INVALID) return; - buttonMap map; - std::map<int, buttonMap>::iterator it = translatorMap.find(windowID); - if (it != translatorMap.end()) - { - map = it->second; - translatorMap.erase(it); - } + TiXmlNode* pDevice; const char* types[] = {"gamepad", "remote", "universalremote", "keyboard", "mouse", "appcommand", NULL}; @@ -860,7 +860,30 @@ void CButtonTranslator::MapWindowActions(TiXmlNode *pWindow, int windowID) if (HasDeviceType(pWindow, type)) { pDevice = pWindow->FirstChild(type); + TiXmlElement *pDeviceElement = pDevice->ToElement(); + CStdString deviceName; + //check if exists, if not use "default" + deviceName = pDeviceElement->Attribute("name"); + if (deviceName.empty()) + deviceName = "default"; + + std::map<CStdString, std::map<int, buttonMap>>::iterator deviceMapIt = deviceMappings.find(deviceName); + if (deviceMapIt == deviceMappings.end()) + { + //First time encountering this device, lets initialise the buttonMap for it. + deviceMapIt = deviceMappings.insert(pair<CStdString, std::map<int, buttonMap>>(deviceName, std::map<int, buttonMap>())).first; + } + + std::map<int, buttonMap>::iterator windowIt = deviceMapIt->second.find(windowID); + if (windowIt == deviceMapIt->second.end()) + { + //add it now + windowIt = deviceMapIt->second.insert(pair<int, buttonMap>(windowID, buttonMap())).first; + } + buttonMap& windowMap = windowIt->second; + TiXmlElement *pButton = pDevice->FirstChildElement(); + while (pButton) { uint32_t buttonCode=0; @@ -878,11 +901,12 @@ void CButtonTranslator::MapWindowActions(TiXmlNode *pWindow, int windowID) buttonCode = TranslateAppCommand(pButton->Value()); if (buttonCode && pButton->FirstChild()) - MapAction(buttonCode, pButton->FirstChild()->Value(), map); + MapAction(buttonCode, pButton->FirstChild()->Value(), windowMap); pButton = pButton->NextSiblingElement(); } } } + #if defined(HAS_SDL_JOYSTICK) || defined(HAS_EVENT_SERVER) if ((pDevice = pWindow->FirstChild("joystick")) != NULL) { @@ -894,9 +918,6 @@ void CButtonTranslator::MapWindowActions(TiXmlNode *pWindow, int windowID) } } #endif - // add our map to our table - if (map.size() > 0) - translatorMap.insert(pair<int, buttonMap>( windowID, map)); } bool CButtonTranslator::TranslateActionString(const char *szAction, int &action) @@ -1191,7 +1212,7 @@ uint32_t CButtonTranslator::TranslateMouseCommand(const char *szButton) void CButtonTranslator::Clear() { - translatorMap.clear(); + deviceMappings.clear(); #if defined(HAS_LIRC) || defined(HAS_IRSERVERSUITE) lircRemotesMap.clear(); #endif diff --git a/xbmc/input/ButtonTranslator.h b/xbmc/input/ButtonTranslator.h index a1f0e9c608..869810900d 100644 --- a/xbmc/input/ButtonTranslator.h +++ b/xbmc/input/ButtonTranslator.h @@ -96,7 +96,8 @@ public: private: typedef std::multimap<uint32_t, CButtonAction> buttonMap; // our button map to fill in - std::map<int, buttonMap> translatorMap; // mapping of windows to button maps + + std::map<CStdString, std::map<int, buttonMap>> deviceMappings; int GetActionCode(int window, const CKey &key, CStdString &strAction); static uint32_t TranslateGamepadString(const char *szButton); diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp index 793d3e6848..d6e4d4e505 100644 --- a/xbmc/settings/Settings.cpp +++ b/xbmc/settings/Settings.cpp @@ -137,6 +137,8 @@ void CSettings::Initialize() m_usingLoginScreen = false; m_lastUsedProfile = 0; m_currentProfile = 0; + + m_activeKeyboardMapping = "default"; } CSettings::~CSettings(void) diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h index 5b2b151453..9a886ed124 100644 --- a/xbmc/settings/Settings.h +++ b/xbmc/settings/Settings.h @@ -157,6 +157,8 @@ public: CStdString m_logFolder; + CStdString m_activeKeyboardMapping; + bool m_bMyMusicSongInfoInVis; bool m_bMyMusicSongThumbInVis; |