From f3b85780add6657af24b6b9c6157b2e6c9309bc4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 14 Aug 2023 19:56:00 +0200 Subject: [PATCH] replace Direct3D9EnableMaximizedWindowedModeShim with better solution --- src/dd.c | 8 ++++---- src/render_d3d9.c | 17 ++++------------- src/utils.c | 2 +- src/wndproc.c | 6 +++--- 4 files changed, 12 insertions(+), 21 deletions(-) diff --git a/src/dd.c b/src/dd.c index 32ed5ed..e0a18cb 100644 --- a/src/dd.c +++ b/src/dd.c @@ -506,7 +506,6 @@ HRESULT dd_RestoreDisplayMode() return DD_OK; } - /* only stop drawing in GL mode when minimized */ if (g_ddraw->renderer != gdi_render_main) { EnterCriticalSection(&g_ddraw->cs); @@ -523,7 +522,7 @@ HRESULT dd_RestoreDisplayMode() if (!g_ddraw->windowed) { - if (g_ddraw->renderer == d3d9_render_main) + if (g_ddraw->renderer == d3d9_render_main && !g_ddraw->nonexclusive) { if (!d3d9_reset(TRUE)) d3d9_release(); @@ -922,7 +921,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - if (!d3d9_active && ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + if ((!d3d9_active || g_ddraw->nonexclusive) && + ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { g_ddraw->render.run = FALSE; g_ddraw->windowed = TRUE; @@ -1185,7 +1185,7 @@ ULONG dd_Release() if (!g_ddraw->windowed) { - if (g_ddraw->renderer == d3d9_render_main) + if (g_ddraw->renderer == d3d9_render_main && !g_ddraw->nonexclusive) { if (!d3d9_reset(TRUE)) d3d9_release(); diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 94ff919..ad557e8 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -50,15 +50,6 @@ BOOL d3d9_create() if (g_d3d9.hmodule) { - if (g_ddraw->nonexclusive) - { - int (WINAPI * d3d9_enable_shim)(BOOL) = - (int (WINAPI*)(BOOL))real_GetProcAddress(g_d3d9.hmodule, "Direct3D9EnableMaximizedWindowedModeShim"); - - if (d3d9_enable_shim) - d3d9_enable_shim(TRUE); - } - LPDIRECT3D9 d3d9on12 = NULL; D3D9ON12_ARGS args; memset(&args, 0, sizeof(args)); @@ -118,7 +109,7 @@ BOOL d3d9_create() memset(&g_d3d9.params, 0, sizeof(g_d3d9.params)); - g_d3d9.params.Windowed = g_ddraw->windowed; + g_d3d9.params.Windowed = g_ddraw->windowed || g_ddraw->nonexclusive; g_d3d9.params.SwapEffect = D3DSWAPEFFECT_DISCARD; g_d3d9.params.hDeviceWindow = g_ddraw->hwnd; g_d3d9.params.PresentationInterval = g_ddraw->vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; @@ -166,9 +157,9 @@ BOOL d3d9_on_device_lost() BOOL d3d9_reset(BOOL windowed) { - g_d3d9.params.Windowed = windowed; - g_d3d9.params.BackBufferWidth = windowed ? 0 : g_ddraw->render.width; - g_d3d9.params.BackBufferHeight = windowed ? 0 : g_ddraw->render.height; + g_d3d9.params.Windowed = windowed || g_ddraw->nonexclusive; + g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; + g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; g_d3d9.params.BackBufferFormat = g_ddraw->mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) diff --git a/src/utils.c b/src/utils.c index b6f1486..eb6a96f 100644 --- a/src/utils.c +++ b/src/utils.c @@ -365,7 +365,7 @@ void util_toggle_fullscreen() mouse_unlock(); g_config.window_state = g_ddraw->windowed = TRUE; - if (g_ddraw->renderer == d3d9_render_main) + if (g_ddraw->renderer == d3d9_render_main && !g_ddraw->nonexclusive) { d3d9_reset(g_ddraw->windowed); } diff --git a/src/wndproc.c b/src/wndproc.c index 0075022..ee97f51 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -136,7 +136,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_D3D9DEVICELOST: { - if ((!g_ddraw->windowed || !IsIconic(g_ddraw->hwnd)) && + if (((!g_ddraw->windowed && !g_ddraw->nonexclusive) || !IsIconic(g_ddraw->hwnd)) && g_ddraw->renderer == d3d9_render_main && d3d9_on_device_lost()) { @@ -519,7 +519,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_ddraw->windowed) { - if (g_ddraw->renderer != d3d9_render_main) + if (g_ddraw->renderer != d3d9_render_main || g_ddraw->nonexclusive) { ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); @@ -543,7 +543,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (!g_ddraw->windowed) { - if (g_ddraw->renderer != d3d9_render_main) + if (g_ddraw->renderer != d3d9_render_main || g_ddraw->nonexclusive) { real_ShowWindow(g_ddraw->hwnd, SW_MINIMIZE); ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0);