aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/common/keymap-manager.cpp78
-rw-r--r--backends/common/keymap-manager.h45
-rw-r--r--backends/common/keymapper.cpp40
-rw-r--r--backends/common/keymapper.h16
4 files changed, 119 insertions, 60 deletions
diff --git a/backends/common/keymap-manager.cpp b/backends/common/keymap-manager.cpp
index 6f60018abe..73ce705414 100644
--- a/backends/common/keymap-manager.cpp
+++ b/backends/common/keymap-manager.cpp
@@ -4,56 +4,62 @@
namespace Common {
-KeymapManager::KeymapManager() {
+void KeymapManager::Domain::addDefaultKeymap(Keymap *map) {
+ _defaultKeymap = map;
}
-bool KeymapManager::registerSuperGlobalKeymap(const Keymap& map) {
- return registerKeymap(GLOBAL_ID_STR, GLOBAL_ID_STR, map);
+void KeymapManager::Domain::addKeymap(const String& name, Keymap *map) {
+ if (_keymaps.contains(name))
+ delete _keymaps[name];
+ _keymaps[name] = map;
}
-bool KeymapManager::registerGlobalKeymap(const String& name, const Keymap& map) {
- return registerKeymap(name, GLOBAL_ID_STR, map);
+void KeymapManager::Domain::deleteAllKeyMaps() {
+ KeymapMap::iterator it;
+ for (it = _keymaps.begin(); it != _keymaps.end(); it++)
+ delete it->_value;
+ _keymaps.clear();
}
-bool KeymapManager::registerKeymap(const String& name, const String& domain, const Keymap& map) {
- if (findEntry(name, domain) != _keymaps.end()) {
- warning("Keymap with given name and domain already exists\n");
- return false;
- }
- Entry *ent = new Entry;
- ent->_name = name;
- ent->_domain = domain;
- ent->_keymap = new Keymap(map);
- _keymaps.push_back(ent);
- return true;
+Keymap *KeymapManager::Domain::getDefaultKeymap() {
+ return _defaultKeymap;
}
-bool KeymapManager::unregisterSuperGlobalKeymap() {
- return unregisterKeymap(GLOBAL_ID_STR, GLOBAL_ID_STR);
+Keymap *KeymapManager::Domain::getKeymap(const String& name) {
+ KeymapMap::iterator it = _keymaps.find(name);
+ if (it != _keymaps.end())
+ return it->_value;
+ else
+ return 0;
}
-bool KeymapManager::unregisterGlobalKeymap(const String& name) {
- return unregisterKeymap(name, GLOBAL_ID_STR);
+
+void KeymapManager::registerDefaultGlobalKeymap(Keymap *map) {
+ _globalDomain.addDefaultKeymap(map);
+}
+
+void KeymapManager::registerGlobalKeymap(const String& name, Keymap *map) {
+ _globalDomain.addKeymap(name, map);
+}
+
+void KeymapManager::registerDefaultGameKeymap(Keymap *map) {
+ _gameDomain.addDefaultKeymap(map);
+}
+
+void KeymapManager::registerGameKeymap(const String& name, Keymap *map) {
+ _gameDomain.addKeymap(name, map);
}
-bool KeymapManager::unregisterKeymap(const String& name, const String& domain) {
- Iterator it = findEntry(name, domain);
- if (it == _keymaps.end())
- return true;
- delete (*it)->_keymap;
- delete *it;
- _keymaps.erase(it);
- return true;
+void KeymapManager::unregisterAllGameKeymaps() {
+ _gameDomain.deleteAllKeyMaps();
}
-KeymapManager::Iterator KeymapManager::findEntry(const String& name, const String& domain) {
- Iterator it;
- for (it = _keymaps.begin(); it != _keymaps.end(); it++) {
- if ((*it)->_name == name && (*it)->_domain == domain)
- break;
- }
- return it;
+Keymap *KeymapManager::getKeymap(const String& name) {
+ Keymap *keymap = _gameDomain.getKeymap(name);
+ if (!keymap)
+ _globalDomain.getKeymap(name);
+ return keymap;
}
-
+
} // end of namespace Common \ No newline at end of file
diff --git a/backends/common/keymap-manager.h b/backends/common/keymap-manager.h
index d9c97d7de1..e5152d2426 100644
--- a/backends/common/keymap-manager.h
+++ b/backends/common/keymap-manager.h
@@ -2,35 +2,48 @@
#define COMMON_KEYMAP_MANAGER
#include "backends/common/keymap.h"
-#include "common/list.h"
+#include "common/hash-str.h"
+#include "common/hashmap.h"
namespace Common {
class KeymapManager {
public:
- KeymapManager();
+ class Domain {
+ public:
+ Domain() : _defaultKeymap(0) {}
- bool registerSuperGlobalKeymap(const Keymap& map);
- bool registerGlobalKeymap(const String& name, const Keymap& map);
- bool registerKeymap(const String& name, const String& domain, const Keymap& map);
+ void addDefaultKeymap(Keymap *map);
+ void addKeymap(const String& name, Keymap *map);
- bool unregisterSuperGlobalKeymap();
- bool unregisterGlobalKeymap(const String& name);
- bool unregisterKeymap(const String& name, const String& domain);
+ void deleteAllKeyMaps();
-private:
+ Keymap *getDefaultKeymap();
+ Keymap *getKeymap(const String& name);
+
+ private:
+ typedef HashMap<String, Keymap*,
+ IgnoreCase_Hash, IgnoreCase_EqualTo> KeymapMap;
- struct Entry {
- String _name;
- String _domain;
- Keymap *_keymap;
+ Keymap *_defaultKeymap;
+ KeymapMap _keymaps;
};
- typedef List<Entry*>::iterator Iterator;
- Iterator findEntry(const String& name, const String& domain);
+ void registerDefaultGlobalKeymap(Keymap *map);
+ void registerGlobalKeymap(const String& name, Keymap *map);
+
+ void registerDefaultGameKeymap(Keymap *map);
+ void registerGameKeymap(const String& name, Keymap *map);
+
+ void unregisterAllGameKeymaps();
+
+ Keymap *KeymapManager::getKeymap(const String& name);
+
+private:
- List<Entry*> _keymaps;
+ Domain _globalDomain;
+ Domain _gameDomain;
};
} // end of namespace Common
diff --git a/backends/common/keymapper.cpp b/backends/common/keymapper.cpp
index 4edd64aa44..a70a691907 100644
--- a/backends/common/keymapper.cpp
+++ b/backends/common/keymapper.cpp
@@ -1,6 +1,6 @@
#include "backends/common/keymapper.h"
#include "backends/common/keymap-manager.h"
-
+#include "common/config-manager.h"
namespace Common {
Keymapper::Keymapper(EventManager *evtMgr) {
@@ -16,16 +16,46 @@ void Keymapper::registerHardwareKeySet(HardwareKeySet *keys) {
_hardwareKeys = keys;
}
-const HardwareKeySet *Keymapper::getHardwareKeySet() {
+const HardwareKeySet *Keymapper::getHardwareKeySet() const {
return _hardwareKeys;
}
-void Keymapper::addGlobalKeyMap(const String& name, Keymap& keymap) {
+void Keymapper::addGlobalKeyMap(const String& name, Keymap *keymap) {
_keymapMan->registerGlobalKeymap(name, keymap);
}
-void Keymapper::addGameKeyMap(const String& gameid, const String& name, Keymap& keymap) {
- _keymapMan->registerKeymap(name, gameid, keymap);
+void Keymapper::addGameKeyMap(const String& name, Keymap *keymap) {
+ if (_gameId.size() == 0) {
+ initGame();
+ if (_gameId.size() == 0)
+ return;
+ }
+ _keymapMan->registerGameKeymap(name, keymap);
+}
+
+void Keymapper::initGame() {
+ if (ConfMan.getActiveDomain() == 0)
+ error("Call to Keymapper::initGame when no game loaded\n");
+
+ if (_gameId.size() > 0)
+ deInitGame();
+ _gameId = ConfMan.getActiveDomainName();
+}
+
+void Keymapper::deInitGame() {
+ _keymapMan->unregisterAllGameKeymaps();
+ _gameId.clear();
+}
+
+
+bool Keymapper::switchKeymap(const String& name) {
+ Keymap *new_map = _keymapMan->getKeymap(name);
+ if (!new_map) {
+ warning("Keymap '%s' could not be found\n", name.c_str());
+ return false;
+ }
+ _currentMap = new_map;
+ return true;
}
} // end of namespace Common
diff --git a/backends/common/keymapper.h b/backends/common/keymapper.h
index 4f25ea37ff..d9b1b050fb 100644
--- a/backends/common/keymapper.h
+++ b/backends/common/keymapper.h
@@ -14,9 +14,17 @@ public:
Keymapper(EventManager *eventMan);
void registerHardwareKeySet(HardwareKeySet *keys);
- const HardwareKeySet *getHardwareKeySet();
- void addGlobalKeyMap(const String& name, Keymap& keymap);
- void addGameKeyMap(const String& gameid, const String& name, Keymap& keymap);
+
+ const HardwareKeySet *getHardwareKeySet() const;
+
+ void addGlobalKeyMap(const String& name, Keymap *keymap);
+
+ void addGameKeyMap(const String& name, Keymap *keymap);
+
+ void initGame();
+ void deInitGame();
+
+ bool switchKeymap(const String& name);
private:
@@ -25,6 +33,8 @@ private:
EventManager *_eventMan;
KeymapManager *_keymapMan;
+ String _gameId;
+
Keymap *_currentMap;
const HardwareKeySet *_hardwareKeys;