From aca18912b31055835608aabadd0203cd89e3b4ae Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 24 Aug 2023 18:37:16 +0200 Subject: [PATCH] allow to have game window bigger than screen size --- ddraw.rc | 2 +- src/dd.c | 16 +++++++++++++++- src/wndproc.c | 30 +++++++++++++++++++++++++++++- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 88cc09a..bda5350 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -4,7 +4,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/dd.c b/src/dd.c index 66519e0..1666a17 100644 --- a/src/dd.c +++ b/src/dd.c @@ -719,7 +719,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { - /* everything failed, use windowed mode instead */ + /* everything failed, use windowed/borderless mode instead */ g_ddraw->render.width = g_ddraw->width; g_ddraw->render.height = g_ddraw->height; @@ -727,6 +727,20 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; g_ddraw->windowed = TRUE; + + if (g_ddraw->render.width <= real_GetSystemMetrics(SM_CXSCREEN) && + g_ddraw->render.height <= real_GetSystemMetrics(SM_CYSCREEN)) + { + /* Switch to borderless mode if window fits into screen */ + g_ddraw->fullscreen = TRUE; + } + else + { + /* Make window titlebar visible if window does not fit into screen */ + g_config.window_rect.left = -32000; + g_config.window_rect.top = + real_GetSystemMetrics(SM_CYCAPTION) + real_GetSystemMetrics(SM_CYSIZEFRAME); + } } } } diff --git a/src/wndproc.c b/src/wndproc.c index 87b67f2..2475a95 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -41,7 +41,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam switch (uMsg) { - case WM_GETMINMAXINFO: case WM_MOVING: case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: @@ -51,6 +50,35 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { return DefWindowProc(hWnd, uMsg, wParam, lParam); } + case WM_GETMINMAXINFO: + { + MINMAXINFO* mmi = (MINMAXINFO*)lParam; + + if (g_ddraw->windowed && g_ddraw->width) + { + RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height }; + + AdjustWindowRectEx( + &rc, + real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE), + GetMenu(g_ddraw->hwnd) != NULL, + real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE)); + + // set minimum window size + //mmi->ptMinTrackSize.x = rc.right - rc.left; + //mmi->ptMinTrackSize.y = rc.bottom - rc.top; + + if (mmi->ptMaxTrackSize.x < rc.right - rc.left) + mmi->ptMaxTrackSize.x = rc.right - rc.left; + + if (mmi->ptMaxTrackSize.y < rc.bottom - rc.top) + mmi->ptMaxTrackSize.y = rc.bottom - rc.top; + + return 0; + } + + return DefWindowProc(hWnd, uMsg, wParam, lParam); + } case WM_NCACTIVATE: { if (g_ddraw->noactivateapp)