diff --git a/Core/BaseRenderer.cpp b/Core/BaseRenderer.cpp index 100d0661..1cf9ebae 100644 --- a/Core/BaseRenderer.cpp +++ b/Core/BaseRenderer.cpp @@ -16,6 +16,11 @@ BaseRenderer::BaseRenderer(shared_ptr console, bool registerAsMessageMa } } +BaseRenderer::~BaseRenderer() +{ + MessageManager::UnregisterMessageManager(this); +} + void BaseRenderer::DisplayMessage(string title, string message) { shared_ptr toast(new ToastInfo(title, message, 4000)); diff --git a/Core/BaseRenderer.h b/Core/BaseRenderer.h index fc7b8073..353ffce3 100644 --- a/Core/BaseRenderer.h +++ b/Core/BaseRenderer.h @@ -28,6 +28,7 @@ protected: uint32_t _renderedFrameCount = 0; BaseRenderer(shared_ptr console, bool registerAsMessageManager); + virtual ~BaseRenderer(); bool IsMessageShown(); diff --git a/Core/MessageManager.cpp b/Core/MessageManager.cpp index fdca2d6e..54a02c08 100644 --- a/Core/MessageManager.cpp +++ b/Core/MessageManager.cpp @@ -680,14 +680,24 @@ std::unordered_map MessageManager::_zhResources = { std::list MessageManager::_log; SimpleLock MessageManager::_logLock; +SimpleLock MessageManager::_messageLock; bool MessageManager::_osdEnabled = false; IMessageManager* MessageManager::_messageManager = nullptr; void MessageManager::RegisterMessageManager(IMessageManager* messageManager) { + auto lock = _messageLock.AcquireSafe(); MessageManager::_messageManager = messageManager; } +void MessageManager::UnregisterMessageManager(IMessageManager* messageManager) +{ + auto lock = _messageLock.AcquireSafe(); + if(MessageManager::_messageManager == messageManager) { + MessageManager::_messageManager = nullptr; + } +} + void MessageManager::SetOsdState(bool enabled) { _osdEnabled = enabled; @@ -725,6 +735,11 @@ string MessageManager::Localize(string key) void MessageManager::DisplayMessage(string title, string message, string param1, string param2) { if(MessageManager::_messageManager) { + auto lock = _messageLock.AcquireSafe(); + if(!MessageManager::_messageManager) { + return; + } + title = Localize(title); message = Localize(message); diff --git a/Core/MessageManager.h b/Core/MessageManager.h index 0b93518e..bc0c5d7d 100644 --- a/Core/MessageManager.h +++ b/Core/MessageManager.h @@ -22,6 +22,7 @@ private: static bool _osdEnabled; static SimpleLock _logLock; + static SimpleLock _messageLock; static std::list _log; public: @@ -30,6 +31,7 @@ public: static string Localize(string key); static void RegisterMessageManager(IMessageManager* messageManager); + static void UnregisterMessageManager(IMessageManager* messageManager); static void DisplayMessage(string title, string message, string param1 = "", string param2 = ""); static void Log(string message = ""); diff --git a/InteropDLL/ConsoleWrapper.cpp b/InteropDLL/ConsoleWrapper.cpp index d82192d2..1d904324 100644 --- a/InteropDLL/ConsoleWrapper.cpp +++ b/InteropDLL/ConsoleWrapper.cpp @@ -492,8 +492,6 @@ namespace InteropEmu { _console->Release(true); _console.reset(); - - MessageManager::RegisterMessageManager(nullptr); _shortcutKeyHandler.reset(); }