Fixes #88tags/2021-05-28
| @@ -193,15 +193,6 @@ public: | |||||
| sharedPointer->clearPointer(); | sharedPointer->clearPointer(); | ||||
| } | } | ||||
| /** Returns a raw pointer to the underlying object. */ | |||||
| ObjectType* get() const noexcept | |||||
| { | |||||
| if (sharedPointer != nullptr) | |||||
| return sharedPointer->get(); | |||||
| return nullptr; | |||||
| } | |||||
| private: | private: | ||||
| SharedRef sharedPointer; | SharedRef sharedPointer; | ||||
| @@ -710,13 +710,10 @@ void Component::removeFromDesktop() | |||||
| ComponentPeer* const peer = ComponentPeer::getPeerFor (this); | ComponentPeer* const peer = ComponentPeer::getPeerFor (this); | ||||
| jassert (peer != nullptr); | jassert (peer != nullptr); | ||||
| ScopedPointer<ComponentPeer> oldPeerToDelete (peer); | |||||
| flags.hasHeavyweightPeerFlag = false; | flags.hasHeavyweightPeerFlag = false; | ||||
| Desktop::getInstance().removeDesktopComponent (this); | |||||
| delete peer; | |||||
| if (masterReference.get() != nullptr) | |||||
| internalHierarchyChanged(); | |||||
| Desktop::getInstance().removeDesktopComponent (this); | |||||
| } | } | ||||
| } | } | ||||
| @@ -58,6 +58,10 @@ static NSRect flippedScreenRect (NSRect r) noexcept | |||||
| return r; | return r; | ||||
| } | } | ||||
| #if JUCE_MODULE_AVAILABLE_juce_opengl | |||||
| void componentPeerAboutToBeRemovedFromScreen (ComponentPeer&); | |||||
| #endif | |||||
| //============================================================================== | //============================================================================== | ||||
| class NSViewComponentPeer : public ComponentPeer, | class NSViewComponentPeer : public ComponentPeer, | ||||
| private AsyncUpdater | private AsyncUpdater | ||||
| @@ -674,8 +678,12 @@ public: | |||||
| void redirectWillMoveToWindow (NSWindow* newWindow) | void redirectWillMoveToWindow (NSWindow* newWindow) | ||||
| { | { | ||||
| #if JUCE_MODULE_AVAILABLE_juce_opengl | |||||
| if ([view window] == window && newWindow == nullptr) | if ([view window] == window && newWindow == nullptr) | ||||
| getComponent().removeFromDesktop(); | |||||
| componentPeerAboutToBeRemovedFromScreen (*this); | |||||
| #else | |||||
| ignoreUnused (newWindow); | |||||
| #endif | |||||
| } | } | ||||
| void sendMouseEvent (NSEvent* ev) | void sendMouseEvent (NSEvent* ev) | ||||
| @@ -199,12 +199,10 @@ void NSViewComponent::setView (void* const view) | |||||
| { | { | ||||
| if (view != getView()) | if (view != getView()) | ||||
| { | { | ||||
| ReferenceCountedObject* object = nullptr; | |||||
| attachment = nullptr; | |||||
| if (view != nullptr) | if (view != nullptr) | ||||
| object = attachViewToComponent (*this, view); | |||||
| attachment = object; | |||||
| attachment = attachViewToComponent (*this, view); | |||||
| } | } | ||||
| } | } | ||||
| @@ -243,3 +243,23 @@ bool OpenGLHelpers::isContextActive() | |||||
| { | { | ||||
| return CGLGetCurrentContext() != 0; | return CGLGetCurrentContext() != 0; | ||||
| } | } | ||||
| //============================================================================== | |||||
| void componentPeerAboutToBeRemovedFromScreen (ComponentPeer& peer) | |||||
| { | |||||
| Array<Component*> stack; | |||||
| stack.add (&peer.getComponent()); | |||||
| while (stack.size() != 0) | |||||
| { | |||||
| Component& comp = *stack.removeAndReturn (0); | |||||
| const int n = comp.getNumChildComponents(); | |||||
| for (int i = 0; i < n; ++i) | |||||
| if (Component* child = comp.getChildComponent (i)) | |||||
| stack.add (child); | |||||
| if (OpenGLContext* context = OpenGLContext::getContextAttachedTo (comp)) | |||||
| context->detach(); | |||||
| } | |||||
| } | |||||