| @@ -332,8 +332,14 @@ private: | |||
| class JuceLv2ParentContainer : public Component | |||
| { | |||
| public: | |||
| JuceLv2ParentContainer (std::unique_ptr<AudioProcessorEditor>& editor, const LV2UI_Resize* uiResize_) | |||
| : uiResize(uiResize_) | |||
| struct SizeListener { | |||
| virtual ~SizeListener() {} | |||
| virtual void parentWindowSizeChanged(int cw, int ch) = 0; | |||
| }; | |||
| JuceLv2ParentContainer (std::unique_ptr<AudioProcessorEditor>& editor, | |||
| SizeListener* const sizeListener_) | |||
| : sizeListener(sizeListener_) | |||
| { | |||
| setOpaque (true); | |||
| editor->setOpaque (true); | |||
| @@ -361,24 +367,15 @@ public: | |||
| setSize (cw, ch); | |||
| #endif | |||
| if (uiResize != nullptr) | |||
| uiResize->ui_resize (uiResize->handle, cw, ch); | |||
| } | |||
| void reset (const LV2UI_Resize* uiResize_) | |||
| { | |||
| uiResize = uiResize_; | |||
| if (uiResize != nullptr) | |||
| uiResize->ui_resize (uiResize->handle, getWidth(), getHeight()); | |||
| sizeListener->parentWindowSizeChanged (cw, ch); | |||
| } | |||
| private: | |||
| //============================================================================== | |||
| const LV2UI_Resize* uiResize; | |||
| #if JUCE_LINUX | |||
| ::Display* const display = XWindowSystem::getInstance()->getDisplay(); | |||
| #endif | |||
| SizeListener* const sizeListener; | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceLv2ParentContainer); | |||
| }; | |||
| @@ -390,7 +387,8 @@ static ThreadLocalValue<bool> inParameterChangedCallback; | |||
| Juce LV2 UI handle | |||
| */ | |||
| class JuceLv2UIWrapper : public AudioProcessorListener, | |||
| public Timer | |||
| public Timer, | |||
| public JuceLv2ParentContainer::SizeListener | |||
| { | |||
| public: | |||
| #if JUCE_LINUX | |||
| @@ -544,7 +542,10 @@ public: | |||
| switch (msg.type) | |||
| { | |||
| case IdleMessage::kMessageParameterChanged: | |||
| writeFunction (controller, msg.index + controlPortOffset, sizeof (float), 0, &msg.value); | |||
| writeFunction (controller, msg.index + controlPortOffset, sizeof (float), 0, &msg.valuef); | |||
| break; | |||
| case IdleMessage::kMessageSizeChanged: | |||
| uiResize->ui_resize (uiResize->handle, msg.index, msg.valuei); | |||
| break; | |||
| case IdleMessage::kMessageGestureBegin: | |||
| uiTouch->touch (uiTouch->handle, msg.index + controlPortOffset, true); | |||
| @@ -576,7 +577,7 @@ public: | |||
| #if JUCE_LINUX | |||
| if (hostHasIdleInterface && ! isExternal) | |||
| { | |||
| const IdleMessage msg = { IdleMessage::kMessageParameterChanged, index, newValue }; | |||
| const IdleMessage msg = { IdleMessage::kMessageParameterChanged, index, 0, newValue }; | |||
| const ScopedLock sl(idleMessagesLock); | |||
| idleMessages.add(msg); | |||
| } | |||
| @@ -609,7 +610,7 @@ public: | |||
| #if JUCE_LINUX | |||
| if (hostHasIdleInterface && ! isExternal) | |||
| { | |||
| const IdleMessage msg = { IdleMessage::kMessageGestureBegin, parameterIndex, 0.0f }; | |||
| const IdleMessage msg = { IdleMessage::kMessageGestureBegin, parameterIndex, 0, 0.0f }; | |||
| const ScopedLock sl(idleMessagesLock); | |||
| idleMessages.add(msg); | |||
| } | |||
| @@ -628,7 +629,7 @@ public: | |||
| #if JUCE_LINUX | |||
| if (hostHasIdleInterface && ! isExternal) | |||
| { | |||
| const IdleMessage msg = { IdleMessage::kMessageGestureEnd, parameterIndex, 0.0f }; | |||
| const IdleMessage msg = { IdleMessage::kMessageGestureEnd, parameterIndex, 0, 0.0f }; | |||
| const ScopedLock sl(idleMessagesLock); | |||
| idleMessages.add(msg); | |||
| } | |||
| @@ -639,6 +640,25 @@ public: | |||
| } | |||
| } | |||
| void parentWindowSizeChanged(int cw, int ch) override | |||
| { | |||
| if (uiResize == nullptr) | |||
| return; | |||
| #if JUCE_LINUX | |||
| if (hostHasIdleInterface && ! isExternal) | |||
| { | |||
| const IdleMessage msg = { IdleMessage::kMessageSizeChanged, cw, ch, 0.0f }; | |||
| const ScopedLock sl(idleMessagesLock); | |||
| idleMessages.add(msg); | |||
| } | |||
| else | |||
| #endif | |||
| { | |||
| uiResize->ui_resize (uiResize->handle, cw, ch); | |||
| } | |||
| } | |||
| void timerCallback() | |||
| { | |||
| if (externalUI != nullptr && externalUI->isClosed()) | |||
| @@ -720,11 +740,13 @@ private: | |||
| struct IdleMessage { | |||
| enum { | |||
| kMessageParameterChanged, | |||
| kMessageSizeChanged, | |||
| kMessageGestureBegin, | |||
| kMessageGestureEnd, | |||
| } type; | |||
| int index; | |||
| float value; | |||
| int valuei; | |||
| float valuef; | |||
| }; | |||
| Array<IdleMessage> idleMessages; | |||
| CriticalSection idleMessagesLock; | |||
| @@ -778,14 +800,14 @@ private: | |||
| if (parent != nullptr) | |||
| { | |||
| if (parentContainer == nullptr) | |||
| parentContainer = std::make_unique<JuceLv2ParentContainer> (editor, uiResize); | |||
| parentContainer = std::make_unique<JuceLv2ParentContainer> (editor, this); | |||
| parentContainer->setVisible (false); | |||
| if (parentContainer->isOnDesktop()) | |||
| parentContainer->removeFromDesktop(); | |||
| parentContainer->addToDesktop (0, parent); | |||
| parentContainer->addToDesktop (ComponentPeer::windowIsResizable, parent); | |||
| #if JUCE_LINUX | |||
| Window hostWindow = (Window) parent; | |||
| @@ -793,7 +815,9 @@ private: | |||
| X11Symbols::getInstance()->xReparentWindow (display, editorWnd, hostWindow, 0, 0); | |||
| #endif | |||
| parentContainer->reset (uiResize); | |||
| if (uiResize != nullptr) | |||
| uiResize->ui_resize (uiResize->handle, parentContainer->getWidth(), parentContainer->getHeight()); | |||
| parentContainer->setVisible (true); | |||
| } | |||
| } | |||