Improve high DPI handling on macOS

This commit is contained in:
jqdg 2021-08-15 09:27:32 -07:00 committed by Lukas Dürrenberger
parent 600d0f3baf
commit 2888d9c56e
5 changed files with 25 additions and 12 deletions

View File

@ -78,6 +78,7 @@ namespace sf {
BOOL m_cursorGrabbed; ///< Is the mouse cursor trapped? BOOL m_cursorGrabbed; ///< Is the mouse cursor trapped?
CGFloat m_deltaXBuffer; ///< See note about cursor grabbing above CGFloat m_deltaXBuffer; ///< See note about cursor grabbing above
CGFloat m_deltaYBuffer; ///< See note about cursor grabbing above CGFloat m_deltaYBuffer; ///< See note about cursor grabbing above
BOOL m_highDpi; ///< Is high-DPI enabled?
// Hidden text view used to convert key event to actual chars. // Hidden text view used to convert key event to actual chars.
// We use a silent responder to prevent sound alerts. // We use a silent responder to prevent sound alerts.
@ -99,7 +100,7 @@ namespace sf {
/// \return an initialized view /// \return an initialized view
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
-(id)initWithFrame:(NSRect)frameRect fullscreen:(BOOL)isFullscreen; -(id)initWithFrame:(NSRect)frameRect fullscreen:(BOOL)isFullscreen highDpi:(BOOL)isHighDpi;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Finish the creation of the SFML OpenGL view /// \brief Finish the creation of the SFML OpenGL view

View File

@ -86,11 +86,17 @@
//////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
-(id)initWithFrame:(NSRect)frameRect -(id)initWithFrame:(NSRect)frameRect
{ {
return [self initWithFrame:frameRect fullscreen:NO]; return [self initWithFrame:frameRect fullscreen:NO highDpi:NO];
} }
//////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
-(id)initWithFrame:(NSRect)frameRect fullscreen:(BOOL)isFullscreen -(id)initWithFrame:(NSRect)frameRect fullscreen:(BOOL)isFullscreen
{
return [self initWithFrame:frameRect fullscreen:isFullscreen highDpi:NO];
}
////////////////////////////////////////////////////////
-(id)initWithFrame:(NSRect)frameRect fullscreen:(BOOL)isFullscreen highDpi:(BOOL)isHighDpi
{ {
if ((self = [super initWithFrame:frameRect])) if ((self = [super initWithFrame:frameRect]))
{ {
@ -118,8 +124,12 @@
m_hiddenTextView = [[NSTextView alloc] initWithFrame:NSZeroRect]; m_hiddenTextView = [[NSTextView alloc] initWithFrame:NSZeroRect];
[m_hiddenTextView setNextResponder:m_silentResponder]; [m_hiddenTextView setNextResponder:m_silentResponder];
// Request high resolution on high DPI displays // If high DPI is requested, then use high resolution for the OpenGL view.
[self setWantsBestResolutionOpenGLSurface:YES]; // Currently, isHighDpi is always expected to be NO, and so the OpenGL view will render scaled.
// Note: setWantsBestResolutionOpenGLSurface requires YES to work properly, rather than simply non-zero value.
// isHighDpi is an Objective-C BOOL, which can have non-zero values other than YES.
m_highDpi = isHighDpi ? YES : NO;
[self setWantsBestResolutionOpenGLSurface:m_highDpi];
// At that point, the view isn't attached to a window. We defer the rest of // At that point, the view isn't attached to a window. We defer the rest of
// the initialization process to later. // the initialization process to later.
@ -224,7 +234,7 @@
NSWindow* window = [self window]; NSWindow* window = [self window];
NSScreen* screen = window ? [window screen] : [NSScreen mainScreen]; NSScreen* screen = window ? [window screen] : [NSScreen mainScreen];
CGFloat oldScaleFactor = m_scaleFactor; CGFloat oldScaleFactor = m_scaleFactor;
m_scaleFactor = [screen backingScaleFactor]; m_scaleFactor = m_highDpi ? [screen backingScaleFactor] : 1.0;
// Send a resize event if the scaling factor changed // Send a resize event if the scaling factor changed
if ((m_scaleFactor != oldScaleFactor) && (m_requester != 0)) { if ((m_scaleFactor != oldScaleFactor) && (m_requester != 0)) {

View File

@ -62,6 +62,7 @@ namespace sf {
sf::priv::WindowImplCocoa* m_requester; ///< Requester sf::priv::WindowImplCocoa* m_requester; ///< Requester
BOOL m_fullscreen; ///< Indicate whether the window is fullscreen or not BOOL m_fullscreen; ///< Indicate whether the window is fullscreen or not
BOOL m_restoreResize; ///< See note above BOOL m_restoreResize; ///< See note above
BOOL m_highDpi; ///< Support high-DPI rendering or not
} }
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////

View File

@ -99,6 +99,7 @@
m_requester = 0; m_requester = 0;
m_fullscreen = NO; // assuming this is the case... too hard to handle anyway. m_fullscreen = NO; // assuming this is the case... too hard to handle anyway.
m_restoreResize = NO; m_restoreResize = NO;
m_highDpi = NO;
// Retain the window for our own use. // Retain the window for our own use.
m_window = [window retain]; m_window = [window retain];
@ -111,7 +112,8 @@
// Create the view. // Create the view.
m_oglView = [[SFOpenGLView alloc] initWithFrame:[[m_window contentView] frame] m_oglView = [[SFOpenGLView alloc] initWithFrame:[[m_window contentView] frame]
fullscreen:NO]; fullscreen:NO
highDpi:NO];
if (m_oglView == nil) if (m_oglView == nil)
{ {
@ -153,6 +155,7 @@
m_requester = 0; m_requester = 0;
m_fullscreen = (style & sf::Style::Fullscreen); m_fullscreen = (style & sf::Style::Fullscreen);
m_restoreResize = NO; m_restoreResize = NO;
m_highDpi = NO;
if (m_fullscreen) if (m_fullscreen)
[self setupFullscreenViewWithMode:mode]; [self setupFullscreenViewWithMode:mode];
@ -218,7 +221,8 @@
NSRect oglRect = NSMakeRect(x, y, width, height); NSRect oglRect = NSMakeRect(x, y, width, height);
m_oglView = [[SFOpenGLView alloc] initWithFrame:oglRect m_oglView = [[SFOpenGLView alloc] initWithFrame:oglRect
fullscreen:YES]; fullscreen:YES
highDpi:m_highDpi];
if (m_oglView == nil) if (m_oglView == nil)
{ {
@ -277,7 +281,8 @@
// Create the view. // Create the view.
m_oglView = [[SFOpenGLView alloc] initWithFrame:[[m_window contentView] frame] m_oglView = [[SFOpenGLView alloc] initWithFrame:[[m_window contentView] frame]
fullscreen:NO]; fullscreen:NO
highDpi:m_highDpi];
if (m_oglView == nil) if (m_oglView == nil)
{ {

View File

@ -130,9 +130,6 @@ m_showCursor(true)
// Transform the app process. // Transform the app process.
setUpProcess(); setUpProcess();
// Use backing size
scaleInWidthHeight(mode, nil);
m_delegate = [[SFWindowController alloc] initWithMode:mode andStyle:style]; m_delegate = [[SFWindowController alloc] initWithMode:mode andStyle:style];
[m_delegate changeTitle:sfStringToNSString(title)]; [m_delegate changeTitle:sfStringToNSString(title)];
[m_delegate setRequesterTo:this]; [m_delegate setRequesterTo:this];
@ -544,4 +541,3 @@ bool WindowImplCocoa::hasFocus() const
} // namespace priv } // namespace priv
} // namespace sf } // namespace sf