diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index 31e2dd1757..47e838e082 100644 --- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -1528,10 +1528,14 @@ private: // if something in a paint handler calls, e.g. a message box, this can become reentrant and // corrupt the image it's using to paint into, so do a check here. static bool reentrant = false; - if (! (reentrant || dontRepaint)) + if (! reentrant) { const ScopedValueSetter setter (reentrant, true, false); - performPaint (dc, rgn, regionType, paintStruct); + + if (dontRepaint) + component.handleCommandMessage (0); // (this triggers a repaint in the openGL context) + else + performPaint (dc, rgn, regionType, paintStruct); } DeleteObject (rgn); @@ -2896,18 +2900,15 @@ private: ModifierKeys HWNDComponentPeer::currentModifiers; ModifierKeys HWNDComponentPeer::modifiersAtLastCallback; -ComponentPeer* Component::createNewPeer (int styleFlags, void* nativeWindowToAttachTo) +ComponentPeer* Component::createNewPeer (int styleFlags, void* parentHWND) { - return new HWNDComponentPeer (*this, styleFlags, - (HWND) nativeWindowToAttachTo, false); + return new HWNDComponentPeer (*this, styleFlags, (HWND) parentHWND, false); } -ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component* component, void* parent) +ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component& component, void* parentHWND) { - jassert (component != nullptr); - - return new HWNDComponentPeer (*component, ComponentPeer::windowIgnoresMouseClicks, - (HWND) parent, true); + return new HWNDComponentPeer (component, ComponentPeer::windowIgnoresMouseClicks, + (HWND) parentHWND, true); } diff --git a/modules/juce_opengl/native/juce_OpenGL_win32.h b/modules/juce_opengl/native/juce_OpenGL_win32.h index c0999d02f0..5e38430c95 100644 --- a/modules/juce_opengl/native/juce_OpenGL_win32.h +++ b/modules/juce_opengl/native/juce_OpenGL_win32.h @@ -22,7 +22,7 @@ ============================================================================== */ -extern ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component*, void* parent); +extern ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component&, void* parent); //============================================================================== class OpenGLContext::NativeContext @@ -33,7 +33,9 @@ public: void* contextToShareWith, bool /*useMultisampling*/, OpenGLVersion) + : context (nullptr) { + dummyComponent = new DummyComponent (*this); createNativeWindow (component); PIXELFORMATDESCRIPTOR pfd; @@ -82,8 +84,8 @@ public: releaseDC(); } - void initialiseOnRenderThread (OpenGLContext&) {} - void shutdownOnRenderThread() { deactivateCurrentContext(); } + void initialiseOnRenderThread (OpenGLContext& c) { context = &c; } + void shutdownOnRenderThread() { deactivateCurrentContext(); context = nullptr; } static void deactivateCurrentContext() { wglMakeCurrent (0, 0); } bool makeActive() const noexcept { return isActive() || wglMakeCurrent (dc, renderContext) != FALSE; } @@ -114,13 +116,30 @@ public: void* getRawContext() const noexcept { return renderContext; } unsigned int getFrameBufferID() const noexcept { return 0; } + void triggerRepaint() + { + if (context != nullptr) + context->triggerRepaint(); + } + struct Locker { Locker (NativeContext&) {} }; private: - Component dummyComponent; + struct DummyComponent : public Component + { + DummyComponent (NativeContext& c) : context (c) {} + + // The windowing code will call this when a paint callback happens + void handleCommandMessage (int) override { context.triggerRepaint(); } + + NativeContext& context; + }; + + ScopedPointer dummyComponent; ScopedPointer nativeWindow; HGLRC renderContext; HDC dc; + OpenGLContext* context; #define JUCE_DECLARE_WGL_EXTENSION_FUNCTION(name, returnType, params) \ typedef returnType (__stdcall *type_ ## name) params; type_ ## name name; @@ -142,7 +161,7 @@ private: void createNativeWindow (Component& component) { Component* topComp = component.getTopLevelComponent(); - nativeWindow = createNonRepaintingEmbeddedWindowsPeer (&dummyComponent, topComp->getWindowHandle()); + nativeWindow = createNonRepaintingEmbeddedWindowsPeer (*dummyComponent, topComp->getWindowHandle()); if (ComponentPeer* peer = topComp->getPeer()) updateWindowPosition (peer->getAreaCoveredBy (component));