[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