diff --git a/graphics/macgui/macwindowmanager.cpp b/graphics/macgui/macwindowmanager.cpp index 3d333839b6b..ff32fb203ab 100644 --- a/graphics/macgui/macwindowmanager.cpp +++ b/graphics/macgui/macwindowmanager.cpp @@ -177,6 +177,8 @@ MacWindowManager::MacWindowManager(uint32 mode, MacPatterns *patterns, Common::L _menuDelay = 0; _menuTimerActive = false; + _activateScreenCopy = false; + _engineP = nullptr; _engineR = nullptr; _redrawEngineCallback = nullptr; @@ -447,14 +449,14 @@ void MacWindowManager::activateMenu() { return; if (_mode & kWMModalMenuMode) { - activateScreenCopy(); + _activateScreenCopy = true; } _menu->setVisible(true); } void MacWindowManager::activateScreenCopy() { - Common::StackLock lock(_mutex); + // This is only called when the _mutex is already held if (_screen) { if (!_screenCopy) @@ -472,6 +474,12 @@ void MacWindowManager::activateScreenCopy() { g_system->unlockScreen(); } + if (_screenCopyPauseToken) { + warning("MacWindowManager::activateScreenCopy: Unpausing engine"); + _screenCopyPauseToken->clear(); + delete _screenCopyPauseToken; + } + _screenCopyPauseToken = new PauseToken(pauseEngine()); } @@ -897,6 +905,11 @@ void MacWindowManager::drawDesktop() { void MacWindowManager::draw() { Common::StackLock lock(_mutex); + if (_activateScreenCopy) { + _activateScreenCopy = false; + activateScreenCopy(); + } + removeMarked(); Common::Rect bounds = getScreenBounds(); @@ -1022,6 +1035,8 @@ void MacWindowManager::draw() { static void menuTimerHandler(void *refCon) { MacWindowManager *wm = (MacWindowManager *)refCon; + Common::StackLock lock(*(wm->mutex())); + if (wm->_menuHotzone.contains(wm->_lastMousePos)) { wm->activateMenu(); } diff --git a/graphics/macgui/macwindowmanager.h b/graphics/macgui/macwindowmanager.h index 22a128c77a0..0abf472f6db 100644 --- a/graphics/macgui/macwindowmanager.h +++ b/graphics/macgui/macwindowmanager.h @@ -434,6 +434,8 @@ public: ManagedSurface *_screenCopy; Common::Rect _screenDims; + Common::Mutex *mutex() { return &_mutex; } + private: Common::Mutex _mutex; Common::List _windowStack; @@ -457,6 +459,8 @@ private: MacMenu *_menu; uint32 _menuDelay; + bool _activateScreenCopy; + Engine *_engineP; void *_engineR; void (*_redrawEngineCallback)(void *engine);