Browse Source

Add abstract WriteAnsi into the ConsoleDriver for each driver handling ansi escape sequence.

BDisp 9 months ago
parent
commit
b35b9f537a

+ 1 - 1
Terminal.Gui/ConsoleDrivers/AnsiEscapeSequence/AnsiEscapeSequenceRequest.cs

@@ -73,7 +73,7 @@ public class AnsiEscapeSequenceRequest
             driver!.IsSuspendRead = true;
 
             // Send the ANSI escape sequence
-            Console.Write (ansiRequest.Request);
+            driver.WriteAnsi (ansiRequest.Request);
             Console.Out.Flush (); // Ensure the request is sent
 
             // Read the response from stdin (response should come back as input)

+ 7 - 0
Terminal.Gui/ConsoleDrivers/ConsoleDriver.cs

@@ -628,6 +628,13 @@ public abstract class ConsoleDriver
     /// </summary>
     public abstract void StopReportingMouseMoves ();
 
+    /// <summary>
+    /// Provide handling for the terminal write ANSI escape sequence.
+    /// </summary>
+    /// <param name="ansi">The ANSI escape sequence.</param>
+    /// <returns></returns>
+    public abstract bool WriteAnsi (string ansi);
+
     #endregion
 }
 

+ 15 - 0
Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs

@@ -215,6 +215,21 @@ internal class CursesDriver : ConsoleDriver
         }
     }
 
+    /// <inheritdoc />
+    public override bool WriteAnsi (string ansi)
+    {
+        try
+        {
+            Console.Out.Write (ansi);
+        }
+        catch (Exception)
+        {
+            return false;
+        }
+
+        return true;
+    }
+
     public override void Suspend ()
     {
         StopReportingMouseMoves ();

+ 15 - 0
Terminal.Gui/ConsoleDrivers/FakeDriver/FakeDriver.cs

@@ -414,6 +414,21 @@ public class FakeDriver : ConsoleDriver
     /// <inheritdoc />
     public override void StopReportingMouseMoves () { throw new NotImplementedException (); }
 
+    /// <inheritdoc />
+    public override bool WriteAnsi (string ansi)
+    {
+        try
+        {
+            Console.Out.Write (ansi);
+        }
+        catch (Exception)
+        {
+            return false;
+        }
+
+        return true;
+    }
+
     public void SetBufferSize (int width, int height)
     {
         FakeConsole.SetBufferSize (width, height);

+ 16 - 1
Terminal.Gui/ConsoleDrivers/NetDriver.cs

@@ -1419,7 +1419,22 @@ internal class NetDriver : ConsoleDriver
         }
     }
 
-    private MouseEventArgs ToDriverMouse (NetEvents.MouseEvent me)
+    /// <inheritdoc />
+    public override bool WriteAnsi (string ansi)
+    {
+        try
+        {
+            Console.Out.Write (ansi);
+        }
+        catch (Exception)
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+    private MouseEvent ToDriverMouse (NetEvents.MouseEvent me)
     {
        //System.Diagnostics.Debug.WriteLine ($"X: {me.Position.X}; Y: {me.Position.Y}; ButtonState: {me.ButtonState}");
 

+ 13 - 7
Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

@@ -134,7 +134,7 @@ internal class WindowsConsole
         return result;
     }
 
-    public bool WriteANSI (string ansi)
+    internal bool WriteANSI (string ansi)
     {
         return WriteConsole (_screenBuffer, ansi, (uint)ansi.Length, out uint _, nint.Zero);
     }
@@ -1177,13 +1177,17 @@ internal class WindowsDriver : ConsoleDriver
     }
 
     /// <inheritdoc />
+    public override bool WriteAnsi (string ansi)
+    {
+        return WinConsole?.WriteANSI (ansi) ?? false;
+    }
+
+    #region Not Implemented
+
     public override void StartReportingMouseMoves () { throw new NotImplementedException (); }
 
-    /// <inheritdoc />
     public override void StopReportingMouseMoves () { throw new NotImplementedException (); }
 
-    #region Not Implemented
-
     public override void Suspend () { throw new NotImplementedException (); }
 
     #endregion
@@ -1235,7 +1239,7 @@ internal class WindowsDriver : ConsoleDriver
         {
             var sb = new StringBuilder ();
             sb.Append (EscSeqUtils.CSI_SetCursorPosition (position.Y + 1, position.X + 1));
-            WinConsole?.WriteANSI (sb.ToString ());
+            WriteAnsi (sb.ToString ());
         }
 
         if (_cachedCursorVisibility is { })
@@ -1271,7 +1275,8 @@ internal class WindowsDriver : ConsoleDriver
         {
             var sb = new StringBuilder ();
             sb.Append (visibility != CursorVisibility.Invisible ? EscSeqUtils.CSI_ShowCursor : EscSeqUtils.CSI_HideCursor);
-            return WinConsole?.WriteANSI (sb.ToString ()) ?? false;
+
+            return WriteAnsi (sb.ToString ());
         }
     }
 
@@ -1286,7 +1291,8 @@ internal class WindowsDriver : ConsoleDriver
         {
             var sb = new StringBuilder ();
             sb.Append (_cachedCursorVisibility != CursorVisibility.Invisible ? EscSeqUtils.CSI_ShowCursor : EscSeqUtils.CSI_HideCursor);
-            return WinConsole?.WriteANSI (sb.ToString ()) ?? false;
+
+            return WriteAnsi (sb.ToString ());
         }
 
         //if (!(Col >= 0 && Row >= 0 && Col < Cols && Row < Rows))