1 | diff --git a/graphics/macgui/macwindowmanager.cpp b/graphics/macgui/macwindowmanager.cpp
|
---|
2 | index 3d333839b6b..ff32fb203ab 100644
|
---|
3 | --- a/graphics/macgui/macwindowmanager.cpp
|
---|
4 | +++ b/graphics/macgui/macwindowmanager.cpp
|
---|
5 | @@ -177,6 +177,8 @@ MacWindowManager::MacWindowManager(uint32 mode, MacPatterns *patterns, Common::L
|
---|
6 | _menuDelay = 0;
|
---|
7 | _menuTimerActive = false;
|
---|
8 |
|
---|
9 | + _activateScreenCopy = false;
|
---|
10 | +
|
---|
11 | _engineP = nullptr;
|
---|
12 | _engineR = nullptr;
|
---|
13 | _redrawEngineCallback = nullptr;
|
---|
14 | @@ -447,14 +449,14 @@ void MacWindowManager::activateMenu() {
|
---|
15 | return;
|
---|
16 |
|
---|
17 | if (_mode & kWMModalMenuMode) {
|
---|
18 | - activateScreenCopy();
|
---|
19 | + _activateScreenCopy = true;
|
---|
20 | }
|
---|
21 |
|
---|
22 | _menu->setVisible(true);
|
---|
23 | }
|
---|
24 |
|
---|
25 | void MacWindowManager::activateScreenCopy() {
|
---|
26 | - Common::StackLock lock(_mutex);
|
---|
27 | + // This is only called when the _mutex is already held
|
---|
28 |
|
---|
29 | if (_screen) {
|
---|
30 | if (!_screenCopy)
|
---|
31 | @@ -472,6 +474,12 @@ void MacWindowManager::activateScreenCopy() {
|
---|
32 | g_system->unlockScreen();
|
---|
33 | }
|
---|
34 |
|
---|
35 | + if (_screenCopyPauseToken) {
|
---|
36 | + warning("MacWindowManager::activateScreenCopy: Unpausing engine");
|
---|
37 | + _screenCopyPauseToken->clear();
|
---|
38 | + delete _screenCopyPauseToken;
|
---|
39 | + }
|
---|
40 | +
|
---|
41 | _screenCopyPauseToken = new PauseToken(pauseEngine());
|
---|
42 | }
|
---|
43 |
|
---|
44 | @@ -897,6 +905,11 @@ void MacWindowManager::drawDesktop() {
|
---|
45 | void MacWindowManager::draw() {
|
---|
46 | Common::StackLock lock(_mutex);
|
---|
47 |
|
---|
48 | + if (_activateScreenCopy) {
|
---|
49 | + _activateScreenCopy = false;
|
---|
50 | + activateScreenCopy();
|
---|
51 | + }
|
---|
52 | +
|
---|
53 | removeMarked();
|
---|
54 |
|
---|
55 | Common::Rect bounds = getScreenBounds();
|
---|
56 | @@ -1022,6 +1035,8 @@ void MacWindowManager::draw() {
|
---|
57 | static void menuTimerHandler(void *refCon) {
|
---|
58 | MacWindowManager *wm = (MacWindowManager *)refCon;
|
---|
59 |
|
---|
60 | + Common::StackLock lock(*(wm->mutex()));
|
---|
61 | +
|
---|
62 | if (wm->_menuHotzone.contains(wm->_lastMousePos)) {
|
---|
63 | wm->activateMenu();
|
---|
64 | }
|
---|
65 | diff --git a/graphics/macgui/macwindowmanager.h b/graphics/macgui/macwindowmanager.h
|
---|
66 | index 22a128c77a0..0abf472f6db 100644
|
---|
67 | --- a/graphics/macgui/macwindowmanager.h
|
---|
68 | +++ b/graphics/macgui/macwindowmanager.h
|
---|
69 | @@ -434,6 +434,8 @@ public:
|
---|
70 | ManagedSurface *_screenCopy;
|
---|
71 | Common::Rect _screenDims;
|
---|
72 |
|
---|
73 | + Common::Mutex *mutex() { return &_mutex; }
|
---|
74 | +
|
---|
75 | private:
|
---|
76 | Common::Mutex _mutex;
|
---|
77 | Common::List<BaseMacWindow *> _windowStack;
|
---|
78 | @@ -457,6 +459,8 @@ private:
|
---|
79 | MacMenu *_menu;
|
---|
80 | uint32 _menuDelay;
|
---|
81 |
|
---|
82 | + bool _activateScreenCopy;
|
---|
83 | +
|
---|
84 | Engine *_engineP;
|
---|
85 | void *_engineR;
|
---|
86 | void (*_redrawEngineCallback)(void *engine);
|
---|