diff options
-rw-r--r-- | backends/common/keymap-manager.cpp | 78 | ||||
-rw-r--r-- | backends/common/keymap-manager.h | 45 | ||||
-rw-r--r-- | backends/common/keymapper.cpp | 40 | ||||
-rw-r--r-- | backends/common/keymapper.h | 16 |
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; |