mirror of https://github.com/encounter/SDL.git
Fixed bug 2534 - Mac: black bar at top of screen in SDL_WINDOW_FULLSCREEN 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.
This commit is contained in:
parent
6b90d7f58a
commit
a8fcbc466a
|
@ -49,6 +49,9 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define FULLSCREEN_MASK (SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN)
|
||||||
|
|
||||||
|
|
||||||
@interface SDLWindow : NSWindow
|
@interface SDLWindow : NSWindow
|
||||||
/* These are needed for borderless/fullscreen windows */
|
/* These are needed for borderless/fullscreen windows */
|
||||||
- (BOOL)canBecomeKeyWindow;
|
- (BOOL)canBecomeKeyWindow;
|
||||||
|
@ -89,9 +92,9 @@
|
||||||
|
|
||||||
static Uint32 s_moveHack;
|
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;
|
r->origin.y = (visibleScreen.origin.y + visibleScreen.size.height) - r->origin.y - r->size.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -412,8 +415,9 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
|
||||||
int x, y;
|
int x, y;
|
||||||
SDL_Window *window = _data->window;
|
SDL_Window *window = _data->window;
|
||||||
NSWindow *nswindow = _data->nswindow;
|
NSWindow *nswindow = _data->nswindow;
|
||||||
|
BOOL fullscreen = window->flags & FULLSCREEN_MASK;
|
||||||
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
|
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
|
||||||
ConvertNSRect([nswindow screen], &rect);
|
ConvertNSRect([nswindow screen], fullscreen, &rect);
|
||||||
|
|
||||||
if (s_moveHack) {
|
if (s_moveHack) {
|
||||||
SDL_bool blockMove = ((SDL_GetTicks() - s_moveHack) < 500);
|
SDL_bool blockMove = ((SDL_GetTicks() - s_moveHack) < 500);
|
||||||
|
@ -424,7 +428,7 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
|
||||||
/* Cocoa is adjusting the window in response to a mode change */
|
/* Cocoa is adjusting the window in response to a mode change */
|
||||||
rect.origin.x = window->x;
|
rect.origin.x = window->x;
|
||||||
rect.origin.y = window->y;
|
rect.origin.y = window->y;
|
||||||
ConvertNSRect([nswindow screen], &rect);
|
ConvertNSRect([nswindow screen], fullscreen, &rect);
|
||||||
[nswindow setFrameOrigin:rect.origin];
|
[nswindow setFrameOrigin:rect.origin];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -449,7 +453,7 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
|
||||||
NSWindow *nswindow = _data->nswindow;
|
NSWindow *nswindow = _data->nswindow;
|
||||||
int x, y, w, h;
|
int x, y, w, h;
|
||||||
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
|
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
|
||||||
ConvertNSRect([nswindow screen], &rect);
|
ConvertNSRect([nswindow screen], (window->flags & FULLSCREEN_MASK), &rect);
|
||||||
x = (int)rect.origin.x;
|
x = (int)rect.origin.x;
|
||||||
y = (int)rect.origin.y;
|
y = (int)rect.origin.y;
|
||||||
w = (int)rect.size.width;
|
w = (int)rect.size.width;
|
||||||
|
@ -934,7 +938,7 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created
|
||||||
/* Fill in the SDL window with the window data */
|
/* Fill in the SDL window with the window data */
|
||||||
{
|
{
|
||||||
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
|
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->x = (int)rect.origin.x;
|
||||||
window->y = (int)rect.origin.y;
|
window->y = (int)rect.origin.y;
|
||||||
window->w = (int)rect.size.width;
|
window->w = (int)rect.size.width;
|
||||||
|
@ -1010,7 +1014,7 @@ Cocoa_CreateWindow(_THIS, SDL_Window * window)
|
||||||
rect.origin.y = window->y;
|
rect.origin.y = window->y;
|
||||||
rect.size.width = window->w;
|
rect.size.width = window->w;
|
||||||
rect.size.height = window->h;
|
rect.size.height = window->h;
|
||||||
ConvertNSRect([[NSScreen screens] objectAtIndex:0], &rect);
|
ConvertNSRect([[NSScreen screens] objectAtIndex:0], (window->flags & FULLSCREEN_MASK), &rect);
|
||||||
|
|
||||||
style = GetWindowStyle(window);
|
style = GetWindowStyle(window);
|
||||||
|
|
||||||
|
@ -1138,7 +1142,7 @@ Cocoa_SetWindowPosition(_THIS, SDL_Window * window)
|
||||||
rect.origin.y = window->y;
|
rect.origin.y = window->y;
|
||||||
rect.size.width = window->w;
|
rect.size.width = window->w;
|
||||||
rect.size.height = window->h;
|
rect.size.height = window->h;
|
||||||
ConvertNSRect([nswindow screen], &rect);
|
ConvertNSRect([nswindow screen], (window->flags & FULLSCREEN_MASK), &rect);
|
||||||
|
|
||||||
moveHack = s_moveHack;
|
moveHack = s_moveHack;
|
||||||
s_moveHack = 0;
|
s_moveHack = 0;
|
||||||
|
@ -1338,7 +1342,7 @@ Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display
|
||||||
rect.origin.y = bounds.y;
|
rect.origin.y = bounds.y;
|
||||||
rect.size.width = bounds.w;
|
rect.size.width = bounds.w;
|
||||||
rect.size.height = bounds.h;
|
rect.size.height = bounds.h;
|
||||||
ConvertNSRect([nswindow screen], &rect);
|
ConvertNSRect([nswindow screen], fullscreen, &rect);
|
||||||
|
|
||||||
/* Hack to fix origin on Mac OS X 10.4 */
|
/* Hack to fix origin on Mac OS X 10.4 */
|
||||||
NSRect screenRect = [[nswindow screen] frame];
|
NSRect screenRect = [[nswindow screen] frame];
|
||||||
|
@ -1356,7 +1360,7 @@ Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display
|
||||||
rect.origin.y = window->windowed.y;
|
rect.origin.y = window->windowed.y;
|
||||||
rect.size.width = window->windowed.w;
|
rect.size.width = window->windowed.w;
|
||||||
rect.size.height = window->windowed.h;
|
rect.size.height = window->windowed.h;
|
||||||
ConvertNSRect([nswindow screen], &rect);
|
ConvertNSRect([nswindow screen], fullscreen, &rect);
|
||||||
|
|
||||||
if ([nswindow respondsToSelector: @selector(setStyleMask:)]) {
|
if ([nswindow respondsToSelector: @selector(setStyleMask:)]) {
|
||||||
[nswindow performSelector: @selector(setStyleMask:) withObject: (id)(uintptr_t)GetWindowStyle(window)];
|
[nswindow performSelector: @selector(setStyleMask:) withObject: (id)(uintptr_t)GetWindowStyle(window)];
|
||||||
|
|
Loading…
Reference in New Issue