aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/keymapper/hardware-key.h6
-rw-r--r--backends/keymapper/keymap-manager.cpp13
-rw-r--r--backends/keymapper/keymap-manager.h2
-rw-r--r--backends/keymapper/keymap.cpp19
-rw-r--r--backends/keymapper/keymap.h14
-rw-r--r--backends/keymapper/keymapper.cpp20
-rw-r--r--backends/keymapper/keymapper.h16
-rw-r--r--backends/keymapper/remap-dialog.cpp19
-rw-r--r--backends/vkeybd/vkeybd.zipbin170515 -> 335613 bytes
-rw-r--r--common/stack.h6
10 files changed, 79 insertions, 36 deletions
diff --git a/backends/keymapper/hardware-key.h b/backends/keymapper/hardware-key.h
index 7ddb4dacd1..8807e6db9f 100644
--- a/backends/keymapper/hardware-key.h
+++ b/backends/keymapper/hardware-key.h
@@ -69,7 +69,7 @@ struct HardwareKey {
class HardwareKeySet {
public:
- HardwareKeySet() {}
+ HardwareKeySet() : _count(0) {}
virtual ~HardwareKeySet() {
List<const HardwareKey*>::iterator it;
for (it = _keys.begin(); it != _keys.end(); it++)
@@ -79,6 +79,7 @@ public:
void addHardwareKey(HardwareKey *key) {
checkForKey(key);
_keys.push_back(key);
+ ++_count;
}
const HardwareKey *findHardwareKey(int32 id) const {
@@ -104,7 +105,7 @@ public:
}
uint count() const {
- return _keys.size();
+ return _count;
}
@@ -121,6 +122,7 @@ private:
}
List<const HardwareKey*> _keys;
+ uint _count;
};
diff --git a/backends/keymapper/keymap-manager.cpp b/backends/keymapper/keymap-manager.cpp
index a9ab1c7069..1b6b547858 100644
--- a/backends/keymapper/keymap-manager.cpp
+++ b/backends/keymapper/keymap-manager.cpp
@@ -73,6 +73,7 @@ void KeymapManager::registerGlobalKeymap(Keymap *map) {
void KeymapManager::refreshGameDomain() {
if (_gameDomain.getConfigDomain() != ConfMan.getActiveDomain()) {
_gameDomain.deleteAllKeyMaps();
+
_gameDomain.setConfigDomain(ConfMan.getActiveDomain());
}
}
@@ -85,7 +86,8 @@ void KeymapManager::registerGameKeymap(Keymap *map) {
void KeymapManager::initKeymap(ConfigManager::Domain *domain,
Keymap *map) {
- map->loadMappings(domain, _hardwareKeys);
+ map->setConfigDomain(domain);
+ map->loadMappings(_hardwareKeys);
if (map->isComplete(_hardwareKeys) == false) {
automaticMap(map);
map->saveMappings(domain);
@@ -206,6 +208,8 @@ void KeymapManager::automaticMap(Keymap *map) {
break;
}
}
+ map->saveMappings();
+ ConfMan.flushToDisk();
}
Action *KeymapManager::getParentMappedAction(Keymap *map, KeyState key) {
@@ -221,10 +225,13 @@ Action *KeymapManager::getParentMappedAction(Keymap *map, KeyState key) {
}
}
-Keymap *KeymapManager::getKeymap(const String& name) {
+Keymap *KeymapManager::getKeymap(const String& name, bool *global) {
Keymap *keymap = _gameDomain.getKeymap(name);
- if (!keymap)
+ *global = false;
+ if (!keymap) {
keymap = _globalDomain.getKeymap(name);
+ *global = true;
+ }
return keymap;
}
diff --git a/backends/keymapper/keymap-manager.h b/backends/keymapper/keymap-manager.h
index b76273f124..b9afaee80b 100644
--- a/backends/keymapper/keymap-manager.h
+++ b/backends/keymapper/keymap-manager.h
@@ -83,7 +83,7 @@ public:
void refreshGameDomain();
void registerGameKeymap(Keymap *map);
- Keymap *getKeymap(const String& name);
+ Keymap *getKeymap(const String& name, bool *global);
Domain& getGlobalDomain() { return _globalDomain; }
Domain& getGameDomain() { return _gameDomain; }
diff --git a/backends/keymapper/keymap.cpp b/backends/keymapper/keymap.cpp
index 28d0afd51e..64076d4457 100644
--- a/backends/keymapper/keymap.cpp
+++ b/backends/keymapper/keymap.cpp
@@ -28,7 +28,7 @@
namespace Common {
-Keymap::Keymap(const Keymap& km) : _actions(km._actions), _keymap() {
+Keymap::Keymap(const Keymap& km) : _actions(km._actions), _keymap(), _configDomain(0) {
List<Action*>::iterator it;
for (it = _actions.begin(); it != _actions.end(); it++) {
const HardwareKey *hwKey = (*it)->getMappedKey();
@@ -94,10 +94,15 @@ Action *Keymap::getMappedAction(const KeyState& ks) const {
return it->_value;
}
-void Keymap::loadMappings(ConfigManager::Domain *domain, const HardwareKeySet *hwKeys) {
+void Keymap::setConfigDomain(ConfigManager::Domain *dom) {
+ _configDomain = dom;
+}
+
+void Keymap::loadMappings(const HardwareKeySet *hwKeys) {
+ if (!_configDomain) return;
ConfigManager::Domain::iterator it;
String prefix = "km_" + _name + "_";
- for (it = domain->begin(); it != domain->end(); it++) {
+ for (it = _configDomain->begin(); it != _configDomain->end(); it++) {
const String& key = it->_key;
if (!key.hasPrefix(prefix.c_str()))
continue;
@@ -114,6 +119,7 @@ void Keymap::loadMappings(ConfigManager::Domain *domain, const HardwareKeySet *h
if (!ua) {
warning("'%s' keymap does not contain Action with ID %d",
_name.c_str(), (int)actionId);
+ _configDomain->erase(key);
continue;
}
@@ -126,6 +132,7 @@ void Keymap::loadMappings(ConfigManager::Domain *domain, const HardwareKeySet *h
const HardwareKey *hwKey = hwKeys->findHardwareKey(hwKeyId);
if (!hwKey) {
warning("HardwareKey with ID %d not known", (int)hwKeyId);
+ _configDomain->erase(key);
continue;
}
@@ -133,8 +140,8 @@ void Keymap::loadMappings(ConfigManager::Domain *domain, const HardwareKeySet *h
}
}
-void Keymap::saveMappings(ConfigManager::Domain *domain) {
- if (!domain) return;
+void Keymap::saveMappings() {
+ if (!_configDomain) return;
List<Action*>::const_iterator it;
char buf[12];
String prefix = "km_" + _name + "_";
@@ -145,7 +152,7 @@ void Keymap::saveMappings(ConfigManager::Domain *domain) {
sprintf(buf, "%d", (*it)->getMappedKey()->id);
else
strcpy(buf, "");
- domain->setVal(key, buf);
+ _configDomain->setVal(key, buf);
}
}
diff --git a/backends/keymapper/keymap.h b/backends/keymapper/keymap.h
index 5694bfaa18..3159dab7f8 100644
--- a/backends/keymapper/keymap.h
+++ b/backends/keymapper/keymap.h
@@ -81,19 +81,20 @@ public:
*/
Action *getMappedAction(const KeyState& ks) const;
+ void setConfigDomain(ConfigManager::Domain *dom);
+
/**
- * Load this keymap's mappings from the given config domain and hardware key set
- * @param domain config domain to load keymap from
+ * Load this keymap's mappings from the config manager.
* @param hwKeys the set to retrieve hardware key pointers from
*/
- void loadMappings(ConfigManager::Domain *domain, const HardwareKeySet *hwKeys);
+ void loadMappings(const HardwareKeySet *hwKeys);
/**
- * Save this keymap's mappings to the given config domain
- * @param domain config domain to save keymap to
+ * Save this keymap's mappings to the config manager
+ * @note Changes are *not* flushed to disk, to do so call ConfMan.flushToDisk()
* @note Changes are *not* flushed to disk, to do so call ConfMan.flushToDisk()
*/
- void saveMappings(ConfigManager::Domain *domain);
+ void saveMappings();
/**
* Returns true if all UserAction's in Keymap are mapped, or,
@@ -130,6 +131,7 @@ private:
Keymap *_parent;
List<Action*> _actions;
HashMap<KeyState, Action*> _keymap;
+ ConfigManager::Domain *_configDomain;
};
diff --git a/backends/keymapper/keymapper.cpp b/backends/keymapper/keymapper.cpp
index 93b45e1d99..e011b215f0 100644
--- a/backends/keymapper/keymapper.cpp
+++ b/backends/keymapper/keymapper.cpp
@@ -52,20 +52,28 @@ void Keymapper::addGameKeymap(Keymap *keymap) {
_keymapMan->registerGameKeymap(keymap);
}
+void Keymapper::cleanupGameKeymaps() {
+ Stack<MapRecord> newStack;
+ for (int i = 0; i < _activeMaps.size(); i++) {
+ if (!_activeMaps[i].global)
+ newStack.push(_activeMaps[i]);
+ }
+ _activeMaps = newStack;
+}
+
bool Keymapper::pushKeymap(const String& name, bool inherit) {
- Keymap *newMap = _keymapMan->getKeymap(name);
+ bool global;
+ Keymap *newMap = _keymapMan->getKeymap(name, &global);
if (!newMap) {
warning("Keymap '%s' not registered", name.c_str());
return false;
}
- pushKeymap(newMap, inherit);
+ pushKeymap(newMap, inherit, global);
return true;
}
-void Keymapper::pushKeymap(Keymap *newMap, bool inherit) {
- MapRecord mr;
- mr.inherit = inherit;
- mr.keymap = newMap;
+void Keymapper::pushKeymap(Keymap *newMap, bool inherit, bool global) {
+ MapRecord mr = {newMap, inherit, global};
_activeMaps.push(mr);
}
diff --git a/backends/keymapper/keymapper.h b/backends/keymapper/keymapper.h
index 7ef2ef96cb..fc76a7d45c 100644
--- a/backends/keymapper/keymapper.h
+++ b/backends/keymapper/keymapper.h
@@ -41,6 +41,7 @@ public:
struct MapRecord {
Keymap* keymap;
bool inherit;
+ bool global;
};
Keymapper(EventManager *eventMan);
@@ -61,13 +62,18 @@ public:
void addGlobalKeymap(Keymap *keymap);
/**
- * Add a keymap to the game domain.
- * @see addGlobalKeyMap
- * @note initGame() should be called before any game keymaps are added.
- */
+ * Add a keymap to the game domain.
+ * @see addGlobalKeyMap
+ * @note initGame() should be called before any game keymaps are added.
+ */
void addGameKeymap(Keymap *keymap);
/**
+ * Should be called at end of game to tell Keymapper to deactivate and free
+ * any game keymaps that are loaded.
+ */
+ void cleanupGameKeymaps();
+ /**
* Push a new keymap to the top of the active stack, activating
* it for use.
* @param name name of the keymap to push
@@ -113,7 +119,7 @@ public:
private:
- void pushKeymap(Keymap *newMap, bool inherit);
+ void pushKeymap(Keymap *newMap, bool inherit, bool global);
typedef List<HardwareKey*>::iterator Iterator;
diff --git a/backends/keymapper/remap-dialog.cpp b/backends/keymapper/remap-dialog.cpp
index 24da9d1b35..57e4578629 100644
--- a/backends/keymapper/remap-dialog.cpp
+++ b/backends/keymapper/remap-dialog.cpp
@@ -51,9 +51,11 @@ RemapDialog::~RemapDialog() {
}
void RemapDialog::open() {
+ bool divider = false;
_activeKeymaps = &_keymapper->getActiveStack();
if (_activeKeymaps->size() > 0) {
_kmPopUp->appendEntry(_activeKeymaps->top().keymap->getName() + " (Active)");
+ divider = true;
}
KeymapManager::Domain *_globalKeymaps = &_keymapper->getManager()->getGlobalDomain();
@@ -78,14 +80,15 @@ void RemapDialog::open() {
KeymapManager::Domain::iterator it;
uint32 idx = 0;
if (_globalKeymaps) {
- _kmPopUp->appendEntry("");
+ if (divider) _kmPopUp->appendEntry("");
for (it = _globalKeymaps->begin(); it != _globalKeymaps->end(); it++) {
_kmPopUp->appendEntry(it->_value->getName() + " (Global)", idx);
_keymapTable[idx++] = it->_value;
}
+ divider = true;
}
if (_gameKeymaps) {
- _kmPopUp->appendEntry("");
+ if (divider) _kmPopUp->appendEntry("");
for (it = _gameKeymaps->begin(); it != _gameKeymaps->end(); it++) {
_kmPopUp->appendEntry(it->_value->getName() + " (Game)", idx);
_keymapTable[idx++] = it->_value;
@@ -93,10 +96,11 @@ void RemapDialog::open() {
}
_changes = false;
- _kmPopUp->setSelected(0);
- loadKeymap();
Dialog::open();
+
+ _kmPopUp->setSelected(0);
+ loadKeymap();
}
void RemapDialog::close() {
@@ -105,7 +109,8 @@ void RemapDialog::close() {
free(_keymapTable);
_keymapTable = 0;
}
- if (_changes) ConfMan.flushToDisk();
+ if (_changes)
+ ConfMan.flushToDisk();
Dialog::close();
}
@@ -260,7 +265,9 @@ void RemapDialog::loadKeymap() {
}
} else if (_kmPopUp->getSelected() != -1) {
- Keymap *km = _keymapTable[_kmPopUp->getSelectedTag()];
+ uint32 select = _kmPopUp->getSelected();
+ uint32 tag = _kmPopUp->getSelectedTag();
+ Keymap *km = _keymapTable[tag];
List<Action*>::iterator it;
for (it = km->getActions().begin(); it != km->getActions().end(); it++) {
diff --git a/backends/vkeybd/vkeybd.zip b/backends/vkeybd/vkeybd.zip
index 5efbf4f660..e62498cc3d 100644
--- a/backends/vkeybd/vkeybd.zip
+++ b/backends/vkeybd/vkeybd.zip
Binary files differ
diff --git a/common/stack.h b/common/stack.h
index 876efacc3f..238d0f6433 100644
--- a/common/stack.h
+++ b/common/stack.h
@@ -88,7 +88,11 @@ protected:
public:
Stack<T>() {}
Stack<T>(const Array<T> &stackContent) : _stack(stackContent) {}
-
+
+ Stack<T>& operator=(const Stack<T> &st) {
+ _stack = st._stack;
+ return *this;
+ }
bool empty() const {
return _stack.empty();
}