aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Ellis <malard@gmail.com>2011-06-12 14:24:17 +0100
committerMartin Ellis <malard@gmail.com>2011-06-12 15:43:09 +0100
commit742f64bdec217a662ff0d8b7e519aa8e4bba2681 (patch)
tree421b90dadfe8ba806dec17ce0093522f22101cbf
parent755c63248575433ee89c0f3986767fe3f3336c2a (diff)
changed: multiple mappings support in keymap files specifically orientated towards keyboards
-rw-r--r--xbmc/input/ButtonTranslator.cpp51
-rw-r--r--xbmc/input/ButtonTranslator.h3
-rw-r--r--xbmc/settings/Settings.cpp2
-rw-r--r--xbmc/settings/Settings.h2
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;