diff --git a/Terminal.Gui/ConsoleDrivers/AnsiEscapeSequence/AnsiEscapeSequenceRequest.cs b/Terminal.Gui/ConsoleDrivers/AnsiEscapeSequence/AnsiEscapeSequenceRequest.cs index 383eea28b..d8dc22ad3 100644 --- a/Terminal.Gui/ConsoleDrivers/AnsiEscapeSequence/AnsiEscapeSequenceRequest.cs +++ b/Terminal.Gui/ConsoleDrivers/AnsiEscapeSequence/AnsiEscapeSequenceRequest.cs @@ -57,6 +57,7 @@ public class AnsiEscapeSequenceRequest var error = new StringBuilder (); var savedIsReportingMouseMoves = false; NetDriver? netDriver = null; + var values = new string? [] { null }; try { @@ -124,14 +125,20 @@ public class AnsiEscapeSequenceRequest // Append the current key to the response response.Append (keyInfo.KeyChar); - if (keyInfo.KeyChar == ansiRequest.Terminator [^1]) // Check if the key is terminator (ANSI escape sequence ends) + // Read until no key is available if no terminator was specified or + // check if the key is terminator (ANSI escape sequence ends) + if (!string.IsNullOrEmpty (ansiRequest.Terminator) && keyInfo.KeyChar == ansiRequest.Terminator [^1]) { // Break out of the loop when terminator is found break; } } - if (!response.ToString ().EndsWith (ansiRequest.Terminator [^1])) + if (string.IsNullOrEmpty (ansiRequest.Terminator)) + { + error.AppendLine ("Terminator request is empty."); + } + else if (!response.ToString ().EndsWith (ansiRequest.Terminator [^1])) { throw new InvalidOperationException ($"Terminator doesn't ends with: '{ansiRequest.Terminator [^1]}'"); } @@ -142,6 +149,11 @@ public class AnsiEscapeSequenceRequest } finally { + if (string.IsNullOrEmpty (error.ToString ())) + { + (string? c1Control, string? code, values, string? terminator) = EscSeqUtils.GetEscapeResult (response.ToString ().ToCharArray ()); + } + if (savedIsReportingMouseMoves) { switch (Application.Driver) @@ -159,13 +171,6 @@ public class AnsiEscapeSequenceRequest } } - var values = new string? [] { null }; - - if (string.IsNullOrEmpty (error.ToString ())) - { - (string? c1Control, string? code, values, string? terminator) = EscSeqUtils.GetEscapeResult (response.ToString ().ToCharArray ()); - } - AnsiEscapeSequenceResponse ansiResponse = new () { Response = response.ToString (), Error = error.ToString (), diff --git a/UICatalog/Scenarios/AnsiEscapeSequenceRequests.cs b/UICatalog/Scenarios/AnsiEscapeSequenceRequests.cs index 88bdada34..eae5085bb 100644 --- a/UICatalog/Scenarios/AnsiEscapeSequenceRequests.cs +++ b/UICatalog/Scenarios/AnsiEscapeSequenceRequests.cs @@ -85,7 +85,7 @@ public sealed class AnsiEscapeSequenceRequests : Scenario var tvTerminator = new TextView { X = Pos.Left (label), Y = Pos.Bottom (label), Width = 4, Height = 4, ReadOnly = true }; appWindow.Add (label, tvTerminator); - var btnResponse = new Button { X = Pos.Center (), Y = Pos.Bottom (tvResponse) + 2, Text = "Send Request" }; + var btnResponse = new Button { X = Pos.Center (), Y = Pos.Bottom (tvResponse) + 2, Text = "Send Request", IsDefault = true }; var lblSuccess = new Label { X = Pos.Center (), Y = Pos.Bottom (btnResponse) + 1 }; appWindow.Add (lblSuccess);