From c8ef48c2c903042bcc864cdf57c671deec7fe7a5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 07:59:57 +0100 Subject: [PATCH] fix wayland bug (linux) --- src/dd.c | 30 ++++++++++++++++++++++++------ src/hook.c | 2 ++ src/utils.c | 1 + src/winapi_hooks.c | 25 +++++++++++++++++++++---- 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/dd.c b/src/dd.c index 9027306..54ab14c 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1006,13 +1006,31 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - if ((!d3d9_active || g_config.nonexclusive) && - ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + if (!d3d9_active || g_config.nonexclusive) { - g_ddraw->render.run = FALSE; - g_config.windowed = TRUE; - g_config.fullscreen = TRUE; - return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); + if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + { + g_ddraw->render.run = FALSE; + g_config.windowed = TRUE; + g_config.fullscreen = TRUE; + return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); + } + + /* + Fix wayland bug: + ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed + */ + if (g_ddraw->wine && + (g_ddraw->render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || + g_ddraw->render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) + { + ChangeDisplaySettings(NULL, 0); + + g_ddraw->render.run = FALSE; + g_config.windowed = TRUE; + g_config.fullscreen = TRUE; + return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); + } } if (g_ddraw->wine) diff --git a/src/hook.c b/src/hook.c index 4aa653d..1d73afe 100644 --- a/src/hook.c +++ b/src/hook.c @@ -479,6 +479,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; if (is_local || + _strcmpi(mod_filename, "mciavi32") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) @@ -555,6 +556,7 @@ void hook_revert(HOOKLIST* hooks) BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; if (is_local || + _strcmpi(mod_filename, "mciavi32") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) diff --git a/src/utils.c b/src/utils.c index 617beb8..028b93c 100644 --- a/src/utils.c +++ b/src/utils.c @@ -472,6 +472,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || + strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "Afx:400000:3") == 0 || strcmp(class_name, "MCIWndClass") == 0) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 3f9da2c..a165b39 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -840,9 +840,26 @@ int WINAPI fake_StretchDIBits( UINT iUsage, DWORD rop) { - if (g_ddraw && g_ddraw->hwnd && WindowFromDC(hdc) == g_ddraw->hwnd) + HWND hwnd = WindowFromDC(hdc); + + char class_name[MAX_PATH] = { 0 }; + + if (g_ddraw && g_ddraw->hwnd && hwnd && hwnd != g_ddraw->hwnd) { - if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) + GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); + } + + if (g_ddraw && g_ddraw->hwnd && + (hwnd == g_ddraw->hwnd || + (g_config.fixchilds && IsChild(g_ddraw->hwnd, hwnd) && + (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "MCIAVI") == 0 || + strcmp(class_name, "AVIWnd32") == 0 || + strcmp(class_name, "Afx:400000:3") == 0 || + strcmp(class_name, "VideoRenderer") == 0 || + strcmp(class_name, "MCIWndClass") == 0)))) + { + if (0) // g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) { HDC primary_dc; dds_GetDC(g_ddraw->primary, &primary_dc); @@ -870,11 +887,11 @@ int WINAPI fake_StretchDIBits( return result; } } - else if (g_ddraw->width > 0) + else if (g_ddraw->width > 0 && g_ddraw->render.hdc) { return real_StretchDIBits( - hdc, + g_ddraw->render.hdc, xDest + g_ddraw->render.viewport.x, yDest + g_ddraw->render.viewport.y, (int)(DestWidth * g_ddraw->render.scale_w),