diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp index 30aaec29c1..487b356b6f 100644 --- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp @@ -795,9 +795,6 @@ public: chunkMemoryTime = 0; } } - - if (editorComp != nullptr) - editorComp->checkVisibility(); } void setHasEditorFlag (bool shouldSetHasEditor) @@ -1009,7 +1006,7 @@ public: startTimer (500); #endif #elif JUCE_MAC - hostWindow = detail::VSTWindowUtilities::attachComponentToWindowRefVST (this, desktopFlags, args.ptr, wrapper.useNSView); + hostWindow = detail::VSTWindowUtilities::attachComponentToWindowRefVST (this, desktopFlags, args.ptr); #endif setVisible (true); @@ -1019,20 +1016,12 @@ public: { #if JUCE_MAC if (hostWindow != nullptr) - detail::VSTWindowUtilities::detachComponentFromWindowRefVST (this, hostWindow, wrapper.useNSView); + detail::VSTWindowUtilities::detachComponentFromWindowRefVST (this, hostWindow); #endif hostWindow = {}; } - void checkVisibility() - { - #if JUCE_MAC - if (hostWindow != nullptr) - detail::VSTWindowUtilities::checkWindowVisibilityVST (hostWindow, this, wrapper.useNSView); - #endif - } - AudioProcessorEditor* getEditorComp() const noexcept { return dynamic_cast (getChildComponent (0)); @@ -1056,11 +1045,6 @@ public: updateWindowSize(); } - - #if JUCE_MAC && ! JUCE_64BIT - if (! wrapper.useNSView) - updateEditorCompBoundsVST (this); - #endif } void parentSizeChanged() override @@ -1118,7 +1102,7 @@ public: const ScopedValueSetter resizingParentSetter (resizingParent, true); #if JUCE_MAC - detail::VSTWindowUtilities::setNativeHostWindowSizeVST (hostWindow, this, newWidth, newHeight, wrapper.useNSView); + detail::VSTWindowUtilities::setNativeHostWindowSizeVST (hostWindow, this, newWidth, newHeight); #elif JUCE_LINUX || JUCE_BSD // (Currently, all linux hosts support sizeWindow, so this should never need to happen) setSize (newWidth, newHeight); @@ -1224,15 +1208,6 @@ public: #endif #endif - #if JUCE_MAC - bool keyPressed (const KeyPress&) override - { - // If we have an unused keypress, move the key-focus to a host window - // and re-inject the event.. - return detail::VSTWindowUtilities::forwardCurrentKeyEventToHostVST (this, wrapper.useNSView); - } - #endif - private: void updateWindowSize() { @@ -1900,7 +1875,6 @@ private: #if JUCE_MAC if (matches ("hasCockosViewAsConfig")) { - useNSView = true; return (int32) 0xbeef0000; } #endif @@ -2104,14 +2078,6 @@ private: bool isProcessing = false, isBypassed = false, hasShutdown = false; bool firstProcessCallback = true, shouldDeleteEditor = false; - #if JUCE_MAC - #if JUCE_64BIT - bool useNSView = true; - #else - bool useNSView = false; - #endif - #endif - VstTempBuffers floatTempBuffers; VstTempBuffers doubleTempBuffers; int maxNumInChannels = 0, maxNumOutChannels = 0; @@ -2181,14 +2147,12 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster); JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster) { - detail::VSTWindowUtilities::initialiseMacVST(); return pluginEntryPoint (audioMaster); } JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_macho (Vst2::audioMasterCallback audioMaster); JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_macho (Vst2::audioMasterCallback audioMaster) { - detail::VSTWindowUtilities::initialiseMacVST(); return pluginEntryPoint (audioMaster); } diff --git a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp index 9e6757b5ab..818488e007 100644 --- a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp @@ -1799,8 +1799,7 @@ private: #endif #else - isNSView = (strcmp (type, kPlatformTypeNSView) == 0); - macHostWindow = detail::VSTWindowUtilities::attachComponentToWindowRefVST (component.get(), desktopFlags, parent, isNSView); + macHostWindow = detail::VSTWindowUtilities::attachComponentToWindowRefVST (component.get(), desktopFlags, parent); #endif component->resizeHostWindow(); @@ -1822,7 +1821,7 @@ private: #elif JUCE_MAC if (macHostWindow != nullptr) { - detail::VSTWindowUtilities::detachComponentFromWindowRefVST (component.get(), macHostWindow, isNSView); + detail::VSTWindowUtilities::detachComponentFromWindowRefVST (component.get(), macHostWindow); macHostWindow = nullptr; } #endif @@ -2288,7 +2287,6 @@ private: #if JUCE_MAC void* macHostWindow = nullptr; - bool isNSView = false; // On macOS Cubase 10 resizes the host window after calling onSize() resulting in the peer // bounds being a step behind the plug-in. Calling updateBounds() asynchronously seems to fix things... @@ -3852,10 +3850,6 @@ JUCE_END_IGNORE_WARNINGS_GCC_LIKE bool initModule(); bool initModule() { - #if JUCE_MAC - detail::VSTWindowUtilities::initialiseMacVST(); - #endif - return true; } diff --git a/modules/juce_audio_plugin_client/detail/juce_VSTWindowUtilities.h b/modules/juce_audio_plugin_client/detail/juce_VSTWindowUtilities.h index a45308f164..b7439d1ef8 100644 --- a/modules/juce_audio_plugin_client/detail/juce_VSTWindowUtilities.h +++ b/modules/juce_audio_plugin_client/detail/juce_VSTWindowUtilities.h @@ -36,37 +36,17 @@ struct VSTWindowUtilities { VSTWindowUtilities() = delete; - #if ! JUCE_64BIT - static void updateEditorCompBoundsVST (Component* comp); - - static pascal OSStatus viewBoundsChangedEvent (EventHandlerCallRef, EventRef, void* user); - - static bool shouldManuallyCloseHostWindow(); - #endif - static void* attachComponentToWindowRefVST (Component* comp, int desktopFlags, - void* parentWindowOrView, - bool isNSView); + void* parentWindowOrView); static void detachComponentFromWindowRefVST (Component* comp, - void* window, - bool isNSView); - - static void initialiseMacVST(); + void* window); static void setNativeHostWindowSizeVST (void* window, Component* component, int newWidth, - int newHeight, - bool isNSView); - - static void checkWindowVisibilityVST (void* window, - Component* comp, - bool isNSView); - - static bool forwardCurrentKeyEventToHostVST (Component* comp, - bool isNSView); + int newHeight); }; } // namespace juce::detail diff --git a/modules/juce_audio_plugin_client/detail/juce_VSTWindowUtilities.mm b/modules/juce_audio_plugin_client/detail/juce_VSTWindowUtilities.mm index 4d8a8f5aa8..1014dd4510 100644 --- a/modules/juce_audio_plugin_client/detail/juce_VSTWindowUtilities.mm +++ b/modules/juce_audio_plugin_client/detail/juce_VSTWindowUtilities.mm @@ -36,158 +36,17 @@ namespace juce::detail { -#if JUCE_32BIT -class EventReposter : private CallbackMessage -{ -public: - EventReposter() : e ([[NSApp currentEvent] retain]) {} - ~EventReposter() override { [e release]; } - - static void repostCurrentNSEvent() - { - (new EventReposter())->post(); - } - -private: - void messageCallback() override - { - [NSApp postEvent: e atStart: YES]; - } - - NSEvent* e; -}; - -void VSTWindowUtilities::updateEditorCompBoundsVST (Component* comp) -{ - HIViewRef dummyView = (HIViewRef) (void*) (pointer_sized_int) - comp->getProperties() ["dummyViewRef"].toString().getHexValue64(); - - HIRect r; - HIViewGetFrame (dummyView, &r); - HIViewRef root; - HIViewFindByID (HIViewGetRoot (HIViewGetWindow (dummyView)), kHIViewWindowContentID, &root); - HIViewConvertRect (&r, HIViewGetSuperview (dummyView), root); - - Rect windowPos; - GetWindowBounds (HIViewGetWindow (dummyView), kWindowContentRgn, &windowPos); - - comp->setTopLeftPosition ((int) (windowPos.left + r.origin.x), - (int) (windowPos.top + r.origin.y)); -} - -pascal OSStatus VSTWindowUtilities::viewBoundsChangedEvent (EventHandlerCallRef, EventRef, void* user) -{ - updateEditorCompBoundsVST ((Component*) user); - return noErr; -} - -bool VSTWindowUtilities::shouldManuallyCloseHostWindow() -{ - return getHostType().isCubase7orLater() - || getHostType().isRenoise() - || ((SystemStats::getOperatingSystemType() & 0xff) >= 12); -} -#endif - void* VSTWindowUtilities::attachComponentToWindowRefVST (Component* comp, int desktopFlags, - void* parentWindowOrView, - [[maybe_unused]] bool isNSView) + void* parentWindowOrView) { JUCE_AUTORELEASEPOOL { - #if ! JUCE_64BIT - if (! isNSView) - { - NSWindow* hostWindow = [[NSWindow alloc] initWithWindowRef: parentWindowOrView]; - - if (shouldManuallyCloseHostWindow()) - { - [hostWindow setReleasedWhenClosed: NO]; - } - else - { - [hostWindow retain]; - [hostWindow setReleasedWhenClosed: YES]; - } - - [hostWindow setCanHide: YES]; - - HIViewRef parentView = 0; - - WindowAttributes attributes; - GetWindowAttributes ((WindowRef) parentWindowOrView, &attributes); - - if ((attributes & kWindowCompositingAttribute) != 0) - { - HIViewRef root = HIViewGetRoot ((WindowRef) parentWindowOrView); - HIViewFindByID (root, kHIViewWindowContentID, &parentView); - - if (parentView == 0) - parentView = root; - } - else - { - GetRootControl ((WindowRef) parentWindowOrView, (ControlRef*) &parentView); - - if (parentView == 0) - CreateRootControl ((WindowRef) parentWindowOrView, (ControlRef*) &parentView); - } - - // It seems that the only way to successfully position our overlaid window is by putting a dummy - // HIView into the host's carbon window, and then catching events to see when it gets repositioned - HIViewRef dummyView = 0; - HIImageViewCreate (0, &dummyView); - HIRect r = { {0, 0}, { (float) comp->getWidth(), (float) comp->getHeight()} }; - HIViewSetFrame (dummyView, &r); - HIViewAddSubview (parentView, dummyView); - comp->getProperties().set ("dummyViewRef", String::toHexString ((pointer_sized_int) (void*) dummyView)); - - EventHandlerRef ref; - const EventTypeSpec kControlBoundsChangedEvent = { kEventClassControl, kEventControlBoundsChanged }; - InstallEventHandler (GetControlEventTarget (dummyView), - NewEventHandlerUPP (viewBoundsChangedEvent), - 1, - &kControlBoundsChangedEvent, - (void*) comp, - &ref); - comp->getProperties().set ("boundsEventRef", String::toHexString ((pointer_sized_int) (void*) ref)); - - updateEditorCompBoundsVST (comp); - - const auto defaultFlags = - #if ! JucePlugin_EditorRequiresKeyboardFocus - ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses; - #else - ComponentPeer::windowIsTemporary; - #endif - comp->addToDesktop (desktopFlags | defaultFlags); - - comp->setVisible (true); - comp->toFront (false); - - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* pluginWindow = [pluginView window]; - [pluginWindow setExcludedFromWindowsMenu: YES]; - [pluginWindow setCanHide: YES]; - - [hostWindow addChildWindow: pluginWindow - ordered: NSWindowAbove]; - [hostWindow orderFront: nil]; - [pluginWindow orderFront: nil]; - - return hostWindow; - } - #endif - NSView* parentView = [(NSView*) parentWindowOrView retain]; - const auto defaultFlags = - #if JucePlugin_EditorRequiresKeyboardFocus - 0; - #else - ComponentPeer::windowIgnoresKeyPresses; - #endif + const auto defaultFlags = JucePlugin_EditorRequiresKeyboardFocus + ? 0 + : ComponentPeer::windowIgnoresKeyPresses; comp->addToDesktop (desktopFlags | defaultFlags, parentView); // (this workaround is because Wavelab provides a zero-size parent view..) @@ -202,94 +61,22 @@ void* VSTWindowUtilities::attachComponentToWindowRefVST (Component* comp, } } -void VSTWindowUtilities::detachComponentFromWindowRefVST (Component* comp, - void* window, - [[maybe_unused]] bool isNSView) +void VSTWindowUtilities::detachComponentFromWindowRefVST (Component* comp, void* window) { JUCE_AUTORELEASEPOOL { - #if ! JUCE_64BIT - if (! isNSView) - { - EventHandlerRef ref = (EventHandlerRef) (void*) (pointer_sized_int) - comp->getProperties() ["boundsEventRef"].toString().getHexValue64(); - RemoveEventHandler (ref); - - CFUniquePtr dummyView ((HIViewRef) (void*) (pointer_sized_int) - comp->getProperties() ["dummyViewRef"].toString().getHexValue64()); - - if (HIViewIsValid (dummyView.get())) - dummyView = nullptr; - - NSWindow* hostWindow = (NSWindow*) window; - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* pluginWindow = [pluginView window]; - - [pluginView retain]; - [hostWindow removeChildWindow: pluginWindow]; - [pluginWindow close]; - comp->removeFromDesktop(); - [pluginView release]; - - if (shouldManuallyCloseHostWindow()) - [hostWindow close]; - else - [hostWindow release]; - - #if JUCE_MODAL_LOOPS_PERMITTED - static bool needToRunMessageLoop = ! getHostType().isReaper(); - - // The event loop needs to be run between closing the window and deleting the plugin, - // presumably to let the cocoa objects get tidied up. Leaving out this line causes crashes - // in Live when you delete the plugin with its window open. - // (Doing it this way rather than using a single longer timeout means that we can guarantee - // how many messages will be dispatched, which seems to be vital in Reaper) - if (needToRunMessageLoop) - for (int i = 20; --i >= 0;) - MessageManager::getInstance()->runDispatchLoopUntil (1); - #endif - - return; - } - #endif - comp->removeFromDesktop(); [(id) window release]; } } -void VSTWindowUtilities::initialiseMacVST() -{ - #if ! JUCE_64BIT - NSApplicationLoad(); - #endif -} - void VSTWindowUtilities::setNativeHostWindowSizeVST (void* window, Component* component, int newWidth, - int newHeight, - [[maybe_unused]] bool isNSView) + int newHeight) { JUCE_AUTORELEASEPOOL { - #if ! JUCE_64BIT - if (! isNSView) - { - if (HIViewRef dummyView = (HIViewRef) (void*) (pointer_sized_int) - component->getProperties() ["dummyViewRef"].toString().getHexValue64()) - { - HIRect frameRect; - HIViewGetFrame (dummyView, &frameRect); - frameRect.size.width = newWidth; - frameRect.size.height = newHeight; - HIViewSetFrame (dummyView, &frameRect); - } - - return; - } - #endif - if (NSView* hostView = (NSView*) window) { const int dx = newWidth - component->getWidth(); @@ -304,32 +91,6 @@ void VSTWindowUtilities::setNativeHostWindowSizeVST (void* window, } } -void VSTWindowUtilities::checkWindowVisibilityVST ([[maybe_unused]] void* window, - [[maybe_unused]] Component* comp, - [[maybe_unused]] bool isNSView) -{ - #if ! JUCE_64BIT - if (! isNSView) - comp->setVisible ([((NSWindow*) window) isVisible]); - #endif -} - -bool VSTWindowUtilities::forwardCurrentKeyEventToHostVST ([[maybe_unused]] Component* comp, - [[maybe_unused]] bool isNSView) -{ - #if ! JUCE_64BIT - if (! isNSView) - { - NSWindow* win = [(NSView*) comp->getWindowHandle() window]; - [[win parentWindow] makeKeyWindow]; - EventReposter::repostCurrentNSEvent(); - return true; - } - #endif - - return false; -} - } // namespace juce::detail #endif