aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Kennedy2008-08-23 17:04:40 +0000
committerStephen Kennedy2008-08-23 17:04:40 +0000
commitbaae044e388bca79a593ce083037c5da777818ea (patch)
tree60f6ccad59f2182d5ad9d9bcb4eab9ff78d3237e
parent648f6ed9341775457c301e9055afd40a37b02d6a (diff)
downloadscummvm-rg350-baae044e388bca79a593ce083037c5da777818ea.tar.gz
scummvm-rg350-baae044e388bca79a593ce083037c5da777818ea.tar.bz2
scummvm-rg350-baae044e388bca79a593ce083037c5da777818ea.zip
Proper fix for key repeat bug - r34094 caused different problems due to repeated key up events
svn-id: r34115
-rw-r--r--backends/events/default/default-events.cpp30
-rw-r--r--backends/events/default/default-events.h4
-rw-r--r--backends/keymapper/keymapper.cpp34
-rw-r--r--backends/keymapper/keymapper.h3
4 files changed, 38 insertions, 33 deletions
diff --git a/backends/events/default/default-events.cpp b/backends/events/default/default-events.cpp
index d6b9978d94..9a0b5de298 100644
--- a/backends/events/default/default-events.cpp
+++ b/backends/events/default/default-events.cpp
@@ -110,7 +110,6 @@ DefaultEventManager::DefaultEventManager(OSystem *boss) :
_eventCount = 0;
_lastEventCount = 0;
_lastMillis = 0;
- _artificialEventCounter = 0;
Common::String recordModeString = ConfMan.get("record_mode");
if (recordModeString.compareToIgnoreCase("record") == 0) {
@@ -364,19 +363,20 @@ void DefaultEventManager::processMillis(uint32 &millis) {
_lastMillis = millis;
_boss->unlockMutex(_timeMutex);
}
-
+#include "backends/vkeybd/keycode-descriptions.h"
bool DefaultEventManager::pollEvent(Common::Event &event) {
uint32 time = _boss->getMillis();
bool result = false;
// poll for pushed events
if (!_artificialEventQueue.empty()) {
- // delay the feeding of artificial events
- if (++_artificialEventCounter % kArtificialEventDelay == 0) {
- event = _artificialEventQueue.pop();
- result = true;
- _artificialEventCounter = 0;
- }
+ event = _artificialEventQueue.pop();
+ result = true;
+
+ if (event.type == Common::EVENT_KEYDOWN)
+ printf("ART. KEY DOWN: %d (%s)\n", event.kbd.keycode, keycodeDescTable[event.kbd.keycode]);
+ else if (event.type == Common::EVENT_KEYUP)
+ printf("ART. KEY UP: %d (%s)\n", event.kbd.keycode, keycodeDescTable[event.kbd.keycode]);
}
// poll for event from backend
@@ -385,11 +385,21 @@ bool DefaultEventManager::pollEvent(Common::Event &event) {
if (result) {
// send key press events to keymapper
if (event.type == Common::EVENT_KEYDOWN) {
- if (_keymapper->mapKeyDown(event.kbd))
+ printf("KEY DOWN: %d (%s)", event.kbd.keycode, keycodeDescTable[event.kbd.keycode]);
+ if (_keymapper->mapKeyDown(event.kbd)) {
result = false;
+ printf(" - MAPPED!\n");
+ } else {
+ printf("\n");
+ }
} else if (event.type == Common::EVENT_KEYUP) {
- if (_keymapper->mapKeyUp(event.kbd))
+ printf("KEY UP: %d (%s)", event.kbd.keycode, keycodeDescTable[event.kbd.keycode]);
+ if (_keymapper->mapKeyUp(event.kbd)) {
result = false;
+ printf(" - MAPPED!\n");
+ } else {
+ printf("\n");
+ }
}
}
}
diff --git a/backends/events/default/default-events.h b/backends/events/default/default-events.h
index ba30cb2383..0087265e2a 100644
--- a/backends/events/default/default-events.h
+++ b/backends/events/default/default-events.h
@@ -55,10 +55,6 @@ class DefaultEventManager : public Common::EventManager {
bool _remap;
Common::Queue<Common::Event> _artificialEventQueue;
- int _artificialEventCounter;
- enum {
- kArtificialEventDelay = 5
- };
Common::Point _mousePos;
int _buttonState;
diff --git a/backends/keymapper/keymapper.cpp b/backends/keymapper/keymapper.cpp
index 9f4b42658b..5c79d445cb 100644
--- a/backends/keymapper/keymapper.cpp
+++ b/backends/keymapper/keymapper.cpp
@@ -127,12 +127,6 @@ bool Keymapper::pushKeymap(const String& name, bool inherit) {
}
void Keymapper::pushKeymap(Keymap *newMap, bool inherit, bool global) {
- List<KeyState>::iterator it;
- for (it = _keysDown.begin(); it != _keysDown.end(); ++it) {
- Action *action = getAction(*it);
- if (action) executeAction(action, false);
- }
- _keysDown.clear();
MapRecord mr = {newMap, inherit, global};
_activeMaps.push(mr);
}
@@ -154,25 +148,29 @@ bool Keymapper::mapKey(const KeyState& key, bool keyDown) {
if (!_enabled) return false;
if (_activeMaps.empty()) return false;
- Action *action = getAction(key);
+ 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;
-
- if (keyDown)
- _keysDown.push_back(key);
- else
- _keysDown.remove(key);
-
executeAction(action, keyDown);
return true;
}
Action *Keymapper::getAction(const KeyState& key) {
Action *action = 0;
- for (int i = _activeMaps.size() - 1; i >= 0; --i) {
- MapRecord mr = _activeMaps[i];
- action = mr.keymap->getMappedAction(key);
- if (action || mr.inherit == false) break;
- }
return action;
}
diff --git a/backends/keymapper/keymapper.h b/backends/keymapper/keymapper.h
index d6ba89288d..a13cebe39a 100644
--- a/backends/keymapper/keymapper.h
+++ b/backends/keymapper/keymapper.h
@@ -28,6 +28,7 @@
#include "common/events.h"
#include "common/list.h"
+#include "common/hashmap.h"
#include "common/stack.h"
#include "backends/keymapper/hardware-key.h"
#include "backends/keymapper/keymap.h"
@@ -194,7 +195,7 @@ private:
bool _enabled;
Stack<MapRecord> _activeMaps;
- List<KeyState> _keysDown;
+ HashMap<KeyState, Action*> _keysDown;
};