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