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:
parent
fc0f6b1f2f
commit
c5c9f080d3
1 changed files with 31 additions and 21 deletions
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue