diff options
author | sluicebox | 2019-03-31 02:53:21 -0700 |
---|---|---|
committer | Filippos Karapetis | 2019-04-01 01:16:53 +0300 |
commit | 82ccce948aaafed2f8e847359ab87c1a4878c74b (patch) | |
tree | 3f1d2c81462045fb7682e9ebe69b9f0d415015e2 | |
parent | 423dcd0a0116aa05894cc816fa266173e705ae63 (diff) | |
download | scummvm-rg350-82ccce948aaafed2f8e847359ab87c1a4878c74b.tar.gz scummvm-rg350-82ccce948aaafed2f8e847359ab87c1a4878c74b.tar.bz2 scummvm-rg350-82ccce948aaafed2f8e847359ab87c1a4878c74b.zip |
SCI: Fix Mac icon bar event handling
Fix mouse presses falling through the icon bar in KQ6 and FPFP Mac
-rw-r--r-- | engines/sci/engine/kevent.cpp | 22 | ||||
-rw-r--r-- | engines/sci/graphics/maciconbar.cpp | 27 | ||||
-rw-r--r-- | engines/sci/graphics/maciconbar.h | 3 |
3 files changed, 29 insertions, 23 deletions
diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index 608e2e4ce9..df0e94fb8d 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -49,13 +49,6 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { SegManager *segMan = s->_segMan; Common::Point mousePos; - // For Mac games with an icon bar, handle possible icon bar events first - if (g_sci->hasMacIconBar()) { - reg_t iconObj = g_sci->_gfxMacIconBar->handleEvents(); - if (!iconObj.isNull()) - invokeSelector(s, iconObj, SELECTOR(select), argc, argv, 0, NULL); - } - // If there's a simkey pending, and the game wants a keyboard event, use the // simkey instead of a normal event // TODO: This does not really work as expected for keyup events, since the @@ -78,6 +71,21 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { curEvent = g_sci->getEventManager()->getSciEvent(mask); + // For Mac games with an icon bar, handle possible icon bar events first + if (g_sci->hasMacIconBar()) { + reg_t iconObj = NULL_REG; + if (g_sci->_gfxMacIconBar->handleEvents(curEvent, iconObj)) { + if (!iconObj.isNull()) { + invokeSelector(s, iconObj, SELECTOR(select), argc, argv, 0, NULL); + } + + // The mouse press event was handled by the mac icon bar so change + // its type to none so that generic event processing can continue + // without the mouse press being handled twice + curEvent.type = kSciEventNone; + } + } + if (g_sci->_guestAdditions->kGetEventHook()) { return NULL_REG; } diff --git a/engines/sci/graphics/maciconbar.cpp b/engines/sci/graphics/maciconbar.cpp index 9b645e485f..7b2b2a9754 100644 --- a/engines/sci/graphics/maciconbar.cpp +++ b/engines/sci/graphics/maciconbar.cpp @@ -24,7 +24,6 @@ #include "sci/engine/kernel.h" #include "sci/engine/selector.h" #include "sci/engine/state.h" -#include "sci/event.h" #include "sci/graphics/maciconbar.h" #include "sci/graphics/palette.h" #include "sci/graphics/screen.h" @@ -259,21 +258,17 @@ bool GfxMacIconBar::pointOnIcon(uint32 iconIndex, Common::Point point) { return _iconBarItems[iconIndex].rect.contains(point); } -reg_t GfxMacIconBar::handleEvents() { - // Peek event queue for a mouse button press +bool GfxMacIconBar::handleEvents(SciEvent evt, reg_t &iconObj) { EventManager *evtMgr = g_sci->getEventManager(); - SciEvent evt = evtMgr->getSciEvent(kSciEventMousePress | kSciEventPeek); + iconObj = NULL_REG; - // No mouse press found - if (evt.type == kSciEventNone) - return NULL_REG; + // Not a mouse press + if (evt.type != kSciEventMousePress) + return false; // If the mouse is not over the icon bar, return if (evt.mousePos.y < g_sci->_gfxScreen->getHeight()) - return NULL_REG; - - // Remove event from queue - evtMgr->getSciEvent(kSciEventMousePress); + return false; // Mouse press on the icon bar, check the icon rectangles uint iconNr; @@ -282,9 +277,10 @@ reg_t GfxMacIconBar::handleEvents() { break; } - // Mouse press not on an icon + // Mouse press on the icon bar but not on an enabled icon, + // return true to indicate that this mouse press was handled if (iconNr == _iconBarItems.size()) - return NULL_REG; + return true; drawIcon(iconNr, true); bool isSelected = true; @@ -305,9 +301,10 @@ reg_t GfxMacIconBar::handleEvents() { // If user moved away from the icon, we do nothing if (pointOnIcon(iconNr, evt.mousePos)) - return _iconBarItems[iconNr].object; + iconObj = _iconBarItems[iconNr].object; - return NULL_REG; + // The mouse press was handled + return true; } } // End of namespace Sci diff --git a/engines/sci/graphics/maciconbar.h b/engines/sci/graphics/maciconbar.h index 21d28dfc29..754da8bf50 100644 --- a/engines/sci/graphics/maciconbar.h +++ b/engines/sci/graphics/maciconbar.h @@ -26,6 +26,7 @@ #include "common/array.h" #include "sci/engine/vm.h" +#include "sci/event.h" namespace Graphics { struct Surface; @@ -42,7 +43,7 @@ public: void drawIcons(); void setIconEnabled(int16 index, bool enabled); void setInventoryIcon(int16 icon); - reg_t handleEvents(); + bool handleEvents(SciEvent evt, reg_t &iconObj); private: struct IconBarItem { |