From 33666bbd19e0e1444a3a90fb8d4544b1fc79f2b7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 16:50:28 +0200 Subject: [PATCH] try to get at least some windowed games working with zero config --- inc/dd.h | 1 - src/dd.c | 31 +++++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 9ba1bf5..116d661 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -166,7 +166,6 @@ typedef struct CNCDDRAW int y; } textbox; /* Age Of Empires 2 textbox align */ - struct { BOOL enabled; diff --git a/src/dd.c b/src/dd.c index 0da10a2..444c4db 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1427,6 +1427,13 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) dd_SetDisplayMode(width, height, bpp, 0); } + else if (!g_ddraw.width) + { + RECT rc = { 0 }; + real_GetClientRect(hwnd, &rc); + + dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); + } } return DD_OK; @@ -1579,10 +1586,30 @@ ULONG dd_Release() DeleteCriticalSection(&g_ddraw.cs); - /* restore old wndproc, subsequent ddraw creation will otherwise fail */ - if (g_ddraw.hwnd) + if (g_ddraw.hwnd && IsWindow(g_ddraw.hwnd)) { + /* restore old wndproc, subsequent ddraw creation will otherwise fail */ real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)g_ddraw.wndproc); + + /* restore old window size, required for games that can switch between windowed and fullscreen during runtime */ + if (g_ddraw.width) + { + RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; + + LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); + LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); + + AdjustWindowRectEx(&rc, style, GetMenu(g_ddraw.hwnd) != NULL, exstyle); + + real_SetWindowPos( + g_ddraw.hwnd, + 0, + 0, + 0, + (rc.right - rc.left), + (rc.bottom - rc.top), + SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); + } } memset(&g_ddraw, 0, sizeof(g_ddraw));