From 04e063252c63f9b759eb0e234dfebe04a591c14d Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Mon, 8 Oct 2018 08:42:08 +0200
Subject: [PATCH] don't change display settings, let d3d9 do it

---
 ddraw.rc          |  2 +-
 src/main.c        | 30 +++++++++++++--------
 src/render_d3d9.c | 69 +++++++++++++++++++++++++----------------------
 3 files changed, 57 insertions(+), 44 deletions(-)

diff --git a/ddraw.rc b/ddraw.rc
index b533448..06a785d 100644
--- a/ddraw.rc
+++ b/ddraw.rc
@@ -2,7 +2,7 @@
 #define vxstr(a,b,c,d) str(a##.##b##.##c##.##d)
 #define str(s) #s
 
-#define VERSION 1,2,0,4
+#define VERSION 1,2,0,5
 
 1 VERSIONINFO
 FILEVERSION VERSION
diff --git a/src/main.c b/src/main.c
index f2186e9..6d73a61 100644
--- a/src/main.c
+++ b/src/main.c
@@ -239,8 +239,10 @@ HRESULT __stdcall ddraw_RestoreDisplayMode(IDirectDrawImpl *This)
     
     if(!ddraw->windowed)
     {
-        ChangeDisplaySettings(&This->mode, 0);
-        InterlockedExchange(&ddraw->displayModeChanged, TRUE);
+        if (!D3D9_Enabled)
+            ChangeDisplaySettings(&This->mode, 0);
+
+        InterlockedExchange(&ddraw->minimized, TRUE);
     }
 
     return DD_OK;
@@ -468,6 +470,8 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD
     {
         RedrawWindow(This->hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE);
     }
+
+    InterlockedExchange(&ddraw->minimized, FALSE);
     
     if(This->render.thread == NULL)
     {
@@ -625,14 +629,17 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
             {
                 if (!ddraw->windowed)
                 {
-                    ChangeDisplaySettings(&ddraw->render.mode, CDS_FULLSCREEN);
+                    if (!D3D9_Enabled)
+                    {
+                        ChangeDisplaySettings(&ddraw->render.mode, CDS_FULLSCREEN);
+
+                        if (wParam == WA_ACTIVE)
+                        {
+                            mouse_lock();
+                        }
+                    }
 
                     InterlockedExchange(&ddraw->minimized, FALSE);
-
-                    if (wParam == WA_ACTIVE)
-                    {
-                        mouse_lock();
-                    }
                 }
             }
             else if (wParam == WA_INACTIVE)
@@ -646,9 +653,10 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
                 if (!ddraw->windowed)
                 {
                     if (!D3D9_Enabled)
-                        ShowWindow(ddraw->hWnd, SW_MINIMIZE); 
-
-                    ChangeDisplaySettings(&ddraw->mode, 0);
+                    {
+                        ShowWindow(ddraw->hWnd, SW_MINIMIZE);
+                        ChangeDisplaySettings(&ddraw->mode, 0);
+                    }
 
                     InterlockedExchange(&ddraw->minimized, TRUE);
                 }
diff --git a/src/render_d3d9.c b/src/render_d3d9.c
index 4fcc17d..2c195ae 100644
--- a/src/render_d3d9.c
+++ b/src/render_d3d9.c
@@ -12,8 +12,8 @@ HMODULE D3D9_hModule;
 
 static D3DPRESENT_PARAMETERS D3dpp;
 static LPDIRECT3D9 D3d;
-static LPDIRECT3DDEVICE9 D3ddev;
-static LPDIRECT3DVERTEXBUFFER9 D3dvb;
+static LPDIRECT3DDEVICE9 D3dDev;
+static LPDIRECT3DVERTEXBUFFER9 VertexBuf;
 static IDirect3DTexture9 *SurfaceTex;
 static IDirect3DTexture9 *PaletteTex;
 static IDirect3DPixelShader9 *PixelShader;
@@ -100,13 +100,13 @@ static BOOL CreateDirect3D()
                     ddraw->hWnd,
                     D3DCREATE_MULTITHREADED | D3DCREATE_NOWINDOWCHANGES | behaviorFlags[i],
                     &D3dpp,
-                    &D3ddev)))
+                    &D3dDev)))
                     break;
             }
         }
     }
 
