KEYMAPPER: Add failsafe code for popping into Keymapper itself

Thanks LordHoto
This commit is contained in:
Tarek Soliman 2012-01-07 22:07:16 -06:00
parent d143872be6
commit 37d77253cf
3 changed files with 18 additions and 13 deletions

View file

@ -163,9 +163,19 @@ void Keymapper::pushKeymap(Keymap *newMap, bool transparent, bool global) {
_activeMaps.push(mr); _activeMaps.push(mr);
} }
void Keymapper::popKeymap() { void Keymapper::popKeymap(const char *name) {
if (!_activeMaps.empty()) if (!_activeMaps.empty()) {
_activeMaps.pop(); if (name) {
String topKeymapName = _activeMaps.top().keymap->getName();
if (topKeymapName.equals(name))
_activeMaps.pop();
else
warning("An attempt to pop wrong keymap was blocked (expected %s but was %s)", name, topKeymapName.c_str());
} else {
_activeMaps.pop();
}
}
} }
bool Keymapper::notifyEvent(const Common::Event &ev) { bool Keymapper::notifyEvent(const Common::Event &ev) {

View file

@ -131,8 +131,11 @@ public:
/** /**
* Pop the top keymap off the active stack. * Pop the top keymap off the active stack.
* @param name (optional) name of keymap expected to be popped
* if provided, will not pop unless name is the same
* as the top keymap
*/ */
void popKeymap(); void popKeymap(const char *name = 0);
// Implementation of the EventMapper interface // Implementation of the EventMapper interface
bool notifyEvent(const Common::Event &ev); bool notifyEvent(const Common::Event &ev);

View file

@ -132,15 +132,7 @@ void GuiManager::pushKeymap() {
} }
void GuiManager::popKeymap() { void GuiManager::popKeymap() {
Common::Keymapper *keymapper = _system->getEventManager()->getKeymapper(); _system->getEventManager()->getKeymapper()->popKeymap(Common::kGuiKeymapName);
if (!keymapper->getActiveStack().empty()) {
Common::Keymapper::MapRecord topKeymap = keymapper->getActiveStack().top();
// TODO: Don't use the keymap name as a way to discriminate GUI maps
if(topKeymap.keymap->getName().equals(Common::kGuiKeymapName))
keymapper->popKeymap();
else
warning("An attempt to pop non-gui keymap %s was blocked", topKeymap.keymap->getName().c_str());
}
} }
#endif #endif