From aac405031e17f960f0619717058fefcd84d2b04b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 13:09:47 +0200 Subject: [PATCH] add some more checks to fixnotresponding patch --- inc/dd.h | 1 + src/dd.c | 8 ++++++-- src/ddsurface.c | 20 ++++++++++++++++---- src/winapi_hooks.c | 6 ++++++ 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index fe8a902..e5904bb 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -153,6 +153,7 @@ typedef struct CNCDDRAW BOOL child_window_exists; BOOL got_child_windows; DWORD last_set_window_pos_tick; /* WINE hack */ + DWORD last_msg_pull_tick; SPEEDLIMITER ticks_limiter; SPEEDLIMITER flip_limiter; DWORD minfps_tick_len; diff --git a/src/dd.c b/src/dd.c index 7887f07..33e8800 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1021,9 +1021,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) SetMenu(g_ddraw.hwnd, NULL); - if (!IsWine()) + if (g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && + GetCurrentThreadId() == g_ddraw.gui_thread_id && + !IsWine()) { - MSG msg; /* workaround for "Not Responding" window problem in cnc games */ + /* workaround for "Not Responding" window problem in cnc games */ + g_ddraw.last_msg_pull_tick = timeGetTime(); + MSG msg; real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); } diff --git a/src/ddsurface.c b/src/ddsurface.c index 352a5d2..056c158 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -50,9 +50,15 @@ HRESULT dds_Blt( dbg_dump_dds_blt_flags(dwFlags); dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0); - if (g_ddraw.ref && g_config.fixnotresponding && !IsWine()) + if (g_config.fixnotresponding && + g_ddraw.hwnd && + g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && + GetCurrentThreadId() == g_ddraw.gui_thread_id && + !IsWine()) { - MSG msg; /* workaround for "Not Responding" window problem */ + /* workaround for "Not Responding" window problem */ + g_ddraw.last_msg_pull_tick = timeGetTime(); + MSG msg; real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); } @@ -988,9 +994,15 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_ddraw.ref && g_config.fixnotresponding && !IsWine()) + if (g_config.fixnotresponding && + g_ddraw.hwnd && + g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && + GetCurrentThreadId() == g_ddraw.gui_thread_id && + !IsWine()) { - MSG msg; /* workaround for "Not Responding" window problem */ + /* workaround for "Not Responding" window problem */ + g_ddraw.last_msg_pull_tick = timeGetTime(); + MSG msg; real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 1228626..9b713cf 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -710,6 +710,9 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { + if (g_ddraw.ref && hWnd == g_ddraw.hwnd) + g_ddraw.last_msg_pull_tick = timeGetTime(); + BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) @@ -745,6 +748,9 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { + if (g_ddraw.ref && hWnd == g_ddraw.hwnd) + g_ddraw.last_msg_pull_tick = timeGetTime(); + BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook)