diff --git a/modules/juce_events/native/juce_win32_Messaging.cpp b/modules/juce_events/native/juce_win32_Messaging.cpp index 14349090d5..e0f8945a09 100644 --- a/modules/juce_events/native/juce_win32_Messaging.cpp +++ b/modules/juce_events/native/juce_win32_Messaging.cpp @@ -80,35 +80,36 @@ public: } } - bool postMessage (MessageManager::MessageBase* message) + void postMessage (MessageManager::MessageBase* message) { - message->incReferenceCount(); + bool shouldTriggerMessageQueueDispatch = false; - #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client && JucePlugin_Build_Unity - if (juce_isRunningInUnity()) - return SendNotifyMessage (juce_messageWindowHandle, customMessageID, 0, (LPARAM) message) != 0; - #endif - - if (PostMessage (juce_messageWindowHandle, customMessageID, 0, (LPARAM) message) != 0) - return true; - - if (GetLastError() == ERROR_NOT_ENOUGH_QUOTA) { const ScopedLock sl (lock); - overflowQueue.add (message); - message->decReferenceCount(); - return true; + shouldTriggerMessageQueueDispatch = messageQueue.isEmpty(); + messageQueue.add (message); + } + + if (! shouldTriggerMessageQueueDispatch) + return; + + #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client && JucePlugin_Build_Unity + if (juce_isRunningInUnity()) + { + SendNotifyMessage (juce_messageWindowHandle, customMessageID, 0, 0); + return; } + #endif - return false; + PostMessage (juce_messageWindowHandle, customMessageID, 0, 0); } bool dispatchNextMessage (bool returnIfNoPendingMessages) { MSG m; - if (returnIfNoPendingMessages && ! PeekMessage (&m, (HWND) 0, 0, 0, PM_NOREMOVE) && overflowQueue.size() == 0) + if (returnIfNoPendingMessages && ! PeekMessage (&m, (HWND) 0, 0, 0, PM_NOREMOVE)) return false; if (GetMessage (&m, (HWND) 0, 0, 0) >= 0) @@ -120,7 +121,7 @@ public: if (m.message == customMessageID && m.hwnd == juce_messageWindowHandle) { - dispatchMessageFromLParam (m.lParam); + dispatchMessages(); } else if (m.message == WM_QUIT) { @@ -145,8 +146,6 @@ public: } } - dispatchOverflowMessages(); - return true; } @@ -158,12 +157,8 @@ private: { if (message == customMessageID) { - // (These are trapped early in our dispatch loop, but must also be checked - // here in case some 3rd-party code is running the dispatch loop). - dispatchMessageFromLParam (lParam); - if (auto* queue = InternalMessageQueue::getInstanceWithoutCreating()) - queue->dispatchOverflowMessages(); + queue->dispatchMessages(); return 0; } @@ -196,18 +191,15 @@ private: return TRUE; } - static void dispatchMessageFromLParam (LPARAM lParam) + static void dispatchMessage (MessageManager::MessageBase* message) { - if (auto message = reinterpret_cast (lParam)) + JUCE_TRY { - JUCE_TRY - { - message->messageCallback(); - } - JUCE_CATCH_EXCEPTION - - message->decReferenceCount(); + message->messageCallback(); } + JUCE_CATCH_EXCEPTION + + message->decReferenceCount(); } static void handleBroadcastMessage (const COPYDATASTRUCT* data) @@ -228,24 +220,24 @@ private: } } - void dispatchOverflowMessages() + void dispatchMessages() { ReferenceCountedArray messagesToDispatch; { const ScopedLock sl (lock); - if (overflowQueue.isEmpty()) + if (messageQueue.isEmpty()) return; - messagesToDispatch.swapWith (overflowQueue); + messagesToDispatch.swapWith (messageQueue); } for (int i = 0; i < messagesToDispatch.size(); ++i) { auto message = messagesToDispatch.getUnchecked (i); message->incReferenceCount(); - dispatchMessageFromLParam ((LPARAM) message.get()); + dispatchMessage (message.get()); } } @@ -257,7 +249,7 @@ private: std::unique_ptr messageWindow; CriticalSection lock; - ReferenceCountedArray overflowQueue; + ReferenceCountedArray messageQueue; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InternalMessageQueue)