[Scummvm-git-logs] scummvm master -> cb3a024589e6acc98d606c794f7aa384565feaa6
sev-
noreply at scummvm.org
Sat Jun 18 21:13:20 UTC 2022
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:
cb3a024589 COMMON: Allow registering multiple event mappers
Commit: cb3a024589e6acc98d606c794f7aa384565feaa6
https://github.com/scummvm/scummvm/commit/cb3a024589e6acc98d606c794f7aa384565feaa6
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2022-06-18T23:13:17+02:00
Commit Message:
COMMON: Allow registering multiple event mappers
Changed paths:
backends/events/default/default-events.cpp
backends/keymapper/keymapper.cpp
backends/keymapper/keymapper.h
common/events.cpp
common/events.h
diff --git a/backends/events/default/default-events.cpp b/backends/events/default/default-events.cpp
index 0c44318fb9f..f23a54bb53e 100644
--- a/backends/events/default/default-events.cpp
+++ b/backends/events/default/default-events.cpp
@@ -57,7 +57,7 @@ DefaultEventManager::DefaultEventManager(Common::EventSource *boss) :
_virtualMouse = new Common::VirtualMouse(&_dispatcher);
_keymapper = new Common::Keymapper(this);
- _dispatcher.registerMapper(_keymapper);
+ _dispatcher.registerMapper(_keymapper, true);
}
DefaultEventManager::~DefaultEventManager() {
@@ -65,7 +65,6 @@ DefaultEventManager::~DefaultEventManager() {
#ifdef ENABLE_VKEYBD
delete _vk;
#endif
- delete _keymapper;
}
void DefaultEventManager::init() {
diff --git a/backends/keymapper/keymapper.cpp b/backends/keymapper/keymapper.cpp
index 6b6ecba1917..1a81c09538c 100644
--- a/backends/keymapper/keymapper.cpp
+++ b/backends/keymapper/keymapper.cpp
@@ -160,11 +160,9 @@ void Keymapper::setEnabledKeymapType(Keymap::KeymapType type) {
_enabledKeymapType = type;
}
-List<Event> Keymapper::mapEvent(const Event &ev) {
+bool Keymapper::mapEvent(const Event &ev, List<Event> &mappedEvents) {
if (!_enabled) {
- List<Event> originalEvent;
- originalEvent.push_back(ev);
- return originalEvent;
+ return false;
}
hardcodedEventMapping(ev);
@@ -183,7 +181,6 @@ List<Event> Keymapper::mapEvent(const Event &ev) {
}
bool matchedAction = !actions.empty();
- List<Event> mappedEvents;
for (Keymap::ActionArray::const_iterator it = actions.begin(); it != actions.end(); it++) {
Event mappedEvent = executeAction(*it, ev);
if (mappedEvent.type == EVENT_INVALID) {
@@ -213,12 +210,7 @@ List<Event> Keymapper::mapEvent(const Event &ev) {
}
}
- if (!matchedAction) {
- // if it didn't get mapped, just pass it through
- mappedEvents.push_back(ev);
- }
-
- return mappedEvents;
+ return matchedAction;
}
Keymap::KeymapMatch Keymapper::getMappedActions(const Event &event, Keymap::ActionArray &actions, Keymap::KeymapType keymapType) const {
diff --git a/backends/keymapper/keymapper.h b/backends/keymapper/keymapper.h
index e0cff42303b..4debfb447ae 100644
--- a/backends/keymapper/keymapper.h
+++ b/backends/keymapper/keymapper.h
@@ -48,7 +48,7 @@ public:
~Keymapper();
// EventMapper interface
- virtual List<Event> mapEvent(const Event &ev);
+ virtual bool mapEvent(const Event &ev, List<Event> &mappedEvents);
/**
* Registers a HardwareInputSet and platform-specific default mappings with the Keymapper
diff --git a/common/events.cpp b/common/events.cpp
index 8634d098811..fea50e195b9 100644
--- a/common/events.cpp
+++ b/common/events.cpp
@@ -49,10 +49,15 @@ EventMapper::~EventMapper() {}
EventManager::~EventManager() {}
-EventDispatcher::EventDispatcher() : _mapper(nullptr) {
+EventDispatcher::EventDispatcher() {
}
EventDispatcher::~EventDispatcher() {
+ for (List<MapperEntry>::iterator i = _mappers.begin(); i != _mappers.end(); ++i) {
+ if (i->autoFree)
+ delete i->mapper;
+ }
+
for (List<SourceEntry>::iterator i = _sources.begin(); i != _sources.end(); ++i) {
if (i->autoFree)
delete i->source;
@@ -76,7 +81,7 @@ void EventDispatcher::dispatch() {
// We only try to process the events via the setup event mapper, when
// we have a setup mapper and when the event source allows mapping.
if (i->source->allowMapping()) {
- assert(_mapper);
+ bool matchedAction = false;
// Backends may not produce directly action event types, those are meant
// to be the output of the event mapper.
@@ -85,13 +90,21 @@ void EventDispatcher::dispatch() {
assert(event.type != EVENT_CUSTOM_ENGINE_ACTION_START);
assert(event.type != EVENT_CUSTOM_ENGINE_ACTION_END);
+ for (List<MapperEntry>::iterator m = _mappers.begin(); m != _mappers.end(); ++m) {
+ List<Event> mappedEvents;
+ if (!m->mapper->mapEvent(event, mappedEvents))
+ continue;
- List<Event> mappedEvents = _mapper->mapEvent(event);
+ for (List<Event>::iterator j = mappedEvents.begin(); j != mappedEvents.end(); ++j) {
+ const Event mappedEvent = *j;
+ dispatchEvent(mappedEvent);
+ }
- for (List<Event>::iterator j = mappedEvents.begin(); j != mappedEvents.end(); ++j) {
- const Event mappedEvent = *j;
- dispatchEvent(mappedEvent);
+ matchedAction = true;
}
+
+ if (!matchedAction);
+ dispatchEvent(event);
} else {
dispatchEvent(event);
}
@@ -109,11 +122,27 @@ void EventDispatcher::clearEvents() {
}
}
+void EventDispatcher::registerMapper(EventMapper *mapper, bool autoFree) {
+ MapperEntry newEntry;
+
+ newEntry.mapper = mapper;
+ newEntry.autoFree = autoFree;
+ newEntry.ignore = false;
-void EventDispatcher::registerMapper(EventMapper *mapper) {
- _mapper = mapper;
+ _mappers.push_back(newEntry);
}
+void EventDispatcher::unregisterMapper(EventMapper *mapper) {
+ for (List<MapperEntry>::iterator i = _mappers.begin(); i != _mappers.end(); ++i) {
+ if (i->mapper == mapper) {
+ if (i->autoFree)
+ delete mapper;
+
+ _mappers.erase(i);
+ return;
+ }
+ }
+}
void EventDispatcher::registerSource(EventSource *source, bool autoFree) {
SourceEntry newEntry;
diff --git a/common/events.h b/common/events.h
index 2714f3053d3..b9dab2888a0 100644
--- a/common/events.h
+++ b/common/events.h
@@ -348,7 +348,7 @@ public:
/**
* Map an incoming event to one or more action events.
*/
- virtual List<Event> mapEvent(const Event &ev) = 0;
+ virtual bool mapEvent(const Event &ev, List<Event> &mappedEvents) = 0;
};
/**
@@ -384,9 +384,16 @@ public:
void clearEvents();
/**
- * Register an event mapper with the dispatcher.
+ * Register a new EventMapper with the dispatcher.
*/
- void registerMapper(EventMapper *mapper);
+ void registerMapper(EventMapper *mapper, bool autoFree);
+
+ /**
+ * Unregister an EventMapper.
+ *
+ * This takes the "autoFree" flag passed to registerSource into account.
+ */
+ void unregisterMapper(EventMapper *mapper);
/**
* Register a new EventSource with the Dispatcher.
@@ -421,13 +428,17 @@ public:
*/
void unregisterObserver(EventObserver *obs);
private:
- EventMapper *_mapper;
-
struct Entry {
bool autoFree;
bool ignore;
};
+ struct MapperEntry : public Entry {
+ EventMapper *mapper;
+ };
+
+ List<MapperEntry> _mappers;
+
struct SourceEntry : public Entry {
EventSource *source;
};
More information about the Scummvm-git-logs
mailing list