-    return D3d && D3ddev && CreateResources() && SetStates();
+    return D3d && D3dDev && CreateResources() && SetStates();
 }
 
 static BOOL CreateResources()
@@ -125,26 +125,26 @@ static BOOL CreateResources()
     ScaleW = (float)width / texWidth;;
     ScaleH = (float)height / texHeight;
 
-    D3ddev->lpVtbl->CreateVertexBuffer(
-        D3ddev, sizeof(CUSTOMVERTEX) * 4, 0, D3DFVF_XYZRHW | D3DFVF_TEX1, D3DPOOL_MANAGED, &D3dvb, NULL);
+    D3dDev->lpVtbl->CreateVertexBuffer(
+        D3dDev, sizeof(CUSTOMVERTEX) * 4, 0, D3DFVF_XYZRHW | D3DFVF_TEX1, D3DPOOL_MANAGED, &VertexBuf, NULL);
 
     UpdateVertices(InterlockedExchangeAdd(&ddraw->incutscene, 0));
-    D3ddev->lpVtbl->CreateTexture(D3ddev, texWidth, texHeight, 1, 0, D3DFMT_L8, D3DPOOL_MANAGED, &SurfaceTex, 0);
-    D3ddev->lpVtbl->CreateTexture(D3ddev, 256, 256, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &PaletteTex, 0);
-    D3ddev->lpVtbl->CreatePixelShader(D3ddev, (DWORD *)PalettePixelShaderSrc, &PixelShader);
+    D3dDev->lpVtbl->CreateTexture(D3dDev, texWidth, texHeight, 1, 0, D3DFMT_L8, D3DPOOL_MANAGED, &SurfaceTex, 0);
+    D3dDev->lpVtbl->CreateTexture(D3dDev, 256, 256, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &PaletteTex, 0);
+    D3dDev->lpVtbl->CreatePixelShader(D3dDev, (DWORD *)PalettePixelShaderSrc, &PixelShader);
 
-    return SurfaceTex && PaletteTex && D3dvb && PixelShader;
+    return SurfaceTex && PaletteTex && VertexBuf && PixelShader;
 }
 
 static BOOL SetStates()
 {
     BOOL err = FALSE;
 
-    err = err || FAILED(D3ddev->lpVtbl->SetFVF(D3ddev, D3DFVF_XYZRHW | D3DFVF_TEX1));
-    err = err || FAILED(D3ddev->lpVtbl->SetStreamSource(D3ddev, 0, D3dvb, 0, sizeof(CUSTOMVERTEX)));
-    err = err || FAILED(D3ddev->lpVtbl->SetTexture(D3ddev, 0, (IDirect3DBaseTexture9 *)SurfaceTex));
-    err = err || FAILED(D3ddev->lpVtbl->SetTexture(D3ddev, 1, (IDirect3DBaseTexture9 *)PaletteTex));
-    err = err || FAILED(D3ddev->lpVtbl->SetPixelShader(D3ddev, PixelShader));
+    err = err || FAILED(D3dDev->lpVtbl->SetFVF(D3dDev, D3DFVF_XYZRHW | D3DFVF_TEX1));
+    err = err || FAILED(D3dDev->lpVtbl->SetStreamSource(D3dDev, 0, VertexBuf, 0, sizeof(CUSTOMVERTEX)));
+    err = err || FAILED(D3dDev->lpVtbl->SetTexture(D3dDev, 0, (IDirect3DBaseTexture9 *)SurfaceTex));
+    err = err || FAILED(D3dDev->lpVtbl->SetTexture(D3dDev, 1, (IDirect3DBaseTexture9 *)PaletteTex));
+    err = err || FAILED(D3dDev->lpVtbl->SetPixelShader(D3dDev, PixelShader));
 
     D3DVIEWPORT9 viewData = {
         ddraw->render.viewport.x,
@@ -154,7 +154,7 @@ static BOOL SetStates()
         0.0f,
         1.0f };
 
-    err = err || FAILED(D3ddev->lpVtbl->SetViewport(D3ddev, &viewData));
+    err = err || FAILED(D3dDev->lpVtbl->SetViewport(D3dDev, &viewData));
 
     return !err;
 }
