| @@ -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<int> 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; | |||
| @@ -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<Component> 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> (&component); | |||
| nativeScaleFactor = peer->getPlatformScaleFactor(); | |||
| startTimer (50); | |||
| #endif | |||
| nativeScaleFactor = peer->getPlatformScaleFactor(); | |||
| updateWindowPosition (peer->getAreaCoveredBy (component)); | |||
| peer->addScaleFactorListener (this); | |||
| } | |||
| nativeWindow->setVisible (true); | |||
| @@ -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) | |||
| { | |||