From a71528f35f18faacdb1a53235d9ce696f3b0427c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 27 Nov 2021 12:51:35 +0100 Subject: [PATCH] add workaround for multi-monitor setups --- src/render_gdi.c | 49 ++++++++++++++++++++++++++++++++-------------- src/render_ogl.c | 2 +- src/winapi_hooks.c | 10 ++++++++-- 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/src/render_gdi.c b/src/render_gdi.c index e2e8ef0..fd78f80 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -74,7 +74,7 @@ DWORD WINAPI gdi_render_main(void) if (g_ddraw->fixchilds) { - g_ddraw->child_window_exists = FALSE; + g_ddraw->child_window_exists = g_ddraw->bnet_active && GetSystemMetrics(SM_CMONITORS) > 1; EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); } @@ -97,20 +97,39 @@ DWORD WINAPI gdi_render_main(void) if (g_ddraw->bnet_active) { - StretchDIBits( - g_ddraw->render.hdc, - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y, - g_ddraw->render.viewport.width, - g_ddraw->render.viewport.height, - 0, - 0, - g_ddraw->width, - g_ddraw->height, - g_ddraw->primary->bnet_surface, - g_ddraw->primary->bmi, - DIB_RGB_COLORS, - SRCCOPY); + if (GetSystemMetrics(SM_CMONITORS) == 1) + { + StretchDIBits( + g_ddraw->render.hdc, + g_ddraw->render.viewport.x, + g_ddraw->render.viewport.y, + g_ddraw->render.viewport.width, + g_ddraw->render.viewport.height, + 0, + 0, + g_ddraw->width, + g_ddraw->height, + g_ddraw->primary->bnet_surface, + g_ddraw->primary->bmi, + DIB_RGB_COLORS, + SRCCOPY); + } + else + { + SetDIBitsToDevice( + g_ddraw->render.hdc, + 0, + 0, + g_ddraw->width, + g_ddraw->height, + 0, + 0, + 0, + g_ddraw->height, + g_ddraw->primary->bnet_surface, + g_ddraw->primary->bmi, + DIB_RGB_COLORS); + } } else if (upscale_hack) { diff --git a/src/render_ogl.c b/src/render_ogl.c index f267a97..60d87cd 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -676,7 +676,7 @@ static void ogl_render() if (g_ddraw->fixchilds) { - g_ddraw->child_window_exists = FALSE; + g_ddraw->child_window_exists = g_ddraw->bnet_active && GetSystemMetrics(SM_CMONITORS) > 1; 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/winapi_hooks.c b/src/winapi_hooks.c index 438eb04..5c7a91e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -650,8 +650,9 @@ HWND WINAPI fake_CreateWindowExA( if (!g_ddraw->windowed && !g_ddraw->bnet_was_fullscreen) { - if (g_ddraw->render.mode.dmPelsWidth != 640 || - g_ddraw->render.mode.dmPelsHeight != 480) + if ((g_ddraw->render.mode.dmPelsWidth != 640 || + g_ddraw->render.mode.dmPelsHeight != 480) && + GetSystemMetrics(SM_CMONITORS) == 1) { memcpy(&g_ddraw->bnet_mode, &g_ddraw->render.mode, sizeof(DEVMODE)); @@ -709,6 +710,11 @@ HWND WINAPI fake_CreateWindowExA( X += align_x; Y += align_y; } + else if (GetSystemMetrics(SM_CMONITORS) > 1) + { + X += min(g_ddraw->render.width / 2 - 640 / 2, added_width); + Y += min(g_ddraw->render.height / 2 - 480 / 2, added_height); + } X += pt.x; Y += pt.y;