From 9a9e9feeadba1af4a820ef0d0af50039efe45f8f Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Wed, 7 Aug 2019 04:40:43 +0200
Subject: [PATCH] automatically switch between windowed/fullscreen with d3d9
 renderer

---
 inc/main.h     |  2 ++
 src/main.c     |  2 +-
 src/mouse.c    | 46 +++++++++++++++++++++++++++++-----------------
 src/settings.c |  3 ---
 4 files changed, 32 insertions(+), 21 deletions(-)

diff --git a/inc/main.h b/inc/main.h
index e3551ee..c1765d3 100644
--- a/inc/main.h
+++ b/inc/main.h
@@ -37,6 +37,7 @@ extern BOOL ChildWindowExists;
 
 BOOL detect_cutscene();
 void LimitGameTicks();
+void ToggleFullscreen();
 DWORD WINAPI render_main(void);
 DWORD WINAPI render_soft_main(void);
 BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam);
@@ -127,6 +128,7 @@ typedef struct IDirectDrawImpl
     BOOL accurateTimers;
     int bnetHack;
     BOOL bnetActive;
+    BOOL bnetD3d9Fullscreen;
     BOOL hotPatch;
     SpeedLimiter ticksLimiter;
     SpeedLimiter flipLimiter;
diff --git a/src/main.c b/src/main.c
index 6623099..a64152d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -916,7 +916,7 @@ HRESULT __stdcall ddraw_SetDisplayMode2(IDirectDrawImpl *This, DWORD width, DWOR
 
 void ToggleFullscreen()
 {
-    if (ddraw->bnetHack && ddraw->renderer == render_d3d9_main)
+    if (ddraw->bnetHack && ddraw->bnetActive && ddraw->renderer == render_d3d9_main)
         return;
 
     if (ddraw->windowed)
diff --git a/src/mouse.c b/src/mouse.c
index b50e639..04e341a 100644
--- a/src/mouse.c
+++ b/src/mouse.c
@@ -19,6 +19,7 @@
 #include "main.h"
 #include "surface.h"
 #include "hook.h"
+#include "render_d3d9.h"
 
 int yAdjust = 0;
 
@@ -428,6 +429,12 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd)
     {
         ddraw->bnetActive = FALSE;
         mouse_lock();
+
+        if (ddraw->windowed && ddraw->bnetD3d9Fullscreen && ddraw->renderer == render_d3d9_main)
+        {
+            ToggleFullscreen();
+            ddraw->bnetD3d9Fullscreen = FALSE;
+        }
     }
 
     return result;
@@ -437,7 +444,28 @@ HWND WINAPI fake_CreateWindowExA(
     DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y,
     int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
 {
-    HWND hWnd = real_CreateWindowExA(
+    if (lpClassName && _strcmpi(lpClassName, "SDlgDialog") == 0 && ddraw && ddraw->bnetHack)
+    {
+        if (!ddraw->bnetActive)
+        {
+            if (!ddraw->windowed && !ddraw->bnetD3d9Fullscreen && ddraw->renderer == render_d3d9_main)
+            {
+                ToggleFullscreen();
+                ddraw->bnetD3d9Fullscreen = TRUE;
+            }
+
+            ddraw->bnetActive = TRUE;
+            mouse_unlock();
+        }
+
+        POINT pt = { 0, 0 };
+        real_ClientToScreen(ddraw->hWnd, &pt);
+
+        X += pt.x;
+        Y += pt.y;
+    }
+
+    return real_CreateWindowExA(
         dwExStyle,
         lpClassName,
         lpWindowName,
@@ -450,20 +478,4 @@ HWND WINAPI fake_CreateWindowExA(
         hMenu,
         hInstance,
         lpParam);
-
-    if (_strcmpi(lpClassName, "SDlgDialog") == 0 && ddraw && ddraw->bnetHack)
-    {
-        if (!ddraw->bnetActive)
-        {
-            ddraw->bnetActive = TRUE;
-            mouse_unlock();
-        }
-
-        POINT pt = { 0, 0 };
-        real_ClientToScreen(ddraw->hWnd, &pt);
-
-        real_SetWindowPos(hWnd, 0, pt.x + X, pt.y + Y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
-    }
-
-    return hWnd;
 }
diff --git a/src/settings.c b/src/settings.c
index 4ace007..a738b69 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -104,9 +104,6 @@ void Settings_Load()
     GetString("renderer", "opengl", tmp, sizeof(tmp));
     printf("Using %s renderer\n", tmp);
 
-    if (ddraw->bnetHack && tolower(tmp[0]) == 'd')
-        ddraw->windowed = TRUE;
-
     if (tolower(tmp[0]) == 's' || tolower(tmp[0]) == 'g') //gdi
     {
         ddraw->renderer = render_soft_main;