From ddfae6cd6721e1d2b20bb604e50f9a20de6b0b6f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Oct 2023 03:08:29 +0200 Subject: [PATCH] forward all input to video window --- inc/dd.h | 2 +- src/render_d3d9.c | 3 ++- src/render_gdi.c | 3 ++- src/render_ogl.c | 3 ++- src/utils.c | 2 +- src/wndproc.c | 18 +++++++++++------- 6 files changed, 19 insertions(+), 12 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 042a258..1ab5d64 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -136,7 +136,7 @@ typedef struct CNCDDRAW void* last_freed_palette; /* Dungeon Keeper hack */ void* last_freed_surface; /* Nox hack */ BOOL child_window_exists; - BOOL video_window_exists; + HWND video_window_hwnd; BOOL got_child_windows; DWORD last_set_window_pos_tick; /* WINE hack */ SPEEDLIMITER ticks_limiter; diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 0934807..cae506b 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -540,7 +540,8 @@ DWORD WINAPI d3d9_render_main(void) if (g_config.fixchilds) { - g_ddraw->child_window_exists = g_ddraw->video_window_exists = FALSE; + g_ddraw->child_window_exists = FALSE; + InterlockedExchangePointer(&g_ddraw->video_window_hwnd, NULL); EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height) diff --git a/src/render_gdi.c b/src/render_gdi.c index 9d14d26..4a24747 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -83,7 +83,8 @@ DWORD WINAPI gdi_render_main(void) if (g_config.fixchilds) { - g_ddraw->child_window_exists = g_ddraw->video_window_exists = FALSE; + g_ddraw->child_window_exists = FALSE; + InterlockedExchangePointer(&g_ddraw->video_window_hwnd, NULL); EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); } diff --git a/src/render_ogl.c b/src/render_ogl.c index 27420b9..79b1477 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -769,7 +769,8 @@ static void ogl_render() if (g_config.fixchilds) { - g_ddraw->child_window_exists = g_ddraw->video_window_exists = FALSE; + g_ddraw->child_window_exists = FALSE; + InterlockedExchangePointer(&g_ddraw->video_window_hwnd, NULL); EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height) diff --git a/src/utils.c b/src/utils.c index a9fee1b..617beb8 100644 --- a/src/utils.c +++ b/src/utils.c @@ -476,7 +476,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) strcmp(class_name, "Afx:400000:3") == 0 || strcmp(class_name, "MCIWndClass") == 0) { - g_ddraw->video_window_exists = TRUE; + InterlockedExchangePointer(&g_ddraw->video_window_hwnd, hwnd); LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); diff --git a/src/wndproc.c b/src/wndproc.c index bf0e6a9..91381cb 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -729,10 +729,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - if (g_ddraw->video_window_exists) + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + if (video_hwnd) { - if (wParam != VK_ESCAPE) - return 0; + PostMessageA(video_hwnd, uMsg, wParam, lParam); + return 0; } break; @@ -742,10 +743,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot) ss_take_screenshot(g_ddraw->primary); - if (g_ddraw->video_window_exists) + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + if (video_hwnd) { - if (wParam != VK_ESCAPE) - return 0; + PostMessageA(video_hwnd, uMsg, wParam, lParam); + return 0; } break; @@ -796,8 +798,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_MBUTTONDOWN: case WM_MOUSEMOVE: { - if (g_ddraw->video_window_exists) + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + if (video_hwnd) { + PostMessageA(video_hwnd, uMsg, wParam, lParam); return 0; }