| @@ -1227,8 +1227,8 @@ private: | |||
| createContentWrapperComponentIfNeeded(); | |||
| #if JUCE_WINDOWS || JUCE_LINUX | |||
| component->addToDesktop (0, parent); | |||
| component->setOpaque (true); | |||
| component->addToDesktop (0, (void*) systemWindow); | |||
| component->setVisible (true); | |||
| #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE | |||
| @@ -1295,10 +1295,7 @@ private: | |||
| if (component != nullptr) | |||
| { | |||
| auto w = rect.getWidth(); | |||
| auto h = rect.getHeight(); | |||
| component->setSize (w, h); | |||
| component->setSize (rect.getWidth(), rect.getHeight()); | |||
| #if JUCE_MAC | |||
| if (cubase10Workaround != nullptr) | |||
| @@ -1358,32 +1355,34 @@ private: | |||
| { | |||
| *rectToCheck = convertFromHostBounds (*rectToCheck); | |||
| auto transformScale = std::sqrt (std::abs (editor->getTransform().getDeterminant())); | |||
| auto minW = (double) constrainer->getMinimumWidth() * transformScale; | |||
| auto maxW = (double) constrainer->getMaximumWidth() * transformScale; | |||
| auto minH = (double) constrainer->getMinimumHeight() * transformScale; | |||
| auto maxH = (double) constrainer->getMaximumHeight() * transformScale; | |||
| auto editorBounds = editor->getLocalArea (component.get(), | |||
| Rectangle<int>::leftTopRightBottom (rectToCheck->left, rectToCheck->top, | |||
| rectToCheck->right, rectToCheck->bottom).toFloat()); | |||
| auto width = (double) rectToCheck->right - (double) rectToCheck->left; | |||
| auto height = (double) rectToCheck->bottom - (double) rectToCheck->top; | |||
| auto minW = (float) constrainer->getMinimumWidth(); | |||
| auto maxW = (float) constrainer->getMaximumWidth(); | |||
| auto minH = (float) constrainer->getMinimumHeight(); | |||
| auto maxH = (float) constrainer->getMaximumHeight(); | |||
| width = jlimit (minW, maxW, width); | |||
| height = jlimit (minH, maxH, height); | |||
| auto width = jlimit (minW, maxW, editorBounds.getWidth()); | |||
| auto height = jlimit (minH, maxH, editorBounds.getHeight()); | |||
| auto aspectRatio = constrainer->getFixedAspectRatio(); | |||
| auto aspectRatio = (float) constrainer->getFixedAspectRatio(); | |||
| if (aspectRatio != 0.0) | |||
| { | |||
| bool adjustWidth = (width / height > aspectRatio); | |||
| if (getHostType().type == PluginHostType::SteinbergCubase9) | |||
| auto adjustWidth = [&] | |||
| { | |||
| if (editor->getWidth() == width && editor->getHeight() != height) | |||
| adjustWidth = true; | |||
| else if (editor->getHeight() == height && editor->getWidth() != width) | |||
| adjustWidth = false; | |||
| } | |||
| auto currentEditorBounds = editor->getBounds().toFloat(); | |||
| auto stretchingBottom = (currentEditorBounds.getBottom() != editorBounds.getBottom()); | |||
| auto stretchingRight = (currentEditorBounds.getRight() != editorBounds.getRight()); | |||
| if (getHostType().isReaper() || stretchingBottom == stretchingRight) | |||
| return currentEditorBounds.getAspectRatio() > (width / height); | |||
| return stretchingBottom; | |||
| }(); | |||
| if (adjustWidth) | |||
| { | |||
| @@ -1407,8 +1406,11 @@ private: | |||
| } | |||
| } | |||
| rectToCheck->right = rectToCheck->left + roundToInt (width); | |||
| rectToCheck->bottom = rectToCheck->top + roundToInt (height); | |||
| auto constrainedRect = component->getLocalArea (editor, Rectangle<float> (width, height)) | |||
| .getSmallestIntegerContainer(); | |||
| rectToCheck->right = rectToCheck->left + roundToInt (constrainedRect.getWidth()); | |||
| rectToCheck->bottom = rectToCheck->top + roundToInt (constrainedRect.getHeight()); | |||
| *rectToCheck = convertToHostBounds (*rectToCheck); | |||
| } | |||
| @@ -1443,16 +1445,7 @@ private: | |||
| owner->lastScaleFactorReceived = editorScaleFactor; | |||
| if (component != nullptr) | |||
| { | |||
| if (auto* editor = component->pluginEditor.get()) | |||
| { | |||
| editor->setScaleFactor (editorScaleFactor); | |||
| component->resizeHostWindow(); | |||
| component->setTopLeftPosition (0, 0); | |||
| component->repaint(); | |||
| } | |||
| } | |||
| component->setEditorScaleFactor (editorScaleFactor); | |||
| } | |||
| return kResultTrue; | |||
| @@ -1564,21 +1557,18 @@ private: | |||
| if (resizingChild) | |||
| return; | |||
| auto b = getSizeToContainChild(); | |||
| auto newBounds = getSizeToContainChild(); | |||
| if (lastBounds != b) | |||
| if (newBounds != lastBounds) | |||
| { | |||
| lastBounds = b; | |||
| { | |||
| const ScopedValueSetter<bool> resizingParentSetter (resizingParent, true); | |||
| resizeHostWindow(); | |||
| } | |||
| resizeHostWindow(); | |||
| #if JUCE_LINUX | |||
| if (getHostType().isBitwigStudio()) | |||
| repaint(); | |||
| #endif | |||
| lastBounds = newBounds; | |||
| } | |||
| } | |||
| @@ -1595,28 +1585,12 @@ private: | |||
| return; | |||
| #endif | |||
| lastBounds = newBounds; | |||
| const ScopedValueSetter<bool> resizingChildSetter (resizingChild, true); | |||
| if (auto* constrainer = pluginEditor->getConstrainer()) | |||
| { | |||
| auto aspectRatio = constrainer->getFixedAspectRatio(); | |||
| if (aspectRatio != 0) | |||
| { | |||
| auto width = (double) lastBounds.getWidth(); | |||
| auto height = (double) lastBounds.getHeight(); | |||
| if (width / height > aspectRatio) | |||
| setBounds ({ 0, 0, roundToInt (height * aspectRatio), lastBounds.getHeight() }); | |||
| else | |||
| setBounds ({ 0, 0, lastBounds.getWidth(), roundToInt (width / aspectRatio) }); | |||
| } | |||
| const ScopedValueSetter<bool> resizingChildSetter (resizingChild, true); | |||
| pluginEditor->setBounds (pluginEditor->getLocalArea (this, newBounds).withPosition (0, 0)); | |||
| } | |||
| pluginEditor->setTopLeftPosition (0, 0); | |||
| pluginEditor->setBounds (pluginEditor->getLocalArea (this, getLocalBounds())); | |||
| lastBounds = newBounds; | |||
| } | |||
| } | |||
| } | |||
| @@ -1634,31 +1608,45 @@ private: | |||
| { | |||
| if (pluginEditor != nullptr) | |||
| { | |||
| auto b = getSizeToContainChild(); | |||
| auto w = b.getWidth(); | |||
| auto h = b.getHeight(); | |||
| auto host = getHostType(); | |||
| #if JUCE_WINDOWS | |||
| setSize (w, h); | |||
| #endif | |||
| if (owner.plugFrame != nullptr) | |||
| { | |||
| auto newSize = convertToHostBounds ({ 0, 0, b.getWidth(), b.getHeight() }); | |||
| auto editorBounds = getSizeToContainChild(); | |||
| auto newSize = convertToHostBounds ({ 0, 0, editorBounds.getWidth(), editorBounds.getHeight() }); | |||
| { | |||
| const ScopedValueSetter<bool> resizingParentSetter (resizingParent, true); | |||
| owner.plugFrame->resizeView (&owner, &newSize); | |||
| } | |||
| auto host = getHostType(); | |||
| #if JUCE_MAC | |||
| if (host.isWavelab() || host.isReaper()) | |||
| #else | |||
| if (host.isWavelab() || host.isAbletonLive() || host.isBitwigStudio()) | |||
| #endif | |||
| setBounds (0, 0, w, h); | |||
| setBounds (editorBounds.withPosition (0, 0)); | |||
| } | |||
| } | |||
| } | |||
| void setEditorScaleFactor (float scale) | |||
| { | |||
| if (pluginEditor != nullptr) | |||
| { | |||
| auto prevEditorBounds = pluginEditor->getLocalArea (this, lastBounds); | |||
| { | |||
| const ScopedValueSetter<bool> resizingChildSetter (resizingChild, true); | |||
| pluginEditor->setScaleFactor (scale); | |||
| pluginEditor->setBounds (prevEditorBounds.withPosition (0, 0)); | |||
| } | |||
| lastBounds = getSizeToContainChild(); | |||
| resizeHostWindow(); | |||
| repaint(); | |||
| } | |||
| } | |||