Skip to content
Permalink
Browse files

Fixed bug 2534 - Mac: black bar at top of screen in SDL_WINDOW_FULLSC…

…REEN mode

Alex Szpakowski

Patch to fix the y component of the position of fullscreen windows in OS X.

In Mac OS X with the latest Mercurial code, when a window is in exclusive-fullscreen the y component of its position is offset by the same amount that is normally taken up by the menubar, resulting in a black bar at the top of the screen.

The recent changes to the internal ConvertNSRect function make it treat the bottom of the menubar as 0 for the y component of window positions, even when the window is fullscreen and 'above' the menubar.

I have attached a patch which fixes the issue by only making the window position relative to the menubar in windowed modes.
  • Loading branch information
slouken committed Jun 2, 2014
1 parent 6b90d7f commit a8fcbc466a66b5ea39be331e79b741f2f5e6d3d4
Showing with 14 additions and 10 deletions.
  1. +14 −10 src/video/cocoa/SDL_cocoawindow.m
@@ -49,6 +49,9 @@
#endif


#define FULLSCREEN_MASK (SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN)


@interface SDLWindow : NSWindow
/* These are needed for borderless/fullscreen windows */
- (BOOL)canBecomeKeyWindow;
@@ -89,9 +92,9 @@ - (void)sendEvent:(NSEvent *)event

static Uint32 s_moveHack;

static void ConvertNSRect(NSScreen *screen, NSRect *r)
static void ConvertNSRect(NSScreen *screen, BOOL fullscreen, NSRect *r)
{
NSRect visibleScreen = [screen visibleFrame];
NSRect visibleScreen = fullscreen ? [screen frame] : [screen visibleFrame];
r->origin.y = (visibleScreen.origin.y + visibleScreen.size.height) - r->origin.y - r->size.height;
}

@@ -412,8 +415,9 @@ - (void)windowDidMove:(NSNotification *)aNotification
int x, y;
SDL_Window *window = _data->window;
NSWindow *nswindow = _data->nswindow;
BOOL fullscreen = window->flags & FULLSCREEN_MASK;
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
ConvertNSRect([nswindow screen], &rect);
ConvertNSRect([nswindow screen], fullscreen, &rect);

if (s_moveHack) {
SDL_bool blockMove = ((SDL_GetTicks() - s_moveHack) < 500);
@@ -424,7 +428,7 @@ - (void)windowDidMove:(NSNotification *)aNotification
/* Cocoa is adjusting the window in response to a mode change */
rect.origin.x = window->x;
rect.origin.y = window->y;
ConvertNSRect([nswindow screen], &rect);
ConvertNSRect([nswindow screen], fullscreen, &rect);
[nswindow setFrameOrigin:rect.origin];
return;
}
@@ -449,7 +453,7 @@ - (void)windowDidResize:(NSNotification *)aNotification
NSWindow *nswindow = _data->nswindow;
int x, y, w, h;
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
ConvertNSRect([nswindow screen], &rect);
ConvertNSRect([nswindow screen], (window->flags & FULLSCREEN_MASK), &rect);
x = (int)rect.origin.x;
y = (int)rect.origin.y;
w = (int)rect.size.width;
@@ -934,7 +938,7 @@ - (void)resetCursorRects
/* Fill in the SDL window with the window data */
{
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
ConvertNSRect([nswindow screen], &rect);
ConvertNSRect([nswindow screen], (window->flags & FULLSCREEN_MASK), &rect);
window->x = (int)rect.origin.x;
window->y = (int)rect.origin.y;
window->w = (int)rect.size.width;
@@ -1010,7 +1014,7 @@ - (void)resetCursorRects
rect.origin.y = window->y;
rect.size.width = window->w;
rect.size.height = window->h;
ConvertNSRect([[NSScreen screens] objectAtIndex:0], &rect);
ConvertNSRect([[NSScreen screens] objectAtIndex:0], (window->flags & FULLSCREEN_MASK), &rect);

style = GetWindowStyle(window);

@@ -1138,7 +1142,7 @@ - (void)resetCursorRects
rect.origin.y = window->y;
rect.size.width = window->w;
rect.size.height = window->h;
ConvertNSRect([nswindow screen], &rect);
ConvertNSRect([nswindow screen], (window->flags & FULLSCREEN_MASK), &rect);

moveHack = s_moveHack;
s_moveHack = 0;
@@ -1338,7 +1342,7 @@ - (void)resetCursorRects
rect.origin.y = bounds.y;
rect.size.width = bounds.w;
rect.size.height = bounds.h;
ConvertNSRect([nswindow screen], &rect);
ConvertNSRect([nswindow screen], fullscreen, &rect);

/* Hack to fix origin on Mac OS X 10.4 */
NSRect screenRect = [[nswindow screen] frame];
@@ -1356,7 +1360,7 @@ - (void)resetCursorRects
rect.origin.y = window->windowed.y;
rect.size.width = window->windowed.w;
rect.size.height = window->windowed.h;
ConvertNSRect([nswindow screen], &rect);
ConvertNSRect([nswindow screen], fullscreen, &rect);

if ([nswindow respondsToSelector: @selector(setStyleMask:)]) {
[nswindow performSelector: @selector(setStyleMask:) withObject: (id)(uintptr_t)GetWindowStyle(window)];

0 comments on commit a8fcbc4

Please sign in to comment.