diff --git a/src/SFML/Window/OSX/SFWindowController.h b/src/SFML/Window/OSX/SFWindowController.h index 4435ad07..3736b92a 100644 --- a/src/SFML/Window/OSX/SFWindowController.h +++ b/src/SFML/Window/OSX/SFWindowController.h @@ -55,6 +55,7 @@ namespace sf { NSWindow* m_window; ///< Underlying Cocoa window to be controlled SFOpenGLView* m_oglView; ///< OpenGL view for rendering sf::priv::WindowImplCocoa* m_requester; ///< Requester + BOOL m_fullscreen; ///< Indicate whether the window is fullscreen or not } //////////////////////////////////////////////////////////// diff --git a/src/SFML/Window/OSX/SFWindowController.mm b/src/SFML/Window/OSX/SFWindowController.mm index da2cac36..d642543b 100644 --- a/src/SFML/Window/OSX/SFWindowController.mm +++ b/src/SFML/Window/OSX/SFWindowController.mm @@ -32,6 +32,7 @@ #include #include #include +#include #import #import @@ -145,8 +146,9 @@ m_window = nil; m_oglView = nil; m_requester = 0; + m_fullscreen = (style & sf::Style::Fullscreen); - if (style & sf::Style::Fullscreen) + if (m_fullscreen) [self setupFullscreenViewWithMode:mode]; else [self setupWindowWithMode:mode andStyle:style]; @@ -203,9 +205,11 @@ } // Create our OpenGL view size and the view - CGFloat x = (desktop.width - mode.width) / 2.0; - CGFloat y = (desktop.height - mode.height) / 2.0; - NSRect oglRect = NSMakeRect(x, y, mode.width, mode.height); + CGFloat width = std::min(mode.width, desktop.width); + CGFloat height = std::min(mode.height, desktop.height); + CGFloat x = (desktop.width - width) / 2.0; + CGFloat y = (desktop.height - height) / 2.0; + NSRect oglRect = NSMakeRect(x, y, width, height); m_oglView = [[SFOpenGLView alloc] initWithFrame:oglRect fullscreen:YES]; @@ -387,37 +391,57 @@ //////////////////////////////////////////////////////// -(void)resizeTo:(unsigned int)width by:(unsigned int)height { - // Before resizing, remove resizable mask to be able to resize - // beyond the desktop boundaries. - NSUInteger styleMask = [m_window styleMask]; - - [m_window setStyleMask:styleMask ^ NSResizableWindowMask]; - - // Add titlebar height. - height += [self titlebarHeight]; - - // Corner case: don't set the window height bigger than the screen height - // or the view will be resized _later_ without generating a resize event. - NSRect screenFrame = [[NSScreen mainScreen] visibleFrame]; - CGFloat maxVisibleHeight = screenFrame.size.height; - if (height > maxVisibleHeight) + if (m_fullscreen) { - height = maxVisibleHeight; + // Special case when fullscreen: only resize the opengl view + // and make sure the requested size is not bigger than the window. + sf::VideoMode desktop = sf::VideoMode::getDesktopMode(); + sf::priv::scaleInWidthHeight(desktop, nil); - // The size is not the requested one, we fire an event - if (m_requester != 0) - m_requester->windowResized(width, height - [self titlebarHeight]); + width = std::min(width, desktop.width); + height = std::min(height, desktop.height); + + CGFloat x = (desktop.width - width) / 2.0; + CGFloat y = (desktop.height - height) / 2.0; + NSRect oglRect = NSMakeRect(x, y, width, height); + + [m_oglView setFrame:oglRect]; + [m_oglView setNeedsDisplay:YES]; } + else + { + // Before resizing, remove resizable mask to be able to resize + // beyond the desktop boundaries. + NSUInteger styleMask = [m_window styleMask]; - NSRect frame = NSMakeRect([m_window frame].origin.x, - [m_window frame].origin.y, - width, - height); + [m_window setStyleMask:styleMask ^ NSResizableWindowMask]; - [m_window setFrame:frame display:YES]; + // Add titlebar height. + height += [self titlebarHeight]; - // And restore the mask - [m_window setStyleMask:styleMask]; + // Corner case: don't set the window height bigger than the screen height + // or the view will be resized _later_ without generating a resize event. + NSRect screenFrame = [[NSScreen mainScreen] visibleFrame]; + CGFloat maxVisibleHeight = screenFrame.size.height; + if (height > maxVisibleHeight) + { + height = maxVisibleHeight; + + // The size is not the requested one, we fire an event + if (m_requester != 0) + m_requester->windowResized(width, height - [self titlebarHeight]); + } + + NSRect frame = NSMakeRect([m_window frame].origin.x, + [m_window frame].origin.y, + width, + height); + + [m_window setFrame:frame display:YES]; + + // And restore the mask + [m_window setStyleMask:styleMask]; + } }