| @@ -4020,6 +4020,11 @@ JUCE_API ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component& compo | |||||
| (HWND) parentHWND, true); | (HWND) parentHWND, true); | ||||
| } | } | ||||
| JUCE_API bool shouldScaleGLWindow (void* hwnd) | |||||
| { | |||||
| return isPerMonitorDPIAwareWindow ((HWND) hwnd); | |||||
| } | |||||
| JUCE_IMPLEMENT_SINGLETON (HWNDComponentPeer::WindowClassHolder) | JUCE_IMPLEMENT_SINGLETON (HWNDComponentPeer::WindowClassHolder) | ||||
| //============================================================================== | //============================================================================== | ||||
| @@ -28,6 +28,7 @@ namespace juce | |||||
| { | { | ||||
| extern ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component&, void* parent); | extern ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component&, void* parent); | ||||
| extern bool shouldScaleGLWindow (void* hwnd); | |||||
| //============================================================================== | //============================================================================== | ||||
| class OpenGLContext::NativeContext | class OpenGLContext::NativeContext | ||||
| @@ -160,6 +161,14 @@ public: | |||||
| } | } | ||||
| #endif | #endif | ||||
| double getWindowScaleFactor (const Rectangle<int>& screenBounds) | |||||
| { | |||||
| if (nativeWindow != nullptr && shouldScaleGLWindow (nativeWindow->getNativeHandle())) | |||||
| return Desktop::getInstance().getDisplays().findDisplayForRect (screenBounds).scale; | |||||
| return 1.0; | |||||
| } | |||||
| private: | private: | ||||
| struct DummyComponent : public Component | struct DummyComponent : public Component | ||||
| { | { | ||||
| @@ -280,15 +280,14 @@ public: | |||||
| { | { | ||||
| if (auto* peer = component.getPeer()) | if (auto* peer = component.getPeer()) | ||||
| { | { | ||||
| lastScreenBounds = component.getTopLevelComponent()->getScreenBounds(); | |||||
| auto newScale = Desktop::getInstance().getDisplays().findDisplayForRect (lastScreenBounds).scale; | |||||
| #if JUCE_WINDOWS | |||||
| auto newScale = nativeContext->getWindowScaleFactor (component.getTopLevelComponent()->getScreenBounds()); | |||||
| #else | |||||
| auto newScale = Desktop::getInstance().getDisplays().findDisplayForRect (component.getTopLevelComponent()->getScreenBounds()).scale; | |||||
| #endif | |||||
| auto localBounds = component.getLocalBounds(); | auto localBounds = component.getLocalBounds(); | ||||
| auto newArea = peer->getComponent().getLocalArea (&component, localBounds) | |||||
| .withZeroOrigin() | |||||
| * newScale; | |||||
| auto newArea = peer->getComponent().getLocalArea (&component, localBounds).withZeroOrigin() * newScale; | |||||
| if (scale != newScale || viewportArea != newArea) | if (scale != newScale || viewportArea != newArea) | ||||
| { | { | ||||