From 8f89970ce68d737ab2922c542dd5ee44438da817 Mon Sep 17 00:00:00 2001
From: divverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Date: Wed, 20 Jul 2016 13:13:30 +0000
Subject: [PATCH] Fix the show-keyboard logic for non-Steel Storm by factoring
 out the Steel Storm specific code into generic code.

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@12267 d7cf8633-e32d-0410-b094-e92efae38249
::stable-branch::merge=9351ad2d457c1d653c2ca08233680ac9cbb4c70a
---
 vid_sdl.c | 28 ++++++++++++++++------------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/vid_sdl.c b/vid_sdl.c
index 22fd13eb..21b3876b 100644
--- a/vid_sdl.c
+++ b/vid_sdl.c
@@ -787,7 +787,6 @@ static void IN_Move_TouchScreen_SteelStorm(void)
 	float move[3], aim[3];
 	static qboolean oldbuttons[128];
 	static qboolean buttons[128];
-	static keydest_t oldkeydest;
 	keydest_t keydest = (key_consoleactive & KEY_CONSOLEACTIVE_USER) ? key_console : key_dest;
 	memcpy(oldbuttons, buttons, sizeof(oldbuttons));
 	memset(multitouchs, 0, sizeof(multitouchs));
@@ -810,17 +809,6 @@ static void IN_Move_TouchScreen_SteelStorm(void)
 		multitouch[MAXFINGERS-1][0] = 0;
 	}*/
 
-	if (oldkeydest != keydest)
-	{
-		switch(keydest)
-		{
-		case key_game: VID_ShowKeyboard(false);break;
-		case key_console: VID_ShowKeyboard(true);break;
-		case key_message: VID_ShowKeyboard(true);break;
-		default: break; /* qc extensions control the other cases */
-		}
-	}
-	oldkeydest = keydest;
 	// TODO: make touchscreen areas controlled by a config file or the VMs. THIS IS A MESS!
 	// TODO: can't just clear buttons[] when entering a new keydest, some keys would remain pressed
 	// SS:BR menuqc has many peculiarities, including that it can't accept more than one command per frame and pressing and releasing on the same frame
@@ -979,11 +967,27 @@ void IN_Move( void )
 {
 	static int old_x = 0, old_y = 0;
 	static int stuck = 0;
+	static keydest_t oldkeydest;
+	static qboolean oldshowkeyboard;
 	int x, y;
 	vid_joystate_t joystate;
+	keydest_t keydest = (key_consoleactive & KEY_CONSOLEACTIVE_USER) ? key_console : key_dest;
 
 	scr_numtouchscreenareas = 0;
 
+	// Only apply the new keyboard state if the input changes.
+	if (keydest != oldkeydest || !!vid_touchscreen_showkeyboard.integer != oldshowkeyboard)
+	{
+		switch(keydest)
+		{
+			case key_console: VID_ShowKeyboard(true);break;
+			case key_message: VID_ShowKeyboard(true);break;
+			default: VID_ShowKeyboard(!!vid_touchscreen_showkeyboard.integer); break;
+		}
+	}
+	oldkeydest = keydest;
+	oldshowkeyboard = !!vid_touchscreen_showkeyboard.integer;
+
 	if (vid_touchscreen.integer)
 	{
 		switch(gamemode)
-- 
2.39.5