mirror of https://github.com/encounter/SDL.git
Fixed bug 4018 - Implement SDL_GetWindowBordersSize() under Windows/Win32/WinAPI
Ismael Ferreras Morezuelas (Swyter) As a new year gift I have implemented the Windows version of SDL_GetWindowBordersSize(). I needed it for auto-selecting a cozy window size for the game I'm currently working on and noticed that it only worked under X11, so I thought it could be a good excuse to contribute back more stuff. The Mercurial patch is attached as a .diff file. Let me know what you think. Happy 2018 to all the SDL2 devs and users! -- PS: Keep in mind that Windows 10 includes the 8px invisible grip borders as part of the frame. There's a way of detecting if Aero/DWM is being used and ask only for the visible rect, but I believe that GetWindowRect() is doing that for a reason and working as intended, so I haven't changed it. (See [2]) References: [1]: http://www.firststeps.ru/mfc/winapi/r.php?72 [2]: https://stackoverflow.com/a/34143777/674685 [3]: https://stackoverflow.com/a/431548/674685 [4]: https://wiki.libsdl.org/SDL_GetWindowBordersSize
This commit is contained in:
parent
8111a632be
commit
7c60bec493
|
@ -143,6 +143,7 @@ WIN_CreateDevice(int devindex)
|
||||||
device->SetWindowIcon = WIN_SetWindowIcon;
|
device->SetWindowIcon = WIN_SetWindowIcon;
|
||||||
device->SetWindowPosition = WIN_SetWindowPosition;
|
device->SetWindowPosition = WIN_SetWindowPosition;
|
||||||
device->SetWindowSize = WIN_SetWindowSize;
|
device->SetWindowSize = WIN_SetWindowSize;
|
||||||
|
device->GetWindowBordersSize = WIN_GetWindowBordersSize;
|
||||||
device->SetWindowOpacity = WIN_SetWindowOpacity;
|
device->SetWindowOpacity = WIN_SetWindowOpacity;
|
||||||
device->ShowWindow = WIN_ShowWindow;
|
device->ShowWindow = WIN_ShowWindow;
|
||||||
device->HideWindow = WIN_HideWindow;
|
device->HideWindow = WIN_HideWindow;
|
||||||
|
|
|
@ -479,6 +479,49 @@ WIN_SetWindowSize(_THIS, SDL_Window * window)
|
||||||
WIN_SetWindowPositionInternal(_this, window, SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOACTIVATE);
|
WIN_SetWindowPositionInternal(_this, window, SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOACTIVATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
WIN_GetWindowBordersSize(_THIS, SDL_Window * window, int *top, int *left, int *bottom, int *right)
|
||||||
|
{
|
||||||
|
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
|
||||||
|
RECT rcClient, rcWindow;
|
||||||
|
POINT ptDiff;
|
||||||
|
|
||||||
|
/* rcClient stores the size of the inner window, while rcWindow stores the outer size relative to the top-left
|
||||||
|
* screen position; so the top/left values of rcClient are always {0,0} and bottom/right are {height,width} */
|
||||||
|
GetClientRect(hwnd, &rcClient);
|
||||||
|
GetWindowRect(hwnd, &rcWindow);
|
||||||
|
|
||||||
|
/* convert the top/left values to make them relative to
|
||||||
|
* the window; they will end up being slightly negative */
|
||||||
|
ptDiff.y = rcWindow.top;
|
||||||
|
ptDiff.x = rcWindow.left;
|
||||||
|
|
||||||
|
ScreenToClient(hwnd, &ptDiff);
|
||||||
|
|
||||||
|
rcWindow.top = ptDiff.y;
|
||||||
|
rcWindow.left = ptDiff.x;
|
||||||
|
|
||||||
|
/* convert the bottom/right values to make them relative to the window,
|
||||||
|
* these will be slightly bigger than the inner width/height */
|
||||||
|
ptDiff.y = rcWindow.bottom;
|
||||||
|
ptDiff.x = rcWindow.right;
|
||||||
|
|
||||||
|
ScreenToClient(hwnd, &ptDiff);
|
||||||
|
|
||||||
|
rcWindow.bottom = ptDiff.y;
|
||||||
|
rcWindow.right = ptDiff.x;
|
||||||
|
|
||||||
|
/* Now that both the inner and outer rects use the same coordinate system we can substract them to get the border size.
|
||||||
|
* Keep in mind that the top/left coordinates of rcWindow are negative because the border lies slightly before {0,0},
|
||||||
|
* so switch them around because SDL2 wants them in positive. */
|
||||||
|
*top = rcClient.top - rcWindow.top;
|
||||||
|
*left = rcClient.left - rcWindow.left;
|
||||||
|
*bottom = rcWindow.bottom - rcClient.bottom;
|
||||||
|
*right = rcWindow.right - rcClient.right;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
WIN_ShowWindow(_THIS, SDL_Window * window)
|
WIN_ShowWindow(_THIS, SDL_Window * window)
|
||||||
{
|
{
|
||||||
|
|
|
@ -58,6 +58,7 @@ extern void WIN_SetWindowTitle(_THIS, SDL_Window * window);
|
||||||
extern void WIN_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon);
|
extern void WIN_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon);
|
||||||
extern void WIN_SetWindowPosition(_THIS, SDL_Window * window);
|
extern void WIN_SetWindowPosition(_THIS, SDL_Window * window);
|
||||||
extern void WIN_SetWindowSize(_THIS, SDL_Window * window);
|
extern void WIN_SetWindowSize(_THIS, SDL_Window * window);
|
||||||
|
extern int WIN_GetWindowBordersSize(_THIS, SDL_Window * window, int *top, int *left, int *bottom, int *right);
|
||||||
extern int WIN_SetWindowOpacity(_THIS, SDL_Window * window, float opacity);
|
extern int WIN_SetWindowOpacity(_THIS, SDL_Window * window, float opacity);
|
||||||
extern void WIN_ShowWindow(_THIS, SDL_Window * window);
|
extern void WIN_ShowWindow(_THIS, SDL_Window * window);
|
||||||
extern void WIN_HideWindow(_THIS, SDL_Window * window);
|
extern void WIN_HideWindow(_THIS, SDL_Window * window);
|
||||||
|
|
Loading…
Reference in New Issue