From 8e54756b4a653e1d0ed79ac1fb5aa7e80449e415 Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Wed, 21 Oct 2020 16:02:00 +0200
Subject: [PATCH] add a new .ini setting for child window handling (currently
 only used for tm2)

---
 inc/dd.h     |  1 +
 src/config.c |  2 ++
 src/utils.c  | 11 +++++++----
 3 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/inc/dd.h b/inc/dd.h
index 3d9c674..b6454ea 100644
--- a/inc/dd.h
+++ b/inc/dd.h
@@ -104,6 +104,7 @@ typedef struct cnc_ddraw
     BOOL sierrahack;
     BOOL dk2hack;
     BOOL nonexclusive;
+    BOOL fixchildwindows;
     BOOL bnet_active;
     BOOL bnet_was_fullscreen;
     BOOL bnet_was_upscaled;
diff --git a/src/config.c b/src/config.c
index c296467..ee9df61 100644
--- a/src/config.c
+++ b/src/config.c
@@ -48,6 +48,7 @@ void cfg_load()
     g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE);
     g_ddraw->resizable = cfg_get_bool("resizable", TRUE);
     g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE);
+    g_ddraw->fixchildwindows = cfg_get_bool("fixchildwindows", TRUE);
     g_ddraw->sierrahack = cfg_get_bool("sierrahack", FALSE); // Sierra Caesar III, Pharaoh, and Zeus hack
     g_ddraw->dk2hack = cfg_get_bool("dk2hack", FALSE); // Dungeon Keeper 2 hack
 
@@ -493,6 +494,7 @@ static void cfg_create_ini()
             "nonexclusive=true\n"
             "maxgameticks=60\n"
             "handlemouse=false\n"
+            "fixchildwindows=false\n"
             "\n"
             "; Caesar III\n"
             "[c3]\n"
diff --git a/src/utils.c b/src/utils.c
index d581c69..b82c40b 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -281,13 +281,16 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam)
     {
         g_ddraw->child_window_exists = TRUE;
 
-        HDC hdc = GetDC(hwnd);
+        if (g_ddraw->fixchildwindows)
+        {
+            HDC hdc = GetDC(hwnd);
 
-        MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)&pos, 2);
+            MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)&pos, 2);
 
-        BitBlt(hdc, 0, 0, size.right, size.bottom, this->hdc, pos.left, pos.top, SRCCOPY);
+            BitBlt(hdc, 0, 0, size.right, size.bottom, this->hdc, pos.left, pos.top, SRCCOPY);
 
-        ReleaseDC(hwnd, hdc);
+            ReleaseDC(hwnd, hdc);
+        }
     }
 
     return FALSE;