From c328ae95501113f679053a5023cb3eb94d73d381 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Oct 2023 03:35:09 +0200 Subject: [PATCH] forward input to video window during video playback --- inc/dd.h | 1 + src/render_d3d9.c | 1 + src/render_gdi.c | 1 + src/render_ogl.c | 1 + src/utils.c | 2 ++ src/wndproc.c | 21 +++++++++++++++++++++ 6 files changed, 27 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index 1d0aa8f..1ab5d64 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -136,6 +136,7 @@ typedef struct CNCDDRAW void* last_freed_palette; /* Dungeon Keeper hack */ void* last_freed_surface; /* Nox hack */ BOOL child_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 66511ad..cae506b 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -541,6 +541,7 @@ DWORD WINAPI d3d9_render_main(void) if (g_config.fixchilds) { 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 bd88fb6..40d5263 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -84,6 +84,7 @@ DWORD WINAPI gdi_render_main(void) if (g_config.fixchilds) { 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 cc87e92..79b1477 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -770,6 +770,7 @@ static void ogl_render() if (g_config.fixchilds) { 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 5aeadd0..999a8e4 100644 --- a/src/utils.c +++ b/src/utils.c @@ -475,6 +475,8 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0) { + InterlockedExchangePointer(&g_ddraw->video_window_hwnd, hwnd); + LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); if (!(style & WS_EX_TRANSPARENT)) diff --git a/src/wndproc.c b/src/wndproc.c index 5ff00c2..4fccc95 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -729,6 +729,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + if (video_hwnd) + { + PostMessageA(video_hwnd, uMsg, wParam, lParam); + return 0; + } + break; } case WM_KEYUP: @@ -736,6 +743,13 @@ 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); + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + if (video_hwnd) + { + PostMessageA(video_hwnd, uMsg, wParam, lParam); + return 0; + } + break; } /* button up messages reactivate cursor lock */ @@ -824,6 +838,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam lParam = MAKELPARAM(x, y); + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + if (video_hwnd) + { + PostMessageA(video_hwnd, uMsg, wParam, lParam); + return 0; + } + break; } case WM_PARENTNOTIFY: