aboutsummaryrefslogtreecommitdiff
path: root/engines/mohawk/riven_card.cpp
diff options
context:
space:
mode:
authorBastien Bouclet2016-08-09 20:06:03 +0200
committerEugene Sandulenko2017-07-03 08:50:10 +0200
commitab9b241e50a54384635f3bc35dbb775e0fa3a909 (patch)
tree9a193fff4aae380e7622e646bd17dbe292e1a059 /engines/mohawk/riven_card.cpp
parent9926475937ee5ed6137f747016a72a400e69d48b (diff)
downloadscummvm-rg350-ab9b241e50a54384635f3bc35dbb775e0fa3a909.tar.gz
scummvm-rg350-ab9b241e50a54384635f3bc35dbb775e0fa3a909.tar.bz2
scummvm-rg350-ab9b241e50a54384635f3bc35dbb775e0fa3a909.zip
MOHAWK: Card event handlers could be called recursively
Diffstat (limited to 'engines/mohawk/riven_card.cpp')
-rw-r--r--engines/mohawk/riven_card.cpp41
1 files changed, 27 insertions, 14 deletions
diff --git a/engines/mohawk/riven_card.cpp b/engines/mohawk/riven_card.cpp
index d064a1709a..0b3d96f981 100644
--- a/engines/mohawk/riven_card.cpp
+++ b/engines/mohawk/riven_card.cpp
@@ -349,8 +349,13 @@ void RivenCard::onMouseDown(const Common::Point &mouse) {
onMouseMove(mouse);
_pressedHotspot = _hoveredHotspot;
+
+ RivenScriptPtr script;
if (_pressedHotspot) {
- RivenScriptPtr script = _pressedHotspot->getScript(kMouseDownScript);
+ script = _pressedHotspot->getScript(kMouseDownScript);
+ }
+
+ if (script) {
_vm->_scriptMan->runScript(script, false);
}
}
@@ -358,31 +363,39 @@ void RivenCard::onMouseDown(const Common::Point &mouse) {
void RivenCard::onMouseUp(const Common::Point &mouse) {
onMouseMove(mouse);
+ RivenScriptPtr script;
if (_pressedHotspot && _pressedHotspot == _hoveredHotspot) {
- RivenScriptPtr script = _pressedHotspot->getScript(kMouseUpScript);
- _vm->_scriptMan->runScript(script, false);
+ script = _pressedHotspot->getScript(kMouseUpScript);
}
_pressedHotspot = nullptr;
+
+ if (script) {
+ _vm->_scriptMan->runScript(script, false);
+ }
}
void RivenCard::onMouseMove(const Common::Point &mouse) {
RivenHotspot *hotspot = getHotspotContainingPoint(mouse);
- if (hotspot) {
- if (hotspot != _hoveredHotspot) {
- if (_hoveredHotspot) {
- RivenScriptPtr script = _hoveredHotspot->getScript(kMouseLeaveScript);
- _vm->_scriptMan->runScript(script, false);
- }
+ RivenScriptPtr script = RivenScriptPtr(new RivenScript());
- _hoveredHotspot = hotspot;
- RivenScriptPtr script = _hoveredHotspot->getScript(kMouseEnterScript);
- _vm->_scriptMan->runScript(script, false);
- }
- } else {
+ // Detect hotspot exit
+ if (_hoveredHotspot && (!hotspot || hotspot != _hoveredHotspot)) {
+ script += _hoveredHotspot->getScript(kMouseLeaveScript);
+ }
+
+ // Detect hotspot entry
+ if (hotspot && hotspot != _hoveredHotspot) {
+ _hoveredHotspot = hotspot;
+ script += _hoveredHotspot->getScript(kMouseEnterScript);
+ }
+
+ if (!hotspot) {
_hoveredHotspot = nullptr;
}
+
+ _vm->_scriptMan->runScript(script, false);
}
void RivenCard::onMouseDragUpdate() {