[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