From 964196d3b9fe26d61b40ea83fec859dfb67f8949 Mon Sep 17 00:00:00 2001 From: tznind Date: Fri, 11 Oct 2024 20:28:38 +0100 Subject: [PATCH] Change to hashmap char since all terminators we ignore are single character --- .../ConsoleDrivers/AnsiResponseParser.cs | 116 ++++++++---------- 1 file changed, 52 insertions(+), 64 deletions(-) diff --git a/Terminal.Gui/ConsoleDrivers/AnsiResponseParser.cs b/Terminal.Gui/ConsoleDrivers/AnsiResponseParser.cs index 68fe3391a..9fe3b7350 100644 --- a/Terminal.Gui/ConsoleDrivers/AnsiResponseParser.cs +++ b/Terminal.Gui/ConsoleDrivers/AnsiResponseParser.cs @@ -7,8 +7,6 @@ internal class AnsiResponseParser private readonly StringBuilder held = new (); private readonly List<(string terminator, Action response)> expectedResponses = new (); - private readonly List> _ignorers = new (); - // Enum to manage the parser's state private enum ParserState { @@ -19,7 +17,7 @@ internal class AnsiResponseParser // Current state of the parser private ParserState currentState = ParserState.Normal; - private readonly HashSet _knownTerminators = new (); + private readonly HashSet _knownTerminators = new (); /* * ANSI Input Sequences @@ -42,64 +40,61 @@ internal class AnsiResponseParser { // These all are valid terminators on ansi responses, // see CSI in https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Functions-using-CSI-_-ordered-by-the-final-character_s - _knownTerminators.Add ("@"); - _knownTerminators.Add ("A"); - _knownTerminators.Add ("B"); - _knownTerminators.Add ("C"); - _knownTerminators.Add ("D"); - _knownTerminators.Add ("E"); - _knownTerminators.Add ("F"); - _knownTerminators.Add ("G"); - _knownTerminators.Add ("G"); - _knownTerminators.Add ("H"); - _knownTerminators.Add ("I"); - _knownTerminators.Add ("J"); - _knownTerminators.Add ("K"); - _knownTerminators.Add ("L"); - _knownTerminators.Add ("M"); + _knownTerminators.Add ('@'); + _knownTerminators.Add ('A'); + _knownTerminators.Add ('B'); + _knownTerminators.Add ('C'); + _knownTerminators.Add ('D'); + _knownTerminators.Add ('E'); + _knownTerminators.Add ('F'); + _knownTerminators.Add ('G'); + _knownTerminators.Add ('G'); + _knownTerminators.Add ('H'); + _knownTerminators.Add ('I'); + _knownTerminators.Add ('J'); + _knownTerminators.Add ('K'); + _knownTerminators.Add ('L'); + _knownTerminators.Add ('M'); // No - N or O - _knownTerminators.Add ("P"); - _knownTerminators.Add ("Q"); - _knownTerminators.Add ("R"); - _knownTerminators.Add ("S"); - _knownTerminators.Add ("T"); - _knownTerminators.Add ("W"); - _knownTerminators.Add ("X"); - _knownTerminators.Add ("Z"); + _knownTerminators.Add ('P'); + _knownTerminators.Add ('Q'); + _knownTerminators.Add ('R'); + _knownTerminators.Add ('S'); + _knownTerminators.Add ('T'); + _knownTerminators.Add ('W'); + _knownTerminators.Add ('X'); + _knownTerminators.Add ('Z'); - _knownTerminators.Add ("^"); - _knownTerminators.Add ("`"); - _knownTerminators.Add ("~"); + _knownTerminators.Add ('^'); + _knownTerminators.Add ('`'); + _knownTerminators.Add ('~'); - _knownTerminators.Add ("a"); - _knownTerminators.Add ("b"); - _knownTerminators.Add ("c"); - _knownTerminators.Add ("d"); - _knownTerminators.Add ("e"); - _knownTerminators.Add ("f"); - _knownTerminators.Add ("g"); - _knownTerminators.Add ("h"); - _knownTerminators.Add ("i"); + _knownTerminators.Add ('a'); + _knownTerminators.Add ('b'); + _knownTerminators.Add ('c'); + _knownTerminators.Add ('d'); + _knownTerminators.Add ('e'); + _knownTerminators.Add ('f'); + _knownTerminators.Add ('g'); + _knownTerminators.Add ('h'); + _knownTerminators.Add ('i'); - _knownTerminators.Add ("l"); - _knownTerminators.Add ("m"); - _knownTerminators.Add ("n"); + _knownTerminators.Add ('l'); + _knownTerminators.Add ('m'); + _knownTerminators.Add ('n'); - _knownTerminators.Add ("p"); - _knownTerminators.Add ("q"); - _knownTerminators.Add ("r"); - _knownTerminators.Add ("s"); - _knownTerminators.Add ("t"); - _knownTerminators.Add ("u"); - _knownTerminators.Add ("v"); - _knownTerminators.Add ("w"); - _knownTerminators.Add ("x"); - _knownTerminators.Add ("y"); - _knownTerminators.Add ("z"); - - // Add more common ANSI sequences to be ignored - _ignorers.Add (s => s.StartsWith ("\x1B[<") && s.EndsWith ("M")); // Mouse event + _knownTerminators.Add ('p'); + _knownTerminators.Add ('q'); + _knownTerminators.Add ('r'); + _knownTerminators.Add ('s'); + _knownTerminators.Add ('t'); + _knownTerminators.Add ('u'); + _knownTerminators.Add ('v'); + _knownTerminators.Add ('w'); + _knownTerminators.Add ('x'); + _knownTerminators.Add ('y'); + _knownTerminators.Add ('z'); // Add more if necessary } @@ -205,17 +200,10 @@ internal class AnsiResponseParser return string.Empty; } - if (_knownTerminators.Any (cur.EndsWith) && cur.StartsWith (EscSeqUtils.CSI)) + if (_knownTerminators.Contains (cur.Last ()) && cur.StartsWith (EscSeqUtils.CSI)) { // Detected a response that we were not expecting - return held.ToString (); - } - - // Handle common ANSI sequences (such as mouse input or arrow keys) - if (_ignorers.Any (m => m.Invoke (held.ToString ()))) - { - // Detected mouse input, release it without triggering the delegate - return held.ToString (); + return cur; } // Add more cases here for other standard sequences (like arrow keys, function keys, etc.)