From 11d872ea1b97e520aaa8e388ecc0e5e3c8c5bd11 Mon Sep 17 00:00:00 2001 From: ed Date: Tue, 13 Apr 2021 16:25:04 +0100 Subject: [PATCH] MessageMananger: Made dispatchNextMessageOnSystemQueue() accessible by internal code --- .../messages/juce_MessageManager.cpp | 51 ++++++++++--------- .../messages/juce_MessageManager.h | 1 - .../native/juce_android_Messaging.cpp | 9 ---- .../native/juce_linux_Messaging.cpp | 2 +- .../native/juce_win32_Messaging.cpp | 7 +-- .../native/juce_win32_FileChooser.cpp | 4 +- 6 files changed, 31 insertions(+), 43 deletions(-) diff --git a/modules/juce_events/messages/juce_MessageManager.cpp b/modules/juce_events/messages/juce_MessageManager.cpp index be5a16283f..e137ad5d34 100644 --- a/modules/juce_events/messages/juce_MessageManager.cpp +++ b/modules/juce_events/messages/juce_MessageManager.cpp @@ -78,31 +78,10 @@ bool MessageManager::MessageBase::post() } //============================================================================== -#if JUCE_MODAL_LOOPS_PERMITTED && ! (JUCE_MAC || JUCE_IOS) -bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) -{ - jassert (isThisTheMessageThread()); // must only be called by the message thread - - auto endTime = Time::currentTimeMillis() + millisecondsToRunFor; - - while (quitMessageReceived.get() == 0) - { - JUCE_TRY - { - if (! dispatchNextMessageOnSystemQueue (millisecondsToRunFor >= 0)) - Thread::sleep (1); - } - JUCE_CATCH_EXCEPTION - - if (millisecondsToRunFor >= 0 && Time::currentTimeMillis() >= endTime) - break; - } - - return quitMessageReceived.get() == 0; -} -#endif - #if ! (JUCE_MAC || JUCE_IOS || JUCE_ANDROID) +// implemented in platform-specific code (juce_linux_Messaging.cpp and juce_win32_Messaging.cpp) +bool dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages); + class MessageManager::QuitMessage : public MessageManager::MessageBase { public: @@ -138,6 +117,30 @@ void MessageManager::stopDispatchLoop() quitMessagePosted = true; } +#if JUCE_MODAL_LOOPS_PERMITTED +bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) +{ + jassert (isThisTheMessageThread()); // must only be called by the message thread + + auto endTime = Time::currentTimeMillis() + millisecondsToRunFor; + + while (quitMessageReceived.get() == 0) + { + JUCE_TRY + { + if (! dispatchNextMessageOnSystemQueue (millisecondsToRunFor >= 0)) + Thread::sleep (1); + } + JUCE_CATCH_EXCEPTION + + if (millisecondsToRunFor >= 0 && Time::currentTimeMillis() >= endTime) + break; + } + + return quitMessageReceived.get() == 0; +} +#endif + #endif //============================================================================== diff --git a/modules/juce_events/messages/juce_MessageManager.h b/modules/juce_events/messages/juce_MessageManager.h index ae72311019..79f7ad730f 100644 --- a/modules/juce_events/messages/juce_MessageManager.h +++ b/modules/juce_events/messages/juce_MessageManager.h @@ -333,7 +333,6 @@ private: static void* exitModalLoopCallback (void*); static void doPlatformSpecificInitialisation(); static void doPlatformSpecificShutdown(); - static bool dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MessageManager) }; diff --git a/modules/juce_events/native/juce_android_Messaging.cpp b/modules/juce_events/native/juce_android_Messaging.cpp index c55f812b49..20f5f50ced 100644 --- a/modules/juce_events/native/juce_android_Messaging.cpp +++ b/modules/juce_events/native/juce_android_Messaging.cpp @@ -118,15 +118,6 @@ JUCE_IMPLEMENT_SINGLETON (AndroidMessageQueue) void MessageManager::doPlatformSpecificInitialisation() { AndroidMessageQueue::getInstance(); } void MessageManager::doPlatformSpecificShutdown() { AndroidMessageQueue::deleteInstance(); } -//============================================================================== -bool MessageManager::dispatchNextMessageOnSystemQueue (const bool) -{ - Logger::outputDebugString ("*** Modal loops are not possible in Android!! Exiting..."); - exit (1); - - return true; -} - bool MessageManager::postMessageToSystemQueue (MessageManager::MessageBase* const message) { return AndroidMessageQueue::getInstance()->post (message); diff --git a/modules/juce_events/native/juce_linux_Messaging.cpp b/modules/juce_events/native/juce_linux_Messaging.cpp index 4aa449170e..0fb7364714 100644 --- a/modules/juce_events/native/juce_linux_Messaging.cpp +++ b/modules/juce_events/native/juce_linux_Messaging.cpp @@ -288,7 +288,7 @@ void MessageManager::broadcastMessage (const String&) } // this function expects that it will NEVER be called simultaneously for two concurrent threads -bool MessageManager::dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages) +bool dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages) { for (;;) { diff --git a/modules/juce_events/native/juce_win32_Messaging.cpp b/modules/juce_events/native/juce_win32_Messaging.cpp index 96cdb48099..fa9fe068b3 100644 --- a/modules/juce_events/native/juce_win32_Messaging.cpp +++ b/modules/juce_events/native/juce_win32_Messaging.cpp @@ -260,7 +260,7 @@ JUCE_IMPLEMENT_SINGLETON (InternalMessageQueue) const TCHAR InternalMessageQueue::messageWindowName[] = _T("JUCEWindow"); //============================================================================== -bool windowsDispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages) +bool dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages) { if (auto* queue = InternalMessageQueue::getInstanceWithoutCreating()) return queue->dispatchNextMessage (returnIfNoPendingMessages); @@ -268,11 +268,6 @@ bool windowsDispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages) return false; } -bool MessageManager::dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages) -{ - return windowsDispatchNextMessageOnSystemQueue (returnIfNoPendingMessages); -} - bool MessageManager::postMessageToSystemQueue (MessageManager::MessageBase* const message) { if (auto* queue = InternalMessageQueue::getInstanceWithoutCreating()) diff --git a/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp b/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp index fcb264b3d9..a7fd267e66 100644 --- a/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp +++ b/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp @@ -31,7 +31,7 @@ namespace juce { // Implemented in juce_win32_Messaging.cpp -bool windowsDispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages); +bool dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages); class Win32NativeFileChooser : private Thread { @@ -81,7 +81,7 @@ public: while (isThreadRunning()) { - if (! windowsDispatchNextMessageOnSystemQueue (true)) + if (! dispatchNextMessageOnSystemQueue (true)) Thread::sleep (1); } }