Ticket #15006: macgui-menu-corruption2.txt

File macgui-menu-corruption2.txt, 2.3 KB (added by eriktorbjorn, 2 months ago)
Line 
1diff --git a/graphics/macgui/macwindowmanager.cpp b/graphics/macgui/macwindowmanager.cpp
2index 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 }
65diff --git a/graphics/macgui/macwindowmanager.h b/graphics/macgui/macwindowmanager.h
66index 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);