diff --git a/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp b/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp index 5db925ed6f..54da2726f9 100644 --- a/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp +++ b/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp @@ -237,10 +237,8 @@ namespace ActiveXHelpers } //============================================================================== -class ActiveXControlComponent::Pimpl : public ComponentMovementWatcher - #if JUCE_WIN_PER_MONITOR_DPI_AWARE - , public ComponentPeer::ScaleFactorListener - #endif +class ActiveXControlComponent::Pimpl : public ComponentMovementWatcher, + public ComponentPeer::ScaleFactorListener { public: Pimpl (HWND hwnd, ActiveXControlComponent& activeXComp) @@ -262,25 +260,19 @@ public: clientSite->Release(); storage->Release(); - #if JUCE_WIN_PER_MONITOR_DPI_AWARE - for (int i = 0; i < ComponentPeer::getNumPeers(); ++i) - if (auto* peer = ComponentPeer::getPeer (i)) - peer->removeScaleFactorListener (this); - #endif + if (currentPeer != nullptr) + currentPeer->removeScaleFactorListener (this); } void setControlBounds (Rectangle newBounds) const { if (controlHWND != nullptr) { - #if JUCE_WIN_PER_MONITOR_DPI_AWARE if (auto* peer = owner.getTopLevelComponent()->getPeer()) newBounds = (newBounds.toDouble() * peer->getPlatformScaleFactor()).toNearestInt(); - #endif MoveWindow (controlHWND, newBounds.getX(), newBounds.getY(), newBounds.getWidth(), newBounds.getHeight(), TRUE); } - } void setControlVisible (bool shouldBeVisible) const @@ -300,12 +292,15 @@ public: void componentPeerChanged() override { + if (currentPeer != nullptr) + currentPeer->removeScaleFactorListener (this); + componentMovedOrResized (true, true); - #if JUCE_WIN_PER_MONITOR_DPI_AWARE - if (auto* peer = owner.getTopLevelComponent()->getPeer()) - peer->addScaleFactorListener (this); - #endif + currentPeer = owner.getTopLevelComponent()->getPeer(); + + if (currentPeer != nullptr) + currentPeer->addScaleFactorListener (this); } using ComponentMovementWatcher::componentVisibilityChanged; @@ -316,12 +311,10 @@ public: componentPeerChanged(); } - #if JUCE_WIN_PER_MONITOR_DPI_AWARE void nativeScaleFactorChanged (double /*newScaleFactor*/) override { componentMovedOrResized (true, true); } - #endif // intercepts events going to an activeX control, so we can sneakily use the mouse events static LRESULT CALLBACK activeXHookWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) @@ -366,6 +359,7 @@ public: } ActiveXControlComponent& owner; + ComponentPeer* currentPeer = nullptr; HWND controlHWND = {}; IStorage* storage = nullptr; ActiveXHelpers::JuceIOleClientSite* clientSite = nullptr; diff --git a/modules/juce_opengl/native/juce_OpenGL_win32.h b/modules/juce_opengl/native/juce_OpenGL_win32.h index 9829481239..1e7121afb6 100644 --- a/modules/juce_opengl/native/juce_OpenGL_win32.h +++ b/modules/juce_opengl/native/juce_OpenGL_win32.h @@ -29,10 +29,7 @@ namespace juce extern ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component&, void* parent); //============================================================================== -class OpenGLContext::NativeContext - #if JUCE_WIN_PER_MONITOR_DPI_AWARE - : private Timer - #endif +class OpenGLContext::NativeContext : private ComponentPeer::ScaleFactorListener { public: NativeContext (Component& component, @@ -89,6 +86,10 @@ public: { deleteRenderContext(); releaseDC(); + + if (safeComponent != nullptr) + if (auto* peer = safeComponent->getTopLevelComponent()->getPeer()) + peer->removeScaleFactorListener (this); } bool initialiseOnRenderThread (OpenGLContext& c) @@ -173,11 +174,8 @@ private: HDC dc; OpenGLContext* context = {}; - double nativeScaleFactor = 1.0; - - #if JUCE_WIN_PER_MONITOR_DPI_AWARE Component::SafePointer safeComponent; - #endif + double nativeScaleFactor = 1.0; #define JUCE_DECLARE_WGL_EXTENSION_FUNCTION(name, returnType, params) \ typedef returnType (__stdcall *type_ ## name) params; type_ ## name name; @@ -187,24 +185,18 @@ private: JUCE_DECLARE_WGL_EXTENSION_FUNCTION (wglGetSwapIntervalEXT, int, ()) #undef JUCE_DECLARE_WGL_EXTENSION_FUNCTION - #if JUCE_WIN_PER_MONITOR_DPI_AWARE - void timerCallback() override + void nativeScaleFactorChanged (double newScaleFactor) override { - if (safeComponent != nullptr) - { - if (auto* peer = safeComponent->getTopLevelComponent()->getPeer()) - { - auto newScale = peer->getPlatformScaleFactor(); + if (approximatelyEqual (newScaleFactor, nativeScaleFactor) + || safeComponent == nullptr) + return; - if (! approximatelyEqual (newScale, nativeScaleFactor)) - { - nativeScaleFactor = newScale; - updateWindowPosition (peer->getAreaCoveredBy (*safeComponent)); - } - } + if (auto* peer = safeComponent->getTopLevelComponent()->getPeer()) + { + nativeScaleFactor = newScaleFactor; + updateWindowPosition (peer->getAreaCoveredBy (*safeComponent)); } } - #endif void initialiseGLExtensions() { @@ -228,14 +220,11 @@ private: if (auto* peer = topComp->getPeer()) { - #if JUCE_WIN_PER_MONITOR_DPI_AWARE safeComponent = Component::SafePointer (&component); + nativeScaleFactor = peer->getPlatformScaleFactor(); - - startTimer (50); - #endif - updateWindowPosition (peer->getAreaCoveredBy (component)); + peer->addScaleFactorListener (this); } nativeWindow->setVisible (true); diff --git a/modules/juce_video/native/juce_win32_Video.h b/modules/juce_video/native/juce_win32_Video.h index 4a5dfbf12f..36d474f4a3 100644 --- a/modules/juce_video/native/juce_win32_Video.h +++ b/modules/juce_video/native/juce_win32_Video.h @@ -158,14 +158,11 @@ namespace VideoRenderers } //============================================================================== -struct VideoComponent::Pimpl : public Component - #if JUCE_WIN_PER_MONITOR_DPI_AWARE - , public ComponentPeer::ScaleFactorListener - #endif +struct VideoComponent::Pimpl : public Component, + private ComponentPeer::ScaleFactorListener { Pimpl (VideoComponent& ownerToUse, bool) - : owner (ownerToUse), - videoLoaded (false) + : owner (ownerToUse) { setOpaque (true); context.reset (new DirectShowContext (*this)); @@ -178,11 +175,8 @@ struct VideoComponent::Pimpl : public Component context = nullptr; componentWatcher = nullptr; - #if JUCE_WIN_PER_MONITOR_DPI_AWARE - for (int i = 0; i < ComponentPeer::getNumPeers(); ++i) - if (auto* peer = ComponentPeer::getPeer (i)) - peer->removeScaleFactorListener (this); - #endif + if (currentPeer != nullptr) + currentPeer->removeScaleFactorListener (this); } Result loadFromString (const String& fileOrURLPath) @@ -309,7 +303,8 @@ struct VideoComponent::Pimpl : public Component if (getWidth() > 0 && getHeight() > 0) if (auto* peer = getTopLevelComponent()->getPeer()) - context->updateWindowPosition ((peer->getAreaCoveredBy (*this).toDouble() * peer->getPlatformScaleFactor()).toNearestInt()); + context->updateWindowPosition ((peer->getAreaCoveredBy (*this).toDouble() + * peer->getPlatformScaleFactor()).toNearestInt()); } void updateContextVisibility() @@ -341,21 +336,20 @@ struct VideoComponent::Pimpl : public Component owner.onErrorOccurred (errorMessage); } - #if JUCE_WIN_PER_MONITOR_DPI_AWARE - void nativeScaleFactorChanged (double /*newScaleFactor*/) override - { - if (videoLoaded) - updateContextPosition(); - } - #endif - File currentFile; URL currentURL; private: VideoComponent& owner; + ComponentPeer* currentPeer = nullptr; + bool videoLoaded = false; - bool videoLoaded; + //============================================================================== + void nativeScaleFactorChanged (double /*newScaleFactor*/) override + { + if (videoLoaded) + updateContextPosition(); + } //============================================================================== struct ComponentWatcher : public ComponentMovementWatcher @@ -372,6 +366,9 @@ private: void componentPeerChanged() override { + if (owner.currentPeer != nullptr) + owner.currentPeer->removeScaleFactorListener (&owner); + if (owner.videoLoaded) owner.recreateNativeWindowAsync(); } @@ -771,10 +768,8 @@ private: nativeWindow.reset (new NativeWindow ((HWND) topLevelPeer->getNativeHandle(), this)); hwnd = nativeWindow->hwnd; - - #if JUCE_WIN_PER_MONITOR_DPI_AWARE - topLevelPeer->addScaleFactorListener (&component); - #endif + component.currentPeer = topLevelPeer; + component.currentPeer->addScaleFactorListener (&component); if (hwnd != nullptr) {