[Scummvm-git-logs] scummvm master -> 690562b1b1c92d6232172efa82d2b16131611329

djsrv dservilla at gmail.com
Wed Aug 18 01:24:21 UTC 2021


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
ebbb82c683 DIRECTOR: Remove getEventCount()
690562b1b1 DIRECTOR: Use separate queues for user and non-user events


Commit: ebbb82c6837b86b9cf0c94adbd8352f4c0df9b26
    https://github.com/scummvm/scummvm/commit/ebbb82c6837b86b9cf0c94adbd8352f4c0df9b26
Author: djsrv (dservilla at gmail.com)
Date: 2021-08-17T20:40:18-04:00

Commit Message:
DIRECTOR: Remove getEventCount()

Changed paths:
    engines/director/lingo/lingo-events.cpp
    engines/director/movie.h


diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 1bef9acf52..49da7bc6e6 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -102,10 +102,6 @@ ScriptType Lingo::event2script(LEvent ev) {
 	return kNoneScript;
 }
 
-int Movie::getEventCount() {
-	return _eventQueue.size();
-}
-
 void Movie::setPrimaryEventHandler(LEvent event, const Common::String &code) {
 	debugC(3, kDebugLingoExec, "setting primary event handler (%s)", _lingo->_eventHandlerTypes[event]);
 	LingoArchive *mainArchive = getMainLingoArch();
diff --git a/engines/director/movie.h b/engines/director/movie.h
index 4ff96f515b..a57fce441e 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -117,7 +117,6 @@ public:
 
 	// lingo/lingo-events.cpp
 	void setPrimaryEventHandler(LEvent event, const Common::String &code);
-	int getEventCount();
 	void processEvent(LEvent event, int targetId = 0);
 	void registerEvent(LEvent event, int targetId = 0);
 


Commit: 690562b1b1c92d6232172efa82d2b16131611329
    https://github.com/scummvm/scummvm/commit/690562b1b1c92d6232172efa82d2b16131611329
Author: djsrv (dservilla at gmail.com)
Date: 2021-08-17T21:16:52-04:00

Commit Message:
DIRECTOR: Use separate queues for user and non-user events

We don't want to immediately process user events when processing another
non-user event.
Fixes https://trello.com/c/wtRV31SE/451-journeyman-execution-order

Changed paths:
    engines/director/events.cpp
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-events.cpp
    engines/director/lingo/lingo.h
    engines/director/movie.h
    engines/director/score.cpp


diff --git a/engines/director/events.cpp b/engines/director/events.cpp
index 29cb554517..0f485a57a4 100644
--- a/engines/director/events.cpp
+++ b/engines/director/events.cpp
@@ -187,7 +187,7 @@ bool Movie::processEvent(Common::Event &event) {
 				_lastTimeOut = _lastEventTime;
 
 			debugC(3, kDebugEvents, "event: Button Down @(%d, %d), movie '%s', sprite id: %d", pos.x, pos.y, _macName.c_str(), spriteId);
-			registerEvent(kEventMouseDown, spriteId);
+			queueUserEvent(kEventMouseDown, spriteId);
 
 			if (sc->_channels[spriteId]->_sprite->_moveable) {
 				_draggingSpritePos = _window->getMousePos();
@@ -217,7 +217,7 @@ bool Movie::processEvent(Common::Event &event) {
 				cast->_hilite = !cast->_hilite;
 		}
 
-		registerEvent(kEventMouseUp, _currentHandlingChannelId);
+		queueUserEvent(kEventMouseUp, _currentHandlingChannelId);
 		sc->renderCursor(pos);
 
 		_currentHiliteChannelId = 0;
@@ -236,7 +236,7 @@ bool Movie::processEvent(Common::Event &event) {
 		if (_timeOutKeyDown)
 			_lastTimeOut = _lastEventTime;
 
-		registerEvent(kEventKeyDown);
+		queueUserEvent(kEventKeyDown);
 		return true;
 
 	case Common::EVENT_KEYUP:
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 932878fe8d..a5a2b5d1e9 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1753,7 +1753,7 @@ void LB::b_importFileInto(int nargs) {
 }
 
 void menuCommandsCallback(int action, Common::String &text, void *data) {
-	g_director->getCurrentMovie()->registerEvent(kEventMenuCallback, action);
+	g_director->getCurrentMovie()->queueUserEvent(kEventMenuCallback, action);
 }
 
 void LB::b_installMenu(int nargs) {
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 49da7bc6e6..206189e927 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -109,7 +109,7 @@ void Movie::setPrimaryEventHandler(LEvent event, const Common::String &code) {
 	mainArchive->addCode(code, kEventScript, event);
 }
 
-void Movie::queueSpriteEvent(LEvent event, int eventId, int spriteId) {
+void Movie::queueSpriteEvent(Common::Queue<LingoEvent> &queue, LEvent event, int eventId, int spriteId) {
 	/* When the mouseDown or mouseUp occurs over a sprite, the message
 	 * goes first to the sprite script, then to the script of the cast
 	 * member, to the frame script and finally to the movie scripts.
@@ -132,9 +132,9 @@ void Movie::queueSpriteEvent(LEvent event, int eventId, int spriteId) {
 			// If sprite is immediate, its script is run on mouseDown, otherwise on mouseUp
 			if (((event == kEventMouseDown && sprite->_immediate) || (event == kEventMouseUp && !sprite->_immediate))
 					&& script->_eventHandlers.contains(kEventGeneric)) {
-				_eventQueue.push(LingoEvent(kEventGeneric, eventId, kScoreScript, sprite->_scriptId, false, spriteId));
+				queue.push(LingoEvent(kEventGeneric, eventId, kScoreScript, sprite->_scriptId, false, spriteId));
 			} else if (script->_eventHandlers.contains(event)) {
-				_eventQueue.push(LingoEvent(event, eventId, kScoreScript, sprite->_scriptId, false, spriteId));
+				queue.push(LingoEvent(event, eventId, kScoreScript, sprite->_scriptId, false, spriteId));
 			}
 		}
 	}
@@ -142,11 +142,11 @@ void Movie::queueSpriteEvent(LEvent event, int eventId, int spriteId) {
 	// Cast script
 	ScriptContext *script = getScriptContext(kCastScript, sprite->_castId);
 	if (script && script->_eventHandlers.contains(event)) {
-		_eventQueue.push(LingoEvent(event, eventId, kCastScript, sprite->_castId, false, spriteId));
+		queue.push(LingoEvent(event, eventId, kCastScript, sprite->_castId, false, spriteId));
 	}
 }
 
-void Movie::queueFrameEvent(LEvent event, int eventId) {
+void Movie::queueFrameEvent(Common::Queue<LingoEvent> &queue, LEvent event, int eventId) {
 	/* [in D4] the enterFrame, exitFrame, idle and timeout messages
 	 * are sent to a frame script and then a movie script.	If the
 	 * current frame has no frame script when the event occurs, the
@@ -168,13 +168,13 @@ void Movie::queueFrameEvent(LEvent event, int eventId) {
 		return;
 
 	if (event == kEventEnterFrame && script->_eventHandlers.contains(kEventGeneric)) {
-		_eventQueue.push(LingoEvent(kEventGeneric, eventId, kScoreScript, scriptId, false, 0));
+		queue.push(LingoEvent(kEventGeneric, eventId, kScoreScript, scriptId, false, 0));
 	} else if (script->_eventHandlers.contains(event)) {
-		_eventQueue.push(LingoEvent(event, eventId, kScoreScript, scriptId, false, 0));
+		queue.push(LingoEvent(event, eventId, kScoreScript, scriptId, false, 0));
 	}
 }
 
-void Movie::queueMovieEvent(LEvent event, int eventId) {
+void Movie::queueMovieEvent(Common::Queue<LingoEvent> &queue, LEvent event, int eventId) {
 	/* If more than one movie script handles the same message, Lingo
 	 * searches the movie scripts according to their order in the cast
 	 * window [p.81 of D4 docs]
@@ -185,7 +185,7 @@ void Movie::queueMovieEvent(LEvent event, int eventId) {
 	for (ScriptContextHash::iterator it = mainArchive->scriptContexts[kMovieScript].begin();
 			it != mainArchive->scriptContexts[kMovieScript].end(); ++it) {
 		if (it->_value->_eventHandlers.contains(event)) {
-			_eventQueue.push(LingoEvent(event, eventId, kMovieScript, CastMemberID(it->_key, 0), false));
+			queue.push(LingoEvent(event, eventId, kMovieScript, CastMemberID(it->_key, 0), false));
 			return;
 		}
 	}
@@ -194,19 +194,19 @@ void Movie::queueMovieEvent(LEvent event, int eventId) {
 		for (ScriptContextHash::iterator it = sharedArchive->scriptContexts[kMovieScript].begin();
 				it != sharedArchive->scriptContexts[kMovieScript].end(); ++it) {
 			if (it->_value->_eventHandlers.contains(event)) {
-				_eventQueue.push(LingoEvent(event, eventId, kMovieScript, CastMemberID(it->_key, 0), false));
+				queue.push(LingoEvent(event, eventId, kMovieScript, CastMemberID(it->_key, 0), false));
 				return;
 			}
 		}
 	}
 }
 
-void Movie::registerEvent(LEvent event, int targetId) {
+void Movie::queueEvent(Common::Queue<LingoEvent> &queue, LEvent event, int targetId) {
 	int eventId = _nextEventId++;
 	if (_nextEventId < 0)
 		_nextEventId = 0;
 
-	int oldQueueSize = _eventQueue.size();
+	int oldQueueSize = queue.size();
 
 	/* When an event occurs the message [...] is first sent to a
 	 * primary event handler: [... if exists it is executed] and the
@@ -228,7 +228,7 @@ void Movie::registerEvent(LEvent event, int targetId) {
 		{
 			CastMemberID scriptID = CastMemberID(event, 0);
 			if (getScriptContext(kEventScript, scriptID)) {
-				_eventQueue.push(LingoEvent(kEventGeneric, eventId, kEventScript, scriptID, true));
+				queue.push(LingoEvent(kEventGeneric, eventId, kEventScript, scriptID, true));
 			}
 		}
 		break;
@@ -236,7 +236,7 @@ void Movie::registerEvent(LEvent event, int targetId) {
 		{
 			CastMemberID scriptID = CastMemberID(targetId, 0);
 			if (getScriptContext(kEventScript, scriptID)) {
-				_eventQueue.push(LingoEvent(kEventGeneric, eventId, kEventScript, scriptID, true));
+				queue.push(LingoEvent(kEventGeneric, eventId, kEventScript, scriptID, true));
 			}
 		}
 		break;
@@ -250,12 +250,12 @@ void Movie::registerEvent(LEvent event, int targetId) {
 		case kEventMouseUp:
 		case kEventMouseDown:
 			if (targetId) {
-				queueSpriteEvent(event, eventId, targetId);
+				queueSpriteEvent(queue, event, eventId, targetId);
 			}
 			break;
 
 		case kEventEnterFrame:
-			queueFrameEvent(event, eventId);
+			queueFrameEvent(queue, event, eventId);
 			break;
 
 		case kEventIdle:
@@ -263,7 +263,7 @@ void Movie::registerEvent(LEvent event, int targetId) {
 		case kEventStartMovie:
 		case kEventStepMovie:
 		case kEventStopMovie:
-			queueMovieEvent(event, eventId);
+			queueMovieEvent(queue, event, eventId);
 			break;
 
 		default:
@@ -282,7 +282,7 @@ void Movie::registerEvent(LEvent event, int targetId) {
 		case kEventMouseDown:
 		case kEventBeginSprite:
 			if (targetId) {
-				queueSpriteEvent(event, eventId, targetId);
+				queueSpriteEvent(queue, event, eventId, targetId);
 			}
 			// fall through
 
@@ -290,7 +290,7 @@ void Movie::registerEvent(LEvent event, int targetId) {
 		case kEventEnterFrame:
 		case kEventExitFrame:
 		case kEventTimeout:
-			queueFrameEvent(event, eventId);
+			queueFrameEvent(queue, event, eventId);
 			// fall through
 
 		case kEventStartUp:
@@ -298,7 +298,7 @@ void Movie::registerEvent(LEvent event, int targetId) {
 		case kEventStepMovie:
 		case kEventStopMovie:
 		case kEventPrepareMovie:
-			queueMovieEvent(event, eventId);
+			queueMovieEvent(queue, event, eventId);
 			break;
 
 		default:
@@ -306,28 +306,29 @@ void Movie::registerEvent(LEvent event, int targetId) {
 		}
 	}
 
-	if (oldQueueSize == _eventQueue.size()) {
-		debugC(9, kDebugEvents, "Lingo::registerEvent(%s): no event handler", _lingo->_eventHandlerTypes[event]);
+	if (oldQueueSize == queue.size()) {
+		debugC(9, kDebugEvents, "Lingo::queueEvent(%s): no event handler", _lingo->_eventHandlerTypes[event]);
 	}
 }
 
+void Movie::queueUserEvent(LEvent event, int targetId) {
+	queueEvent(_userEventQueue, event, targetId);
+}
+
 void Movie::processEvent(LEvent event, int targetId) {
-	registerEvent(event, targetId);
+	Common::Queue<LingoEvent> queue;
+	queueEvent(queue, event, targetId);
 	_vm->setCurrentMovie(this);
-	_lingo->processEvents();
+	_lingo->processEvents(queue);
 }
 
-void Lingo::processEvents() {
+void Lingo::processEvents(Common::Queue<LingoEvent> &queue) {
 	int lastEventId = -1;
-	Window *window = _vm->getCurrentWindow();
 	Movie *movie = _vm->getCurrentMovie();
 	Score *sc = movie->getScore();
 
-	if (_vm->getVersion() >= 300 && !window->_newMovieStarted && sc->_playState != kPlayStopped && movie->_eventQueue.empty())
-		movie->registerEvent(kEventIdle);
-
-	while (!movie->_eventQueue.empty()) {
-		LingoEvent el = movie->_eventQueue.pop();
+	while (!queue.empty()) {
+		LingoEvent el = queue.pop();
 
 		if (sc->_playState == kPlayStopped && el.event != kEventStopMovie)
 			continue;
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 99510fba52..62c18b6bb0 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -26,6 +26,7 @@
 #include "common/hash-ptr.h"
 #include "common/hash-str.h"
 #include "common/str-array.h"
+#include "common/queue.h"
 #include "common/rect.h"
 
 #include "director/types.h"
@@ -310,7 +311,7 @@ public:
 	ScriptType event2script(LEvent ev);
 	Symbol getHandler(const Common::String &name);
 
-	void processEvents();
+	void processEvents(Common::Queue<LingoEvent> &queue);
 
 public:
 	void execute();
diff --git a/engines/director/movie.h b/engines/director/movie.h
index a57fce441e..510469ec29 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -118,14 +118,15 @@ public:
 	// lingo/lingo-events.cpp
 	void setPrimaryEventHandler(LEvent event, const Common::String &code);
 	void processEvent(LEvent event, int targetId = 0);
-	void registerEvent(LEvent event, int targetId = 0);
+	void queueUserEvent(LEvent event, int targetId = 0);
 
 private:
 	void loadFileInfo(Common::SeekableReadStreamEndian &stream);
 
-	void queueSpriteEvent(LEvent event, int eventId, int spriteId);
-	void queueFrameEvent(LEvent event, int eventId);
-	void queueMovieEvent(LEvent event, int eventId);
+	void queueEvent(Common::Queue<LingoEvent> &queue, LEvent event, int targetId = 0);
+	void queueSpriteEvent(Common::Queue<LingoEvent> &queue, LEvent event, int eventId, int spriteId);
+	void queueFrameEvent(Common::Queue<LingoEvent> &queue, LEvent event, int eventId);
+	void queueMovieEvent(Common::Queue<LingoEvent> &queue, LEvent event, int eventId);
 
 public:
 	Archive *_movieArchive;
@@ -147,7 +148,7 @@ public:
 	bool _videoPlayback;
 
 	int _nextEventId;
-	Common::Queue<LingoEvent> _eventQueue;
+	Common::Queue<LingoEvent> _userEventQueue;
 
 	unsigned char _key;
 	int _keyCode;
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 1906234fba..cffc65f790 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -278,7 +278,11 @@ void Score::step() {
 	if (_playState == kPlayStopped)
 		return;
 
-	_lingo->processEvents();
+	if (!_movie->_userEventQueue.empty()) {
+		_lingo->processEvents(_movie->_userEventQueue);
+	} else if (_vm->getVersion() >= 300 && !_window->_newMovieStarted && _playState != kPlayStopped) {
+		_movie->processEvent(kEventIdle);
+	}
 
 	update();
 




More information about the Scummvm-git-logs mailing list