aboutsummaryrefslogtreecommitdiff
path: root/backends/keymapper/keymapper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/keymapper/keymapper.cpp')
-rw-r--r--backends/keymapper/keymapper.cpp76
1 files changed, 64 insertions, 12 deletions
diff --git a/backends/keymapper/keymapper.cpp b/backends/keymapper/keymapper.cpp
index e011b215f0..acb706c70f 100644
--- a/backends/keymapper/keymapper.cpp
+++ b/backends/keymapper/keymapper.cpp
@@ -27,32 +27,76 @@
#include "common/config-manager.h"
namespace Common {
-Keymapper::Keymapper(EventManager *evtMgr) {
- _eventMan = evtMgr;
- _keymapMan = new KeymapManager();
- _enabled = true;
+void Keymapper::Domain::addKeymap(Keymap *map) {
+ KeymapMap::iterator it = _keymaps.find(map->getName());
+ if (it != _keymaps.end())
+ delete _keymaps[map->getName()];
+ _keymaps[map->getName()] = map;
+}
+
+void Keymapper::Domain::deleteAllKeyMaps() {
+ KeymapMap::iterator it;
+ for (it = _keymaps.begin(); it != _keymaps.end(); it++)
+ delete it->_value;
+ _keymaps.clear();
+}
+
+Keymap *Keymapper::Domain::getKeymap(const String& name) {
+ KeymapMap::iterator it = _keymaps.find(name);
+ if (it != _keymaps.end())
+ return it->_value;
+ else
+ return 0;
+}
+
+Keymapper::Keymapper(EventManager *evtMgr)
+ : _eventMan(evtMgr), _enabled(true), _hardwareKeys(0) {
+ _globalDomain.setConfigDomain(ConfMan.getDomain(ConfigManager::kApplicationDomain));
}
Keymapper::~Keymapper() {
- delete _keymapMan;
+ delete _hardwareKeys;
}
void Keymapper::registerHardwareKeySet(HardwareKeySet *keys) {
- _keymapMan->registerHardwareKeySet(keys);
+ if (_hardwareKeys)
+ error("Hardware key set already registered!");
+ _hardwareKeys = keys;
}
void Keymapper::addGlobalKeymap(Keymap *keymap) {
- _keymapMan->registerGlobalKeymap(keymap);
+ initKeymap(_globalDomain.getConfigDomain(), keymap);
+ _globalDomain.addKeymap(keymap);
+}
+
+void Keymapper::refreshGameDomain() {
+ if (_gameDomain.getConfigDomain() != ConfMan.getActiveDomain()) {
+ cleanupGameKeymaps();
+ _gameDomain.setConfigDomain(ConfMan.getActiveDomain());
+ }
}
void Keymapper::addGameKeymap(Keymap *keymap) {
if (ConfMan.getActiveDomain() == 0)
error("Call to Keymapper::addGameKeymap when no game loaded");
- _keymapMan->registerGameKeymap(keymap);
+ refreshGameDomain();
+ initKeymap(_gameDomain.getConfigDomain(), keymap);
+ _gameDomain.addKeymap(keymap);
+}
+
+void Keymapper::initKeymap(ConfigManager::Domain *domain, Keymap *map) {
+ map->setConfigDomain(domain);
+ map->loadMappings(_hardwareKeys);
+ if (map->isComplete(_hardwareKeys) == false) {
+ map->automaticMapping(_hardwareKeys);
+ map->saveMappings();
+ ConfMan.flushToDisk();
+ }
}
void Keymapper::cleanupGameKeymaps() {
+ _gameDomain.deleteAllKeyMaps();
Stack<MapRecord> newStack;
for (int i = 0; i < _activeMaps.size(); i++) {
if (!_activeMaps[i].global)
@@ -61,9 +105,19 @@ void Keymapper::cleanupGameKeymaps() {
_activeMaps = newStack;
}
+Keymap *Keymapper::getKeymap(const String& name, bool &global) {
+ Keymap *keymap = _gameDomain.getKeymap(name);
+ global = false;
+ if (!keymap) {
+ keymap = _globalDomain.getKeymap(name);
+ global = true;
+ }
+ return keymap;
+}
+
bool Keymapper::pushKeymap(const String& name, bool inherit) {
bool global;
- Keymap *newMap = _keymapMan->getKeymap(name, &global);
+ Keymap *newMap = getKeymap(name, global);
if (!newMap) {
warning("Keymap '%s' not registered", name.c_str());
return false;
@@ -141,9 +195,7 @@ bool Keymapper::mapKey(const KeyState& key, bool isKeyDown) {
}
const HardwareKey *Keymapper::getHardwareKey(const KeyState& key) {
- HardwareKeySet *keyset = _keymapMan->getHardwareKeySet();
- if (!keyset) return 0;
- return keyset->findHardwareKey(key);
+ return (_hardwareKeys) ? _hardwareKeys->findHardwareKey(key) : 0;
}
} // end of namespace Common