[Scummvm-git-logs] scummvm master -> 386c5659eca4589e69c8564d02b57af36ed3ba27
sluicebox
22204938+sluicebox at users.noreply.github.com
Mon Aug 23 20:46:36 UTC 2021
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
386c5659ec BASE: Purge keyboard/mouse events before running Engine
Commit: 386c5659eca4589e69c8564d02b57af36ed3ba27
https://github.com/scummvm/scummvm/commit/386c5659eca4589e69c8564d02b57af36ed3ba27
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2021-08-23T15:46:33-05:00
Commit Message:
BASE: Purge keyboard/mouse events before running Engine
Fixes GUI events leaking into engines at startup. This caused
Phantasmagoria 1 to skip its introduction if the game was started from
the ScummVM GUI with a keyboard (Enter) but not with a mouse because
the key-down event started the engine and the key-up event remained
in the queue.
This also purges and mouse events since we happen to already have a
purgeMouseEvents() method. We may want to also clear joystick inputs,
or possibly the entire event queue, but that can be done after the
upcoming release. For now, the known bug is fixed.
Changed paths:
backends/events/default/default-events.cpp
backends/events/default/default-events.h
base/main.cpp
common/events.h
diff --git a/backends/events/default/default-events.cpp b/backends/events/default/default-events.cpp
index 65a085bd31..75ea590f6a 100644
--- a/backends/events/default/default-events.cpp
+++ b/backends/events/default/default-events.cpp
@@ -296,6 +296,27 @@ void DefaultEventManager::purgeMouseEvents() {
_eventQueue = filteredQueue;
}
+void DefaultEventManager::purgeKeyboardEvents() {
+ _dispatcher.dispatch();
+
+ Common::Queue<Common::Event> filteredQueue;
+ while (!_eventQueue.empty()) {
+ Common::Event event = _eventQueue.pop();
+ switch (event.type) {
+ // Update keyboard state even when purging events to avoid desynchronisation with real keyboard state
+ case Common::EVENT_KEYDOWN:
+ case Common::EVENT_KEYUP:
+ _modifierState = event.kbd.flags;
+ break;
+
+ default:
+ filteredQueue.push(event);
+ break;
+ }
+ }
+ _eventQueue = filteredQueue;
+}
+
Common::Keymap *DefaultEventManager::getGlobalKeymap() {
using namespace Common;
diff --git a/backends/events/default/default-events.h b/backends/events/default/default-events.h
index cafad62a45..97cb76aac9 100644
--- a/backends/events/default/default-events.h
+++ b/backends/events/default/default-events.h
@@ -67,6 +67,7 @@ public:
virtual bool pollEvent(Common::Event &event) override;
virtual void pushEvent(const Common::Event &event) override;
virtual void purgeMouseEvents() override;
+ virtual void purgeKeyboardEvents() override;
virtual Common::Point getMousePos() const override { return _mousePos; }
virtual int getButtonState() const override { return _buttonState; }
diff --git a/base/main.cpp b/base/main.cpp
index 722a75b5ca..09191fc3de 100644
--- a/base/main.cpp
+++ b/base/main.cpp
@@ -303,6 +303,10 @@ static Common::Error runGame(const Plugin *plugin, const Plugin *enginePlugin, O
// Inform backend that the engine is about to be run
system.engineInit();
+ // Purge queued input events that may remain from the GUI (such as key-up)
+ system.getEventManager()->purgeKeyboardEvents();
+ system.getEventManager()->purgeMouseEvents();
+
// Run the engine
Common::Error result = engine->run();
diff --git a/common/events.h b/common/events.h
index 6338817859..d6e9c2caa6 100644
--- a/common/events.h
+++ b/common/events.h
@@ -489,6 +489,11 @@ public:
*/
virtual void purgeMouseEvents() = 0;
+ /**
+ * Purge all unprocessed keyboard events already in the event queue.
+ */
+ virtual void purgeKeyboardEvents() = 0;
+
/** Return the current mouse position. */
virtual Point getMousePos() const = 0;
More information about the Scummvm-git-logs
mailing list