aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2017-07-17 19:39:50 -0400
committerPaul Gilbert2017-07-17 19:39:50 -0400
commite8e7266214b43e302c5ba0bfd601b79a508e04cd (patch)
treebc6097dad57b87afb6dc259541c4f0ce5b4e5edf
parent06e1445fd1b304e97c419b2782f14f48f5e10387 (diff)
downloadscummvm-rg350-e8e7266214b43e302c5ba0bfd601b79a508e04cd.tar.gz
scummvm-rg350-e8e7266214b43e302c5ba0bfd601b79a508e04cd.tar.bz2
scummvm-rg350-e8e7266214b43e302c5ba0bfd601b79a508e04cd.zip
TITANIC: Improve performance of event handling
-rw-r--r--engines/titanic/events.cpp116
1 files changed, 63 insertions, 53 deletions
diff --git a/engines/titanic/events.cpp b/engines/titanic/events.cpp
index 0d0fcaf753..cb46f8c42b 100644
--- a/engines/titanic/events.cpp
+++ b/engines/titanic/events.cpp
@@ -34,66 +34,76 @@ Events::Events(TitanicEngine *vm): _vm(vm), _frameCounter(1),
_totalFrames(0), _priorFrameTime(0), _specialButtons(0) {
}
+#define MOVE_CHECK if (moved) eventTarget()->mouseMove(_mousePos)
+
void Events::pollEvents() {
checkForNextFrameCounter();
+ bool moved = false;
Common::Event event;
- if (!g_system->getEventManager()->pollEvent(event))
- return;
-
- switch (event.type) {
- case Common::EVENT_MOUSEMOVE:
- _mousePos = event.mouse;
- eventTarget()->mouseMove(_mousePos);
- break;
- case Common::EVENT_LBUTTONDOWN:
- _specialButtons |= MK_LBUTTON;
- _mousePos = event.mouse;
- eventTarget()->leftButtonDown(_mousePos);
- break;
- case Common::EVENT_LBUTTONUP:
- _specialButtons &= ~MK_LBUTTON;
- _mousePos = event.mouse;
- eventTarget()->leftButtonUp(_mousePos);
- break;
- case Common::EVENT_MBUTTONDOWN:
- _specialButtons |= MK_MBUTTON;
- _mousePos = event.mouse;
- eventTarget()->middleButtonDown(_mousePos);
- break;
- case Common::EVENT_MBUTTONUP:
- _specialButtons &= ~MK_MBUTTON;
- _mousePos = event.mouse;
- eventTarget()->middleButtonUp(_mousePos);
- break;
- case Common::EVENT_RBUTTONDOWN:
- _specialButtons |= MK_RBUTTON;
- _mousePos = event.mouse;
- eventTarget()->rightButtonDown(_mousePos);
- break;
- case Common::EVENT_RBUTTONUP:
- _specialButtons &= ~MK_RBUTTON;
- _mousePos = event.mouse;
- eventTarget()->rightButtonUp(_mousePos);
- break;
- case Common::EVENT_WHEELUP:
- case Common::EVENT_WHEELDOWN:
- _mousePos = event.mouse;
- eventTarget()->mouseWheel(_mousePos, event.type == Common::EVENT_WHEELUP);
- break;
- case Common::EVENT_KEYDOWN:
- handleKbdSpecial(event.kbd);
- eventTarget()->keyDown(event.kbd);
- break;
- case Common::EVENT_KEYUP:
- handleKbdSpecial(event.kbd);
- eventTarget()->keyUp(event.kbd);
- break;
- default:
- break;
+ while (!_vm->shouldQuit() && g_system->getEventManager()->pollEvent(event)) {
+ if (event.type != Common::EVENT_MOUSEMOVE) {
+ MOVE_CHECK;
+ }
+
+ switch (event.type) {
+ case Common::EVENT_MOUSEMOVE:
+ _mousePos = event.mouse;
+ moved = true;
+ break;
+ case Common::EVENT_LBUTTONDOWN:
+ _specialButtons |= MK_LBUTTON;
+ _mousePos = event.mouse;
+ eventTarget()->leftButtonDown(_mousePos);
+ return;
+ case Common::EVENT_LBUTTONUP:
+ _specialButtons &= ~MK_LBUTTON;
+ _mousePos = event.mouse;
+ eventTarget()->leftButtonUp(_mousePos);
+ return;
+ case Common::EVENT_MBUTTONDOWN:
+ _specialButtons |= MK_MBUTTON;
+ _mousePos = event.mouse;
+ eventTarget()->middleButtonDown(_mousePos);
+ return;
+ case Common::EVENT_MBUTTONUP:
+ _specialButtons &= ~MK_MBUTTON;
+ _mousePos = event.mouse;
+ eventTarget()->middleButtonUp(_mousePos);
+ return;
+ case Common::EVENT_RBUTTONDOWN:
+ _specialButtons |= MK_RBUTTON;
+ _mousePos = event.mouse;
+ eventTarget()->rightButtonDown(_mousePos);
+ return;
+ case Common::EVENT_RBUTTONUP:
+ _specialButtons &= ~MK_RBUTTON;
+ _mousePos = event.mouse;
+ eventTarget()->rightButtonUp(_mousePos);
+ return;
+ case Common::EVENT_WHEELUP:
+ case Common::EVENT_WHEELDOWN:
+ _mousePos = event.mouse;
+ eventTarget()->mouseWheel(_mousePos, event.type == Common::EVENT_WHEELUP);
+ return;
+ case Common::EVENT_KEYDOWN:
+ handleKbdSpecial(event.kbd);
+ eventTarget()->keyDown(event.kbd);
+ return;
+ case Common::EVENT_KEYUP:
+ handleKbdSpecial(event.kbd);
+ eventTarget()->keyUp(event.kbd);
+ return;
+ default:
+ break;
+ }
}
+
+ MOVE_CHECK;
}
+#undef MOVE_CHECK
+
void Events::pollEventsAndWait() {
pollEvents();
g_system->delayMillis(10);