aboutsummaryrefslogtreecommitdiff
path: root/engines/sherlock/events.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sherlock/events.cpp')
-rw-r--r--engines/sherlock/events.cpp34
1 files changed, 24 insertions, 10 deletions
diff --git a/engines/sherlock/events.cpp b/engines/sherlock/events.cpp
index c6c013193c..b2d9fc65e8 100644
--- a/engines/sherlock/events.cpp
+++ b/engines/sherlock/events.cpp
@@ -166,18 +166,32 @@ void EventsManager::wait(int numFrames) {
}
bool EventsManager::delay(uint32 time, bool interruptable) {
- uint32 delayEnd = g_system->getMillis() + time;
-
- while (!_vm->shouldQuit() && g_system->getMillis() < delayEnd) {
- pollEventsAndWait();
-
- if (interruptable && (isKeyPressed() || _mouseClicked)) {
- clearEvents();
- return false;
+ // Different handling for really short versus extended times
+ if (time < 10) {
+ // For really short periods, simply delay by the desired amount
+ pollEvents();
+ g_system->delayMillis(time);
+ bool result = !(interruptable && (isKeyPressed() || _mouseClicked));
+
+ clearEvents();
+ return result;
+ } else {
+ // For long periods go into a loop where we delay by 10ms at a time and then
+ // check for events. This ensures for longer delays that responsiveness is
+ // maintained
+ uint32 delayEnd = g_system->getMillis() + time;
+
+ while (!_vm->shouldQuit() && g_system->getMillis() < delayEnd) {
+ pollEventsAndWait();
+
+ if (interruptable && (isKeyPressed() || _mouseClicked)) {
+ clearEvents();
+ return false;
+ }
}
- }
- return true;
+ return true;
+ }
}
/**