From 42541debda7692b2c968efd25fffac218f2d037f Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Thu, 8 Aug 2019 12:40:20 +0200
Subject: [PATCH] don't toggle fullscreen instantly when leaving bnet

---
 ddraw.rc    |  2 +-
 inc/main.h  |  3 +++
 src/main.c  | 24 ++++++++++++++++++++++++
 src/mouse.c |  5 +++--
 4 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/ddraw.rc b/ddraw.rc
index 4af3f0c..22a7c86 100644
--- a/ddraw.rc
+++ b/ddraw.rc
@@ -4,7 +4,7 @@
 #define VERSION_MAJOR    1
 #define VERSION_MINOR    3
 #define VERSION_BUILD    4
-#define VERSION_REVISION 3  
+#define VERSION_REVISION 4  
 
 #define VERSION          VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION
 #define VERSION_STRING   ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION)
diff --git a/inc/main.h b/inc/main.h
index 19b8e5f..a5d81a1 100644
--- a/inc/main.h
+++ b/inc/main.h
@@ -28,11 +28,14 @@
 #define WM_WINEFULLSCREEN WM_USER+112
 #define WM_D3D9DEVICELOST WM_USER+113
 
+#define IDT_TIMER_LEAVE_BNET 541287654
+
 DEFINE_GUID(IID_IMediaStream, 0xb502d1bd, 0x9a57, 0x11d0, 0x8f, 0xde, 0x00, 0xc0, 0x4f, 0xd9, 0x18, 0x9d);
 DEFINE_GUID(IID_IAMMediaStream, 0xbebe595d, 0x9a6f, 0x11d0, 0x8f, 0xde, 0x00, 0xc0, 0x4f, 0xd9, 0x18, 0x9d);
 
 extern BOOL ShowDriverWarning;
 extern RECT WindowRect;
+extern int WindowState;
 extern BOOL ChildWindowExists;
 
 BOOL detect_cutscene();
diff --git a/src/main.c b/src/main.c
index 23a251d..bbbeb3d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1053,6 +1053,30 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
             }
             return 0;
         }
+        case WM_TIMER:
+        {
+            switch (wParam)
+            {
+                case IDT_TIMER_LEAVE_BNET:
+                {
+                    KillTimer(ddraw->hWnd, IDT_TIMER_LEAVE_BNET);
+
+                    if (!ddraw->windowed)
+                        ddraw->bnetWasFullscreen = FALSE;
+
+                    if (!ddraw->bnetActive && ddraw->bnetWasFullscreen)
+                    {
+                        int ws = WindowState;
+                        ToggleFullscreen();
+                        WindowState = ws;
+                        ddraw->bnetWasFullscreen = FALSE;
+                    }
+
+                    return 0;
+                }   
+            }
+            break;
+        }
         case WM_WINDOWPOSCHANGED:
         {
             WINDOWPOS *pos = (WINDOWPOS *)lParam;
diff --git a/src/mouse.c b/src/mouse.c
index 4d00de1..136b458 100644
--- a/src/mouse.c
+++ b/src/mouse.c
@@ -437,8 +437,7 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd)
 
             if (ddraw->windowed && ddraw->bnetWasFullscreen)
             {
-                ToggleFullscreen();
-                ddraw->bnetWasFullscreen = FALSE;
+                SetTimer(ddraw->hWnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL);
             }
         }
     }
@@ -456,7 +455,9 @@ HWND WINAPI fake_CreateWindowExA(
         {
             if (!ddraw->windowed && !ddraw->bnetWasFullscreen)
             {
+                int ws = WindowState;
                 ToggleFullscreen();
+                WindowState = ws;
                 ddraw->bnetWasFullscreen = TRUE;
             }