1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

OpenGL: Ensure context is initially drawn with correct scale on macOS

This commit is contained in:
reuk 2021-12-02 17:32:55 +00:00
parent fc0f6b1f2f
commit c5c9f080d3
No known key found for this signature in database
GPG key ID: FCB43929F012EE5C

View file

@ -311,13 +311,16 @@ public:
const auto displayScale = [this]
{
if (auto* wrapper = cvDisplayLinkWrapper.get())
{
if (auto* screen = wrapper->updateAndReturnActiveDisplay())
{
if (wrapper->updateActiveDisplay())
nativeContext->setNominalVideoRefreshPeriodS (wrapper->getNominalVideoRefreshPeriodS());
return [screen backingScaleFactor];
}
if (auto* view = getCurrentView())
{
if ([view respondsToSelector: @selector (backingScaleFactor)])
return [(id) view backingScaleFactor];
if (auto* window = [view window])
return [window backingScaleFactor];
}
return scale;
@ -586,7 +589,7 @@ public:
#if JUCE_MAC
cvDisplayLinkWrapper = std::make_unique<CVDisplayLinkWrapper> (*this);
cvDisplayLinkWrapper->updateAndReturnActiveDisplay();
cvDisplayLinkWrapper->updateActiveDisplay();
nativeContext->setNominalVideoRefreshPeriodS (cvDisplayLinkWrapper->getNominalVideoRefreshPeriodS());
#endif
@ -723,6 +726,23 @@ public:
uint32 lastMMLockReleaseTime = 0;
#if JUCE_MAC
NSView* getCurrentView() const
{
if (auto* peer = component.getPeer())
return static_cast<NSView*> (peer->getNativeHandle());
return nullptr;
}
NSScreen* getCurrentScreen() const
{
if (auto* view = getCurrentView())
if (auto* window = [view window])
return [window screen];
return nullptr;
}
struct CVDisplayLinkWrapper
{
explicit CVDisplayLinkWrapper (CachedImage& cachedImageIn)
@ -744,30 +764,20 @@ public:
return 0.0;
}
NSScreen* getCurrentScreen() const
/* Returns true if updated, or false otherwise. */
bool updateActiveDisplay()
{
if (auto* peer = cachedImage.component.getPeer())
if (auto* view = static_cast<NSView*> (peer->getNativeHandle()))
if (auto* window = [view window])
return [window screen];
return nullptr;
}
/* If updated, returns the new screen, or nullptr otherwise. */
NSScreen* updateAndReturnActiveDisplay()
{
auto* oldScreen = std::exchange (currentScreen, getCurrentScreen());
auto* oldScreen = std::exchange (currentScreen, cachedImage.getCurrentScreen());
if (oldScreen == currentScreen)
return nullptr;
return false;
for (NSScreen* screen in [NSScreen screens])
if (screen == currentScreen)
if (NSNumber* number = [[screen deviceDescription] objectForKey: @"NSScreenNumber"])
CVDisplayLinkSetCurrentCGDisplay (displayLink, [number unsignedIntValue]);
return currentScreen;
return true;
}
~CVDisplayLinkWrapper()