From c7b347242d49dd653aadd9783384985305b03403 Mon Sep 17 00:00:00 2001 From: hogliux Date: Thu, 11 Aug 2016 10:50:36 +0100 Subject: [PATCH] Partially undo commits #99186e5 and #89d938d and use less-intrusive, JUCE-internal fix for OpenGLContext detach crash Fixes #88 --- modules/juce_core/memory/juce_WeakReference.h | 9 --------- .../components/juce_Component.cpp | 7 ++----- .../native/juce_mac_NSViewComponentPeer.mm | 10 +++++++++- .../native/juce_mac_NSViewComponent.mm | 6 ++---- modules/juce_opengl/native/juce_OpenGL_osx.h | 20 +++++++++++++++++++ 5 files changed, 33 insertions(+), 19 deletions(-) diff --git a/modules/juce_core/memory/juce_WeakReference.h b/modules/juce_core/memory/juce_WeakReference.h index 7f18c18acb07..ca3dd1fb2716 100644 --- a/modules/juce_core/memory/juce_WeakReference.h +++ b/modules/juce_core/memory/juce_WeakReference.h @@ -193,15 +193,6 @@ class WeakReference sharedPointer->clearPointer(); } - /** Returns a raw pointer to the underlying object. */ - ObjectType* get() const noexcept - { - if (sharedPointer != nullptr) - return sharedPointer->get(); - - return nullptr; - } - private: SharedRef sharedPointer; diff --git a/modules/juce_gui_basics/components/juce_Component.cpp b/modules/juce_gui_basics/components/juce_Component.cpp index f1911a867bc1..3f13fbbe9e6f 100644 --- a/modules/juce_gui_basics/components/juce_Component.cpp +++ b/modules/juce_gui_basics/components/juce_Component.cpp @@ -710,13 +710,10 @@ void Component::removeFromDesktop() ComponentPeer* const peer = ComponentPeer::getPeerFor (this); jassert (peer != nullptr); - ScopedPointer oldPeerToDelete (peer); - flags.hasHeavyweightPeerFlag = false; - Desktop::getInstance().removeDesktopComponent (this); + delete peer; - if (masterReference.get() != nullptr) - internalHierarchyChanged(); + Desktop::getInstance().removeDesktopComponent (this); } } diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index 87afb9f6b3f8..b7ffc6986130 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -58,6 +58,10 @@ static NSRect flippedScreenRect (NSRect r) noexcept return r; } +#if JUCE_MODULE_AVAILABLE_juce_opengl +void componentPeerAboutToBeRemovedFromScreen (ComponentPeer&); +#endif + //============================================================================== class NSViewComponentPeer : public ComponentPeer, private AsyncUpdater @@ -674,8 +678,12 @@ void redirectMagnify (NSEvent* ev) void redirectWillMoveToWindow (NSWindow* newWindow) { + #if JUCE_MODULE_AVAILABLE_juce_opengl if ([view window] == window && newWindow == nullptr) - getComponent().removeFromDesktop(); + componentPeerAboutToBeRemovedFromScreen (*this); + #else + ignoreUnused (newWindow); + #endif } void sendMouseEvent (NSEvent* ev) diff --git a/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm b/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm index e2412c9e2c70..01ab9d31ec57 100644 --- a/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm +++ b/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm @@ -199,12 +199,10 @@ void removeFromParent() { if (view != getView()) { - ReferenceCountedObject* object = nullptr; + attachment = nullptr; if (view != nullptr) - object = attachViewToComponent (*this, view); - - attachment = object; + attachment = attachViewToComponent (*this, view); } } diff --git a/modules/juce_opengl/native/juce_OpenGL_osx.h b/modules/juce_opengl/native/juce_OpenGL_osx.h index aa2c71e03814..3f34ef7e4d7c 100644 --- a/modules/juce_opengl/native/juce_OpenGL_osx.h +++ b/modules/juce_opengl/native/juce_OpenGL_osx.h @@ -243,3 +243,23 @@ bool OpenGLHelpers::isContextActive() { return CGLGetCurrentContext() != 0; } + +//============================================================================== +void componentPeerAboutToBeRemovedFromScreen (ComponentPeer& peer) +{ + Array 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(); + } +}