Browse Source

macOS: Correctly populate display safeAreaInsets on macOS

v7.0.9
reuk 2 years ago
parent
commit
384ddee376
No known key found for this signature in database GPG Key ID: FCB43929F012EE5C
3 changed files with 26 additions and 23 deletions
  1. +9
    -0
      modules/juce_gui_basics/detail/juce_WindowingHelpers.h
  2. +6
    -23
      modules/juce_gui_basics/native/juce_Windowing_ios.mm
  3. +11
    -0
      modules/juce_gui_basics/native/juce_Windowing_mac.mm

+ 9
- 0
modules/juce_gui_basics/detail/juce_WindowingHelpers.h View File

@@ -47,6 +47,15 @@ struct WindowingHelpers
{
return Process::isForegroundProcess() || isEmbeddedInForegroundProcess (viewComponent);
}
template <typename Value>
static BorderSize<int> roundToInt (BorderSize<Value> border)
{
return { ::juce::roundToInt (border.getTop()),
::juce::roundToInt (border.getLeft()),
::juce::roundToInt (border.getBottom()),
::juce::roundToInt (border.getRight()) };
}
};
} // namespace juce::detail

+ 6
- 23
modules/juce_gui_basics/native/juce_Windowing_ios.mm View File

@@ -599,24 +599,6 @@ Desktop::DisplayOrientation Desktop::getCurrentOrientation() const
return Orientations::convertToJuce (orientation);
}
template <typename Value>
static BorderSize<Value> operator/ (BorderSize<Value> border, Value scale)
{
return { border.getTop() / scale,
border.getLeft() / scale,
border.getBottom() / scale,
border.getRight() / scale };
}
template <typename Value>
static BorderSize<int> roundToInt (BorderSize<Value> border)
{
return { roundToInt (border.getTop()),
roundToInt (border.getLeft()),
roundToInt (border.getBottom()),
roundToInt (border.getRight()) };
}
// The most straightforward way of retrieving the screen area available to an iOS app
// seems to be to create a new window (which will take up all available space) and to
// query its frame.
@@ -636,10 +618,10 @@ static BorderSize<int> getSafeAreaInsets (float masterScale)
if (@available (iOS 11.0, *))
{
UIEdgeInsets safeInsets = TemporaryWindow().window.safeAreaInsets;
return roundToInt (BorderSize<double> { safeInsets.top,
safeInsets.left,
safeInsets.bottom,
safeInsets.right } / (double) masterScale);
return detail::WindowingHelpers::roundToInt (BorderSize<double> { safeInsets.top,
safeInsets.left,
safeInsets.bottom,
safeInsets.right }.multipliedBy (1.0 / (double) masterScale));
}
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")
@@ -746,7 +728,8 @@ void Displays::findDisplays (float masterScale)
d.totalArea = convertToRectInt ([s bounds]) / masterScale;
d.userArea = getRecommendedWindowBounds() / masterScale;
d.safeAreaInsets = getSafeAreaInsets (masterScale);
d.keyboardInsets = roundToInt (keyboardChangeDetector.getInsets() / (double) masterScale);
const auto scaledInsets = keyboardChangeDetector.getInsets().multipliedBy (1.0 / (double) masterScale);
d.keyboardInsets = detail::WindowingHelpers::roundToInt (scaledInsets);
d.isMain = true;
d.scale = masterScale * s.scale;
d.dpi = 160 * d.scale;


+ 11
- 0
modules/juce_gui_basics/native/juce_Windowing_mac.mm View File

@@ -446,6 +446,17 @@ static Displays::Display getDisplayFromScreen (NSScreen* s, CGFloat& mainScreenB
NSSize dpi = [[[s deviceDescription] objectForKey: NSDeviceResolution] sizeValue];
d.dpi = (dpi.width + dpi.height) / 2.0;
#if defined (MAC_OS_VERSION_12_0) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_12_0
if (@available (macOS 12.0, *))
{
const auto safeInsets = [s safeAreaInsets];
d.safeAreaInsets = detail::WindowingHelpers::roundToInt (BorderSize<double> { safeInsets.top,
safeInsets.left,
safeInsets.bottom,
safeInsets.right }.multipliedBy (1.0 / (double) masterScale));
}
#endif
return d;
}


Loading…
Cancel
Save