|
@@ -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);
|
|
|
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)
|
|
|
bool dispatchNextMessage (bool returnIfNoPendingMessages)
|
|
|
{
|
|
|
{
|
|
|
MSG m;
|
|
|
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;
|
|
|
return false;
|
|
|
|
|
|
|
|
|
if (GetMessage (&m, (HWND) 0, 0, 0) >= 0)
|
|
|
if (GetMessage (&m, (HWND) 0, 0, 0) >= 0)
|
|
@@ -120,7 +121,7 @@ public: |
|
|
|
|
|
|
|
|
if (m.message == customMessageID && m.hwnd == juce_messageWindowHandle)
|
|
|
if (m.message == customMessageID && m.hwnd == juce_messageWindowHandle)
|
|
|
{
|
|
|
{
|
|
|
dispatchMessageFromLParam (m.lParam);
|
|
|
|
|
|
|
|
|
dispatchMessages();
|
|
|
}
|
|
|
}
|
|
|
else if (m.message == WM_QUIT)
|
|
|
else if (m.message == WM_QUIT)
|
|
|
{
|
|
|
{
|
|
@@ -145,8 +146,6 @@ public: |
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
dispatchOverflowMessages();
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
@@ -158,12 +157,8 @@ private: |
|
|
{
|
|
|
{
|
|
|
if (message == customMessageID)
|
|
|
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())
|
|
|
if (auto* queue = InternalMessageQueue::getInstanceWithoutCreating())
|
|
|
queue->dispatchOverflowMessages();
|
|
|
|
|
|
|
|
|
queue->dispatchMessages();
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
@@ -196,18 +191,15 @@ private: |
|
|
return TRUE;
|
|
|
return TRUE;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
static void dispatchMessageFromLParam (LPARAM lParam)
|
|
|
|
|
|
|
|
|
static void dispatchMessage (MessageManager::MessageBase* message)
|
|
|
{
|
|
|
{
|
|
|
if (auto message = reinterpret_cast<MessageManager::MessageBase*> (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)
|
|
|
static void handleBroadcastMessage (const COPYDATASTRUCT* data)
|
|
@@ -228,24 +220,24 @@ private: |
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
void dispatchOverflowMessages()
|
|
|
|
|
|
|
|
|
void dispatchMessages()
|
|
|
{
|
|
|
{
|
|
|
ReferenceCountedArray<MessageManager::MessageBase> messagesToDispatch;
|
|
|
ReferenceCountedArray<MessageManager::MessageBase> messagesToDispatch;
|
|
|
|
|
|
|
|
|
{
|
|
|
{
|
|
|
const ScopedLock sl (lock);
|
|
|
const ScopedLock sl (lock);
|
|
|
|
|
|
|
|
|
if (overflowQueue.isEmpty())
|
|
|
|
|
|
|
|
|
if (messageQueue.isEmpty())
|
|
|
return;
|
|
|
return;
|
|
|
|
|
|
|
|
|
messagesToDispatch.swapWith (overflowQueue);
|
|
|
|
|
|
|
|
|
messagesToDispatch.swapWith (messageQueue);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
for (int i = 0; i < messagesToDispatch.size(); ++i)
|
|
|
for (int i = 0; i < messagesToDispatch.size(); ++i)
|
|
|
{
|
|
|
{
|
|
|
auto message = messagesToDispatch.getUnchecked (i);
|
|
|
auto message = messagesToDispatch.getUnchecked (i);
|
|
|
message->incReferenceCount();
|
|
|
message->incReferenceCount();
|
|
|
dispatchMessageFromLParam ((LPARAM) message.get());
|
|
|
|
|
|
|
|
|
dispatchMessage (message.get());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
@@ -257,7 +249,7 @@ private: |
|
|
std::unique_ptr<HiddenMessageWindow> messageWindow;
|
|
|
std::unique_ptr<HiddenMessageWindow> messageWindow;
|
|
|
|
|
|
|
|
|
CriticalSection lock;
|
|
|
CriticalSection lock;
|
|
|
ReferenceCountedArray<MessageManager::MessageBase> overflowQueue;
|
|
|
|
|
|
|
|
|
ReferenceCountedArray<MessageManager::MessageBase> messageQueue;
|
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
//==============================================================================
|
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InternalMessageQueue)
|
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InternalMessageQueue)
|
|
|