From 58a86abfc85f3117c63cbf9d8eef49dd68b0442e Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Thu, 16 Sep 2021 01:57:44 +0200
Subject: [PATCH] add new .ini setting to force release alt key on alt+tab

---
 inc/dd.h      |  1 +
 src/config.c  |  7 ++++++-
 src/wndproc.c | 27 +++++++++++++--------------
 3 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/inc/dd.h b/inc/dd.h
index ae096f9..b119a79 100644
--- a/inc/dd.h
+++ b/inc/dd.h
@@ -135,6 +135,7 @@ typedef struct CNCDDRAW
     BOOL cnchack;
     int maxgameticks;
     BOOL alt_key_down;
+    BOOL releasealt;
     BOOL bnet_active;
     BOOL bnet_was_fullscreen;
     BOOL bnet_was_upscaled;
diff --git a/src/config.c b/src/config.c
index 58ecc15..5bdeb79 100644
--- a/src/config.c
+++ b/src/config.c
@@ -64,6 +64,7 @@ void cfg_load()
     g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE);
     g_ddraw->fixmousehook = cfg_get_bool("fixmousehook", FALSE);
     g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE);
+    g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE);
     g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE);
     g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE);
     g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL);
@@ -725,16 +726,19 @@ static void cfg_create_ini()
             "[ja2]\n"
             "fixmousehook=true\n"
             "noactivateapp=true\n"
+            "releasealt=true\n"
             "\n"
             "; Jagged Alliance 2: Wildfire\n"
             "[WF6]\n"
             "fixmousehook=true\n"
             "noactivateapp=true\n"
+            "releasealt=true\n"
             "\n"
             "; Jagged Alliance 2 - UC mod\n"
             "[JA2_UC]\n"
             "fixmousehook=true\n"
             "noactivateapp=true\n"
+            "releasealt=true\n"
             "\n"
             "; Kings Quest 8\n"
             "[Mask]\n"
@@ -920,7 +924,8 @@ static void cfg_create_ini()
             "[Wiz8]\n"
             "fixmousehook=true\n"
             "noactivateapp=true\n"
-             "\n"
+            "releasealt=true\n"
+            "\n"
             "; Worms Armageddon\n"
             "[WA]\n"
             "adjmouse=true\n"
diff --git a/src/wndproc.c b/src/wndproc.c
index 37c0246..0bd273e 100644
--- a/src/wndproc.c
+++ b/src/wndproc.c
@@ -528,6 +528,17 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
             }
         }
 
+        if (wParam && g_ddraw->releasealt)
+        {
+            INPUT ip;
+            memset(&ip, 0, sizeof(ip));
+
+            ip.type = INPUT_KEYBOARD;
+            ip.ki.wVk = VK_MENU;
+            ip.ki.dwFlags = KEYEVENTF_KEYUP;
+            SendInput(1, &ip, sizeof(ip));
+        }
+
         if (g_ddraw->windowed || g_ddraw->noactivateapp)
         {
             /* let it pass through once (tiberian sun) */
@@ -538,21 +549,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
                 one_time = TRUE;
                 break;
             }
-
-            /* jagged alliance 2 */
-            if (wParam)
-            {
-                INPUT ip;
-                memset(&ip, 0, sizeof(ip));
-
-                ip.type = INPUT_KEYBOARD;
-                ip.ki.wVk = VK_MENU;
-                ip.ki.dwFlags = KEYEVENTF_KEYUP;
-                SendInput(1, &ip, sizeof(ip));
-            }
             
-            //if (wParam && g_ddraw->alt_key_down)
-            //    PostMessageA(g_ddraw->hwnd, WM_SYSKEYUP, VK_MENU, 0);
+            if (wParam && g_ddraw->alt_key_down && !g_ddraw->releasealt)
+                PostMessageA(g_ddraw->hwnd, WM_SYSKEYUP, VK_MENU, 0);
 
             return 0;
         }