aboutsummaryrefslogtreecommitdiff
path: root/backends/keymapper/keymapper.cpp
diff options
context:
space:
mode:
authorEugene Sandulenko2009-05-10 17:18:59 +0000
committerEugene Sandulenko2009-05-10 17:18:59 +0000
commit2cc77639715214573637375655442d2208898a38 (patch)
tree787ccf95ac9c7fc1cdbe0df86a309d26deb973bd /backends/keymapper/keymapper.cpp
parent7cd07d958193f591740c9e60225ae82833ac90c8 (diff)
downloadscummvm-rg350-2cc77639715214573637375655442d2208898a38.tar.gz
scummvm-rg350-2cc77639715214573637375655442d2208898a38.tar.bz2
scummvm-rg350-2cc77639715214573637375655442d2208898a38.zip
whitespaces
svn-id: r40424
Diffstat (limited to 'backends/keymapper/keymapper.cpp')
-rw-r--r--backends/keymapper/keymapper.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/backends/keymapper/keymapper.cpp b/backends/keymapper/keymapper.cpp
index c6ed0fe024..56780f49af 100644
--- a/backends/keymapper/keymapper.cpp
+++ b/backends/keymapper/keymapper.cpp
@@ -33,19 +33,23 @@ namespace Common {
void Keymapper::Domain::addKeymap(Keymap *map) {
iterator it = find(map->getName());
+
if (it != end())
delete it->_value;
+
setVal(map->getName(), map);
}
void Keymapper::Domain::deleteAllKeyMaps() {
for (iterator it = begin(); it != end(); it++)
delete it->_value;
+
clear();
}
Keymap *Keymapper::Domain::getKeymap(const String& name) {
iterator it = find(name);
+
if (it != end())
return it->_value;
else
@@ -55,6 +59,7 @@ Keymap *Keymapper::Domain::getKeymap(const String& name) {
Keymapper::Keymapper(EventManager *evtMgr)
: _eventMan(evtMgr), _enabled(true), _hardwareKeys(0) {
ConfigManager::Domain *confDom = ConfMan.getDomain(ConfigManager::kApplicationDomain);
+
_globalDomain.setConfigDomain(confDom);
}
@@ -65,6 +70,7 @@ Keymapper::~Keymapper() {
void Keymapper::registerHardwareKeySet(HardwareKeySet *keys) {
if (_hardwareKeys)
error("Hardware key set already registered!");
+
_hardwareKeys = keys;
}
@@ -82,17 +88,20 @@ void Keymapper::addGameKeymap(Keymap *keymap) {
cleanupGameKeymaps();
_gameDomain.setConfigDomain(ConfMan.getActiveDomain());
}
+
initKeymap(_gameDomain, keymap);
}
void Keymapper::initKeymap(Domain &domain, Keymap *map) {
map->setConfigDomain(domain.getConfigDomain());
map->loadMappings(_hardwareKeys);
+
if (map->isComplete(_hardwareKeys) == false) {
map->automaticMapping(_hardwareKeys);
map->saveMappings();
ConfMan.flushToDisk();
}
+
domain.addKeymap(map);
}
@@ -103,36 +112,44 @@ void Keymapper::cleanupGameKeymaps() {
// Now restore the stack of active maps. Re-add all global keymaps, drop
// the game specific (=deleted) ones.
Stack<MapRecord> newStack;
+
for (int i = 0; i < _activeMaps.size(); i++) {
if (_activeMaps[i].global)
newStack.push(_activeMaps[i]);
}
+
_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 = getKeymap(name, global);
+
if (!newMap) {
warning("Keymap '%s' not registered", name.c_str());
return false;
}
+
pushKeymap(newMap, inherit, global);
+
return true;
}
void Keymapper::pushKeymap(Keymap *newMap, bool inherit, bool global) {
MapRecord mr = {newMap, inherit, global};
+
_activeMaps.push(mr);
}
@@ -154,38 +171,49 @@ bool Keymapper::mapKey(const KeyState& key, bool keyDown) {
return false;
Action *action = 0;
+
if (keyDown) {
// Search for key in active keymap stack
for (int i = _activeMaps.size() - 1; i >= 0; --i) {
MapRecord mr = _activeMaps[i];
+
action = mr.keymap->getMappedAction(key);
+
if (action || mr.inherit == false)
break;
}
+
if (action)
_keysDown[key] = action;
} else {
HashMap<KeyState, Action*>::iterator it = _keysDown.find(key);
+
if (it != _keysDown.end()) {
action = it->_value;
_keysDown.erase(key);
}
}
+
if (!action)
return false;
+
executeAction(action, keyDown);
+
return true;
}
Action *Keymapper::getAction(const KeyState& key) {
Action *action = 0;
+
return action;
}
void Keymapper::executeAction(const Action *action, bool keyDown) {
List<Event>::const_iterator it;
+
for (it = action->events.begin(); it != action->events.end(); ++it) {
Event evt = *it;
+
switch (evt.type) {
case EVENT_KEYDOWN:
if (!keyDown) evt.type = EVENT_KEYUP;
@@ -215,6 +243,7 @@ void Keymapper::executeAction(const Action *action, bool keyDown) {
// don't deliver other events on key up
if (!keyDown) continue;
}
+
evt.mouse = _eventMan->getMousePos();
_eventMan->pushEvent(evt);
}