From: divverent Date: Mon, 3 Aug 2015 16:22:14 +0000 (+0000) Subject: adjust window position and size to the available desktop area (= screen size adjusted... X-Git-Tag: xonotic-v0.8.5~88^2~106 X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=commitdiff_plain;h=382a7a71d5ec964221778bfc1fb5bb31a635ba10;hp=46a6d80a250be7c14cd9aa053e313a3802ffbae2 adjust window position and size to the available desktop area (= screen size adjusted by taskbar location and size) From: hbeham git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@12215 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/vid_sdl.c b/vid_sdl.c index 942cbdd2..e3c934a7 100644 --- a/vid_sdl.c +++ b/vid_sdl.c @@ -2414,6 +2414,50 @@ static void VID_OutputVersion(void) version.major, version.minor, version.patch ); } +#ifdef WIN32 +static void AdjustWindowBounds(viddef_mode_t *mode, RECT *rect) +{ + LONG width = mode->width; // vid_width + LONG height = mode->height; // vid_height + + // adjust width and height for the space occupied by window decorators (title bar, borders) + rect->top = 0; + rect->left = 0; + rect->right = width; + rect->bottom = height; + AdjustWindowRectEx(rect, WS_CAPTION|WS_THICKFRAME, false, 0); + + RECT workArea; + SystemParametersInfo(SPI_GETWORKAREA, 0, &workArea, 0); + int workWidth = workArea.right - workArea.left; + int workHeight = workArea.bottom - workArea.top; + + // SDL forces the window height to be <= screen height - 27px (on Win8.1 - probably intended for the title bar) + // If the task bar is docked to the the left screen border and we move the window to negative y, + // there would be some part of the regular desktop visible on the bottom of the screen. + int titleBarPixels = 2; + int screenHeight = GetSystemMetrics(SM_CYSCREEN); + if (screenHeight == workHeight) + titleBarPixels = -rect->top; + + //Con_Printf("window mode: %dx%d, workArea: %d/%d-%d/%d (%dx%d), title: %d\n", width, height, workArea.left, workArea.top, workArea.right, workArea.bottom, workArea.right - workArea.left, workArea.bottom - workArea.top, titleBarPixels); + + // if height and width matches the physical or previously adjusted screen height and width, adjust it to available desktop area + if ((width == GetSystemMetrics(SM_CXSCREEN) || width == workWidth) && (height == screenHeight || height == workHeight - titleBarPixels)) + { + rect->left = workArea.left; + mode->width = workWidth; + rect->top = workArea.top + titleBarPixels; + mode->height = workHeight - titleBarPixels; + } + else + { + rect->left = workArea.left + max(0, (workWidth - width) / 2); + rect->top = workArea.top + (0, (workHeight - height) / 2); + } +} +#endif + static qboolean VID_InitModeGL(viddef_mode_t *mode) { #if SDL_MAJOR_VERSION == 1 @@ -2483,6 +2527,8 @@ static qboolean VID_InitModeGL(viddef_mode_t *mode) // Knghtbrd: should do platform-specific extension string function here vid_isfullscreen = false; + int xPos = SDL_WINDOWPOS_UNDEFINED; + int yPos = SDL_WINDOWPOS_UNDEFINED; #if SDL_MAJOR_VERSION == 1 { const SDL_VideoInfo *vi = SDL_GetVideoInfo(); @@ -2516,6 +2562,15 @@ static qboolean VID_InitModeGL(viddef_mode_t *mode) windowflags |= SDL_WINDOW_FULLSCREEN; vid_isfullscreen = true; } + else { +#ifdef WIN32 + DWORD windowStyle = 0; + RECT rect; + AdjustWindowBounds(mode, &rect); + xPos = rect.left; + yPos = rect.top; +#endif + } } #endif //flags |= SDL_HWSURFACE; @@ -2572,7 +2627,7 @@ static qboolean VID_InitModeGL(viddef_mode_t *mode) mode->height = screen->h; #else window_flags = windowflags; - window = SDL_CreateWindow(gamename, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, mode->width, mode->height, windowflags); + window = SDL_CreateWindow(gamename, xPos, yPos, mode->width, mode->height, windowflags); if (window == NULL) { Con_Printf("Failed to set video mode to %ix%i: %s\n", mode->width, mode->height, SDL_GetError()); diff --git a/vid_wgl.c b/vid_wgl.c index 24379fbf..79890553 100644 --- a/vid_wgl.c +++ b/vid_wgl.c @@ -216,7 +216,7 @@ static HINSTANCE hInstDI; // forward-referenced functions static void IN_StartupMouse (void); - +static void AdjustWindowBounds(int fullscreen, int &width, int &height, viddef_mode_t *mode, DWORD WindowStyle, RECT &rect); //==================================== @@ -913,7 +913,6 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) int pixelformat, newpixelformat; UINT numpixelformats; DWORD WindowStyle, ExWindowStyle; - int CenterX, CenterY; const char *gldrivername; int depth; DEVMODE thismode; @@ -1167,32 +1166,7 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) ExWindowStyle = 0; } - rect.top = 0; - rect.left = 0; - rect.right = width; - rect.bottom = height; - AdjustWindowRectEx(&rect, WindowStyle, false, 0); - - if (fullscreen) - { - CenterX = 0; - CenterY = 0; - } - else - { - CenterX = (GetSystemMetrics(SM_CXSCREEN) - (rect.right - rect.left)) / 2; - CenterY = (GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top)) / 2; - } - CenterX = max(0, CenterX); - CenterY = max(0, CenterY); - - // x and y may be changed by WM_MOVE messages - window_x = CenterX; - window_y = CenterY; - rect.left += CenterX; - rect.right += CenterX; - rect.top += CenterY; - rect.bottom += CenterY; + AdjustWindowBounds(fullscreen, width, height, mode, WindowStyle, rect); pixelformat = 0; newpixelformat = 0; @@ -1350,6 +1324,56 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) return true; } +static void AdjustWindowBounds(int fullscreen, int &width, int &height, viddef_mode_t *mode, DWORD WindowStyle, RECT &rect) +{ + int CenterX, CenterY; + + rect.top = 0; + rect.left = 0; + rect.right = width; + rect.bottom = height; + AdjustWindowRectEx(&rect, WindowStyle, false, 0); + + if (fullscreen) + { + CenterX = 0; + CenterY = 0; + } + else + { + RECT workArea; + SystemParametersInfo(SPI_GETWORKAREA, NULL, &workArea, 0); + int workWidth = workArea.right - workArea.left; + int workHeight = workArea.bottom - workArea.top; + + // if height/width matches physical screen height/width, adjust it to available desktop size + // and allow 2 pixels on top for the title bar so the window can be moved + const int titleBarPixels = 2; + if (width == GetSystemMetrics(SM_CXSCREEN) && (height == GetSystemMetrics(SM_CYSCREEN) || height == workHeight - titleBarPixels)) + { + rect.right -= width - workWidth; + width = mode->width = workWidth; + rect.bottom -= height - (workHeight - titleBarPixels); + height = mode->height = workHeight - titleBarPixels; + CenterX = 0; + CenterY = titleBarPixels; + } + else + { + CenterX = max(0, (workWidth - width) / 2); + CenterY = max(0, (workHeight - height) / 2); + } + } + + // x and y may be changed by WM_MOVE messages + window_x = CenterX; + window_y = CenterY; + rect.left += CenterX; + rect.right += CenterX; + rect.top += CenterY; + rect.bottom += CenterY; +} + #ifdef SUPPORTD3D static D3DADAPTER_IDENTIFIER9 d3d9adapteridentifier; @@ -1365,7 +1389,6 @@ qboolean VID_InitModeDX(viddef_mode_t *mode, int version) RECT rect; MSG msg; DWORD WindowStyle, ExWindowStyle; - int CenterX, CenterY; int bpp = mode->bitsperpixel; int width = mode->width; int height = mode->height; @@ -1390,32 +1413,7 @@ qboolean VID_InitModeDX(viddef_mode_t *mode, int version) ExWindowStyle = 0; } - rect.top = 0; - rect.left = 0; - rect.right = width; - rect.bottom = height; - AdjustWindowRectEx(&rect, WindowStyle, false, 0); - - if (fullscreen) - { - CenterX = 0; - CenterY = 0; - } - else - { - CenterX = (GetSystemMetrics(SM_CXSCREEN) - (rect.right - rect.left)) / 2; - CenterY = (GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top)) / 2; - } - CenterX = max(0, CenterX); - CenterY = max(0, CenterY); - - // x and y may be changed by WM_MOVE messages - window_x = CenterX; - window_y = CenterY; - rect.left += CenterX; - rect.right += CenterX; - rect.top += CenterY; - rect.bottom += CenterY; + AdjustWindowBounds(fullscreen, width, height, mode, WindowStyle, rect); gl_extensions = ""; gl_platformextensions = ""; @@ -1599,7 +1597,6 @@ qboolean VID_InitModeSOFT(viddef_mode_t *mode) MSG msg; int pixelformat, newpixelformat; DWORD WindowStyle, ExWindowStyle; - int CenterX, CenterY; int depth; DEVMODE thismode; qboolean foundmode, foundgoodmode; @@ -1751,32 +1748,7 @@ qboolean VID_InitModeSOFT(viddef_mode_t *mode) ExWindowStyle = 0; } - rect.top = 0; - rect.left = 0; - rect.right = width; - rect.bottom = height; - AdjustWindowRectEx(&rect, WindowStyle, false, 0); - - if (fullscreen) - { - CenterX = 0; - CenterY = 0; - } - else - { - CenterX = (GetSystemMetrics(SM_CXSCREEN) - (rect.right - rect.left)) / 2; - CenterY = (GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top)) / 2; - } - CenterX = max(0, CenterX); - CenterY = max(0, CenterY); - - // x and y may be changed by WM_MOVE messages - window_x = CenterX; - window_y = CenterY; - rect.left += CenterX; - rect.right += CenterX; - rect.top += CenterY; - rect.bottom += CenterY; + AdjustWindowBounds(fullscreen, width, height, mode, WindowStyle, rect); pixelformat = 0; newpixelformat = 0;