From cf3d0c51ada0a509cf38e90f53681a0900003cb9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 22:23:47 +0200 Subject: [PATCH] #313 improve American Girls Dress Designer support and merge changes into master --- src/config.c | 4 ++++ src/dd.c | 19 ++++++++----------- src/utils.c | 8 ++++---- src/winapi_hooks.c | 18 +++++++++++++++++- 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/config.c b/src/config.c index 9469b4d..45e4c95 100644 --- a/src/config.c +++ b/src/config.c @@ -394,6 +394,10 @@ static void cfg_create_ini() "; American Girls Dress Designer\n" "[Dress Designer]\n" "fake_mode=640x480x32\n" + "border=false\n" + "posX=0\n" + "posY=0\n" + "nonexclusive=true\n" "\n" "; Age of Wonders 2\n" "[AoW2]\n" diff --git a/src/dd.c b/src/dd.c index 9a3e4aa..d2eee80 100644 --- a/src/dd.c +++ b/src/dd.c @@ -546,18 +546,15 @@ HRESULT dd_RestoreDisplayMode() return DD_OK; } - if (g_ddraw.renderer != gdi_render_main) - { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); - if (g_ddraw.render.thread) - { - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; - } + if (g_ddraw.render.thread) + { + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } if (!g_config.windowed) diff --git a/src/utils.c b/src/utils.c index c7de295..9b0ce23 100644 --- a/src/utils.c +++ b/src/utils.c @@ -553,9 +553,12 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam) { + RECT size = { 0 }; + real_GetClientRect(hwnd, &size); + LONG sytle = real_GetWindowLongA(hwnd, GWL_STYLE); - if (!g_ddraw.hwnd && !(sytle & WS_DISABLED)) + if (!g_ddraw.hwnd && !(sytle & WS_DISABLED) && size.right > 0 && size.bottom > 0) g_ddraw.hwnd = hwnd; #ifdef _DEBUG @@ -568,9 +571,6 @@ BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam) RECT pos = { 0 }; real_GetWindowRect(hwnd, &pos); - RECT size = { 0 }; - real_GetClientRect(hwnd, &size); - LONG exsytle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); TRACE( diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f688ee6..9b51570 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -11,6 +11,7 @@ #include "mouse.h" #include "wndproc.h" #include "render_gdi.h" +#include "render_d3d9.h" #include "directinput.h" #include "ddsurface.h" #include "ddclipper.h" @@ -1320,13 +1321,28 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd) { TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p\n", hWnd, g_ddraw.hwnd); + if (g_ddraw.ref && hWnd && hWnd == g_ddraw.hwnd) + { + dd_RestoreDisplayMode(); + + if (g_ddraw.renderer == d3d9_render_main) + { + d3d9_release(); + } + } + BOOL result = real_DestroyWindow(hWnd); - if (result && g_ddraw.ref && hWnd == g_ddraw.hwnd) + if (result && g_ddraw.ref && hWnd && hWnd == g_ddraw.hwnd) { g_ddraw.hwnd = NULL; g_ddraw.wndproc = NULL; g_ddraw.render.hdc = NULL; + + if (g_config.fake_mode[0]) + { + dd_SetCooperativeLevel(NULL, DDSCL_NORMAL); + } } if (g_ddraw.ref && g_ddraw.hwnd != hWnd && g_ddraw.bnet_active)