diff options
author | Torbjörn Andersson | 2007-03-17 15:44:26 +0000 |
---|---|---|
committer | Torbjörn Andersson | 2007-03-17 15:44:26 +0000 |
commit | 53624376b4d614689695d1ea56c1052cd0e7ad12 (patch) | |
tree | c98fc0e637f6634d270ae0b6e5311852e3634811 /backends/events/default/default-events.cpp | |
parent | e72455c215a1deebe235d18e7efbe55f76d8f2da (diff) | |
download | scummvm-rg350-53624376b4d614689695d1ea56c1052cd0e7ad12.tar.gz scummvm-rg350-53624376b4d614689695d1ea56c1052cd0e7ad12.tar.bz2 scummvm-rg350-53624376b4d614689695d1ea56c1052cd0e7ad12.zip |
Applied my re-revised patch #1487149 ("Simplified keyboard repeat"), with
Fingolfin's blessings. Keyboard repeat is now handled by the event manager,
rather than by individual engines.
Since this can cause problems with some engines (see the AGI engine), the extra
"key down" events are marked as "synthetic", so that they can be ignored if
necessary.
svn-id: r26170
Diffstat (limited to 'backends/events/default/default-events.cpp')
-rw-r--r-- | backends/events/default/default-events.cpp | 33 |
1 files changed, 33 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; |