aboutsummaryrefslogtreecommitdiff
path: root/backends
diff options
context:
space:
mode:
Diffstat (limited to 'backends')
-rw-r--r--backends/events/default/default-events.cpp33
-rw-r--r--backends/events/default/default-events.h13
2 files changed, 46 insertions, 0 deletions
diff --git a/backends/events/default/default-events.cpp b/backends/events/default/default-events.cpp
index 3b7315a2d4..f4c2623f0d 100644
--- a/backends/events/default/default-events.cpp
+++ b/backends/events/default/default-events.cpp
@@ -33,19 +33,40 @@ DefaultEventManager::DefaultEventManager(OSystem *boss) :
_shouldQuit(false) {
assert(_boss);
+
+ // Reset key repeat
+ _currentKeyDown.keycode = 0;
}
bool DefaultEventManager::pollEvent(OSystem::Event &event) {
+ uint32 time = _boss->getMillis();
bool result;
result = _boss->pollEvent(event);
if (result) {
+ event.synthetic = false;
switch (event.type) {
case OSystem::EVENT_KEYDOWN:
+ _modifierState = event.kbd.flags;
+
+ // init continuous event stream
+ // not done on PalmOS because keyboard is emulated and keyup is not generated
+#if !defined(PALMOS_MODE)
+ _currentKeyDown.ascii = event.kbd.ascii;
+ _currentKeyDown.keycode = event.kbd.keycode;
+ _currentKeyDown.flags = event.kbd.flags;
+ _keyRepeatTime = time + kKeyRepeatInitialDelay;
+#endif
+ break;
case OSystem::EVENT_KEYUP:
_modifierState = event.kbd.flags;
+ if (event.kbd.keycode == _currentKeyDown.keycode) {
+ // Only stop firing events if it's the current key
+ _currentKeyDown.keycode = 0;
+ }
break;
+
case OSystem::EVENT_MOUSEMOVE:
_mousePos = event.mouse;
break;
@@ -75,6 +96,18 @@ bool DefaultEventManager::pollEvent(OSystem::Event &event) {
default:
break;
}
+ } else {
+ // Check if event should be sent again (keydown)
+ if (_currentKeyDown.keycode != 0 && _keyRepeatTime < time) {
+ // fire event
+ event.type = OSystem::EVENT_KEYDOWN;
+ event.synthetic = true;
+ event.kbd.ascii = _currentKeyDown.ascii;
+ event.kbd.keycode = _currentKeyDown.keycode;
+ event.kbd.flags = _currentKeyDown.flags;
+ _keyRepeatTime = time + kKeyRepeatSustainDelay;
+ result = true;
+ }
}
return result;
diff --git a/backends/events/default/default-events.h b/backends/events/default/default-events.h
index 1b6c821c23..229249a44d 100644
--- a/backends/events/default/default-events.h
+++ b/backends/events/default/default-events.h
@@ -46,6 +46,19 @@ class DefaultEventManager : public Common::EventManager {
int _modifierState;
bool _shouldQuit;
+ // for continuous events (keyDown)
+ enum {
+ kKeyRepeatInitialDelay = 400,
+ kKeyRepeatSustainDelay = 100
+ };
+
+ struct {
+ uint16 ascii;
+ byte flags;
+ int keycode;
+ } _currentKeyDown;
+ uint32 _keyRepeatTime;
+
public:
DefaultEventManager(OSystem *boss);