DEADSOFTWARE

fix chat/console input
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Wed, 14 Aug 2019 18:22:18 +0000 (21:22 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Wed, 14 Aug 2019 18:22:18 +0000 (21:22 +0300)
src/game/g_console.pas
src/game/g_touch.pas

index 3f3fd8ec2c998132439d1c30cfc78e3a35b701e7..7d953860e9dc7ff6007611e9b3ac3121e0b3ec9e 100644 (file)
@@ -129,6 +129,7 @@ var
   Cons_Y: SmallInt;
   ConsoleHeight: Single;
   Cons_Shown: Boolean; // Ðèñîâàòü ëè êîíñîëü?
   Cons_Y: SmallInt;
   ConsoleHeight: Single;
   Cons_Shown: Boolean; // Ðèñîâàòü ëè êîíñîëü?
+  InputReady: Boolean;
   Line: AnsiString;
   CPos: Word;
   //ConsoleHistory: SSArray;
   Line: AnsiString;
   CPos: Word;
   //ConsoleHistory: SSArray;
@@ -152,24 +153,24 @@ var
 
 procedure g_Console_Switch;
 begin
 
 procedure g_Console_Switch;
 begin
-  if gConsoleShow or Cons_Shown or gChatShow then
-    g_Touch_ShowKeyboard(False);
   gChatShow := False;
   gConsoleShow := not gConsoleShow;
   Cons_Shown := True;
   gChatShow := False;
   gConsoleShow := not gConsoleShow;
   Cons_Shown := True;
+  InputReady := False;
+  g_Touch_ShowKeyboard(gConsoleShow or gChatShow);
 end;
 
 procedure g_Console_Chat_Switch (Team: Boolean = False);
 begin
 end;
 
 procedure g_Console_Chat_Switch (Team: Boolean = False);
 begin
-  if gConsoleShow or Cons_Shown or gChatShow then
-    g_Touch_ShowKeyboard(False);
   if not g_Game_IsNet then Exit;
   gConsoleShow := False;
   gChatShow := not gChatShow;
   gChatTeam := Team;
   Cons_Shown := True;
   if not g_Game_IsNet then Exit;
   gConsoleShow := False;
   gChatShow := not gChatShow;
   gChatTeam := Team;
   Cons_Shown := True;
+  InputReady := False;
   Line := '';
   CPos := 1;
   Line := '';
   CPos := 1;
+  g_Touch_ShowKeyboard(gConsoleShow or gChatShow);
 end;
 
 // poor man's floating literal parser; i'm sorry, but `StrToFloat()` sux cocks
 end;
 
 // poor man's floating literal parser; i'm sorry, but `StrToFloat()` sux cocks
@@ -797,6 +798,7 @@ begin
   gConsoleShow := False;
   gChatShow := False;
   Cons_Shown := False;
   gConsoleShow := False;
   gChatShow := False;
   Cons_Shown := False;
+  InputReady := False;
   CPos := 1;
 
   for a := 0 to High(MsgArray) do
   CPos := 1;
 
   for a := 0 to High(MsgArray) do
@@ -986,34 +988,38 @@ var
 begin
   if Cons_Shown then
   begin
 begin
   if Cons_Shown then
   begin
-  // Â ïðîöåññå îòêðûòèÿ:
+    (* Open animation *)
     if gConsoleShow and (Cons_Y < 0) then
       Cons_Y := Cons_Y+Step;
 
     if gConsoleShow and (Cons_Y < 0) then
       Cons_Y := Cons_Y+Step;
 
-  // Â ïðîöåññå çàêðûòèÿ:
+    (* Colse animation *)
     if (not gConsoleShow) and (Cons_Y > -Floor(gScreenHeight * ConsoleHeight)) then
       Cons_Y := Cons_Y-Step;
 
     if (not gConsoleShow) and (Cons_Y > -Floor(gScreenHeight * ConsoleHeight)) then
       Cons_Y := Cons_Y-Step;
 
-    // Open chat
     if gChatShow then
     begin
     if gChatShow then
     begin
+      (* End open chat animation. Do not show console *)
       Cons_Y := -Floor(gScreenHeight * ConsoleHeight);
       Cons_Y := -Floor(gScreenHeight * ConsoleHeight);
-      Cons_Shown := False;
-      g_Touch_ShowKeyboard(True);
-    end;
-
-  // Îêîí÷àòåëüíî îòêðûëàñü:
+      Cons_Shown := True;
+      InputReady := True;
+//      g_Touch_ShowKeyboard(True);
+    end
+    else
     if Cons_Y > 0 then
     begin
     if Cons_Y > 0 then
     begin
+      (* End open animation *)
       Cons_Y := 0;
       Cons_Y := 0;
-      g_Touch_ShowKeyboard(True);
-    end;
-
-  // Îêîí÷àòåëüíî çàêðûëàñü:
+      InputReady := True;
+//      g_Touch_ShowKeyboard(True);
+    end
+    else
     if Cons_Y <= -Floor(gScreenHeight * ConsoleHeight) then
     begin
     if Cons_Y <= -Floor(gScreenHeight * ConsoleHeight) then
     begin
+      (* End close animation *)
       Cons_Y := -Floor(gScreenHeight * ConsoleHeight);
       Cons_Shown := False;
       Cons_Y := -Floor(gScreenHeight * ConsoleHeight);
       Cons_Shown := False;
+      InputReady := False;
+//      g_Touch_ShowKeyboard(False);
     end;
   end;
 
     end;
   end;
 
@@ -1115,28 +1121,27 @@ begin
     if MsgArray[a].Time > 0 then
       e_TextureFontPrintFmt(0, offset_y + CHeight * a, MsgArray[a].Msg, gStdFont, True);
 
     if MsgArray[a].Time > 0 then
       e_TextureFontPrintFmt(0, offset_y + CHeight * a, MsgArray[a].Msg, gStdFont, True);
 
-  if not Cons_Shown then
+  if gChatShow then
   begin
   begin
-    if gChatShow then
+    if ChatTop then
+      offset_y := 0
+    else
+      offset_y := gScreenHeight - CHeight - 1;
+    if gChatTeam then
     begin
     begin
-      if ChatTop then
-        offset_y := 0
-      else
-        offset_y := gScreenHeight - CHeight - 1;
-      if gChatTeam then
-      begin
-        e_TextureFontPrintEx(0, offset_y, 'say team> ' + Line, gStdFont, 255, 255, 255, 1, True);
-        e_TextureFontPrintEx((CPos + 9) * CWidth, offset_y, '_', gStdFont, 255, 255, 255, 1, True);
-      end
-      else
-      begin
-        e_TextureFontPrintEx(0, offset_y, 'say> ' + Line, gStdFont, 255, 255, 255, 1, True);
-        e_TextureFontPrintEx((CPos + 4) * CWidth, offset_y, '_', gStdFont, 255, 255, 255, 1, True);
-      end
-    end;
-    Exit;
+      e_TextureFontPrintEx(0, offset_y, 'say team> ' + Line, gStdFont, 255, 255, 255, 1, True);
+      e_TextureFontPrintEx((CPos + 9) * CWidth, offset_y, '_', gStdFont, 255, 255, 255, 1, True);
+    end
+    else
+    begin
+      e_TextureFontPrintEx(0, offset_y, 'say> ' + Line, gStdFont, 255, 255, 255, 1, True);
+      e_TextureFontPrintEx((CPos + 4) * CWidth, offset_y, '_', gStdFont, 255, 255, 255, 1, True);
+    end
   end;
 
   end;
 
+  if not Cons_Shown then
+    Exit;
+
   if gDebugMode then
   begin
     e_CharFont_GetSize(gMenuFont, DEBUG_STRING, mfW, mfH);
   if gDebugMode then
   begin
     e_CharFont_GetSize(gMenuFont, DEBUG_STRING, mfW, mfH);
@@ -1175,8 +1180,11 @@ end;
 
 procedure g_Console_Char(C: AnsiChar);
 begin
 
 procedure g_Console_Char(C: AnsiChar);
 begin
-  Insert(C, Line, CPos);
-  CPos := CPos + 1;
+  if InputReady and (gConsoleShow or gChatShow) then
+  begin
+    Insert(C, Line, CPos);
+    CPos := CPos + 1;
+  end
 end;
 
 
 end;
 
 
@@ -1344,7 +1352,8 @@ begin
           Line := '';
           CPos := 1;
           gJustChatted := True;
           Line := '';
           CPos := 1;
           gJustChatted := True;
-          g_Console_Chat_Switch
+          g_Console_Chat_Switch;
+          InputReady := False;
         end;
     end;
     IK_TAB:
         end;
     end;
     IK_TAB:
index faed65c36ab5fc6cb7c1d41d29496ef0bcb3c21e..b9250acb63bd32958b50e96cb4617e1b0d6360f3 100644 (file)
@@ -194,7 +194,8 @@ implementation
 {$IFNDEF HEADLESS}
     if g_dbg_input then
       e_LogWritefln('g_Touch_ShowKeyboard(%s)', [yes]);
 {$IFNDEF HEADLESS}
     if g_dbg_input then
       e_LogWritefln('g_Touch_ShowKeyboard(%s)', [yes]);
-    if yes then
+    (* on desktop we always receive text (needed for cheats) *)
+    if yes or (SDL_HasScreenKeyboardSupport() = SDL_FALSE) then
       SDL_StartTextInput
     else
       SDL_StopTextInput
       SDL_StartTextInput
     else
       SDL_StopTextInput