@@ -179,10 +179,10 @@ static void UpdateVertices(BOOL inCutscene)
     };
 
     void *data;
-    if (D3dvb && SUCCEEDED(D3dvb->lpVtbl->Lock(D3dvb, 0, 0, (void**)&data, 0)))
+    if (VertexBuf && SUCCEEDED(VertexBuf->lpVtbl->Lock(VertexBuf, 0, 0, (void**)&data, 0)))
     {
         memcpy(data, vertices, sizeof(vertices));
-        D3dvb->lpVtbl->Unlock(D3dvb);
+        VertexBuf->lpVtbl->Unlock(VertexBuf);
     }
 }
 
@@ -192,7 +192,7 @@ static BOOL Reset()
     D3dpp.BackBufferHeight = D3dpp.Windowed ? 0 : ddraw->render.height;
     D3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
 
-    if (SUCCEEDED(D3ddev->lpVtbl->Reset(D3ddev, &D3dpp)))
+    if (SUCCEEDED(D3dDev->lpVtbl->Reset(D3dDev, &D3dpp)))
         return SetStates();
 
     return FALSE;
@@ -296,18 +296,23 @@ static void Render()
 
         LeaveCriticalSection(&ddraw->cs);
 
-        HRESULT hr = D3ddev->lpVtbl->TestCooperativeLevel(D3ddev);
+        HRESULT hr = D3dDev->lpVtbl->TestCooperativeLevel(D3dDev);
         LONG modeChanged = InterlockedExchange(&ddraw->displayModeChanged, FALSE);
         LONG minimized = InterlockedExchangeAdd(&ddraw->minimized, 0);
 
         if (minimized || modeChanged)
         {
             active = FALSE;
-            ReleaseDirect3D();
-            Sleep(200);
+            BOOL released = ReleaseDirect3D();
+            Sleep(500);
 
             if (minimized)
+            {
                 ShowWindow(ddraw->hWnd, SW_SHOWMINNOACTIVE);
+
+                if (!released)
+                    ChangeDisplaySettings(&ddraw->mode, 0);
+            }
         }
         else if (hr == D3DERR_DEVICENOTRESET && D3dpp.Windowed)
         {
@@ -315,11 +320,11 @@ static void Render()
         }
         else if (SUCCEEDED(hr))
         {
-            D3ddev->lpVtbl->BeginScene(D3ddev);
-            D3ddev->lpVtbl->DrawPrimitive(D3ddev, D3DPT_TRIANGLESTRIP, 0, 2);
-            D3ddev->lpVtbl->EndScene(D3ddev);
+            D3dDev->lpVtbl->BeginScene(D3dDev);
+            D3dDev->lpVtbl->DrawPrimitive(D3dDev, D3DPT_TRIANGLESTRIP, 0, 2);
+            D3dDev->lpVtbl->EndScene(D3dDev);
 
-            D3ddev->lpVtbl->Present(D3ddev, NULL, NULL, NULL, NULL);
+            D3dDev->lpVtbl->Present(D3dDev, NULL, NULL, NULL, NULL);
         }
 
 #if _DEBUG
@@ -338,10 +343,10 @@ static void Render()
 
 static BOOL ReleaseDirect3D()
 {
-    if (D3dvb)
+    if (VertexBuf)
     {
-        D3dvb->lpVtbl->Release(D3dvb);
-        D3dvb = NULL;
+        VertexBuf->lpVtbl->Release(VertexBuf);
+        VertexBuf = NULL;
     }
         
     if (SurfaceTex)
@@ -362,12 +367,12 @@ static BOOL ReleaseDirect3D()
         PixelShader = NULL;
     }
 
-    if (D3ddev)
+    if (D3dDev)
     {
-        if (FAILED(D3ddev->lpVtbl->Release(D3ddev)))
+        if (FAILED(D3dDev->lpVtbl->Release(D3dDev)))
             return FALSE;
 
-        D3ddev = NULL;
+        D3dDev = NULL;
     }
 
     if (D3d)