From aca18912b31055835608aabadd0203cd89e3b4ae Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
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)