2
0
BDisp 9 сар өмнө
parent
commit
873b5783ef

+ 18 - 13
Terminal.Gui/ConsoleDrivers/NetDriver/NetDriver.cs

@@ -1,4 +1,4 @@
-// TODO: #nullable enable
+#nullable enable
 //
 // NetDriver.cs: The System.Console-based .NET driver, works on Windows and Unix, but is not particularly efficient.
 //
@@ -14,7 +14,7 @@ namespace Terminal.Gui;
 internal class NetDriver : ConsoleDriver
 {
     public bool IsWinPlatform { get; private set; }
-    public NetWinVTConsole NetWinConsole { get; private set; }
+    public NetWinVTConsole? NetWinConsole { get; private set; }
 
     public override void Refresh ()
     {
@@ -61,7 +61,7 @@ internal class NetDriver : ConsoleDriver
         if (RunningUnitTests
             || _winSizeChanging
             || Console.WindowHeight < 1
-            || Contents.Length != Rows * Cols
+            || Contents?.Length != Rows * Cols
             || Rows != Console.WindowHeight)
         {
             return;
@@ -85,7 +85,7 @@ internal class NetDriver : ConsoleDriver
                 return;
             }
 
-            if (!_dirtyLines [row])
+            if (!_dirtyLines! [row])
             {
                 continue;
             }
@@ -129,7 +129,7 @@ internal class NetDriver : ConsoleDriver
                         lastCol = col;
                     }
 
-                    Attribute attr = Contents [row, col].Attribute.Value;
+                    Attribute attr = Contents [row, col].Attribute!.Value;
 
                     // Performance: Only send the escape sequence if the attribute has changed.
                     if (attr != redrawAttr)
@@ -229,7 +229,7 @@ internal class NetDriver : ConsoleDriver
 
     #region Init/End/MainLoop
 
-    internal NetMainLoop _mainLoopDriver;
+    internal NetMainLoop? _mainLoopDriver;
 
     internal override MainLoop Init ()
     {
@@ -339,7 +339,7 @@ internal class NetDriver : ConsoleDriver
                 Left = 0;
                 Cols = inputEvent.WindowSizeEvent.Size.Width;
                 Rows = Math.Max (inputEvent.WindowSizeEvent.Size.Height, 0);
-                ;
+
                 ResizeScreen ();
                 ClearContents ();
                 _winSizeChanging = false;
@@ -727,16 +727,21 @@ internal class NetDriver : ConsoleDriver
     #region Low-Level DotNet tuff
 
     private readonly ManualResetEventSlim _waitAnsiResponse = new (false);
-    private readonly CancellationTokenSource _ansiResponseTokenSource = new ();
+    private CancellationTokenSource? _ansiResponseTokenSource;
 
     /// <inheritdoc/>
-    public override string WriteAnsiRequest (AnsiEscapeSequenceRequest ansiRequest)
+    public override string? WriteAnsiRequest (AnsiEscapeSequenceRequest ansiRequest)
     {
-        if (_mainLoopDriver is null)
+        lock (ansiRequest._responseLock)
         {
-            return string.Empty;
+            if (_mainLoopDriver is null)
+            {
+                return string.Empty;
+            }
         }
 
+        _ansiResponseTokenSource ??= new ();
+
         try
         {
             lock (ansiRequest._responseLock)
@@ -765,12 +770,12 @@ internal class NetDriver : ConsoleDriver
         {
             _mainLoopDriver._netEvents._forceRead = false;
 
-            if (_mainLoopDriver._netEvents.EscSeqRequests.Statuses.TryPeek (out AnsiEscapeSequenceRequestStatus request))
+            if (_mainLoopDriver._netEvents.EscSeqRequests.Statuses.TryPeek (out AnsiEscapeSequenceRequestStatus? request))
             {
                 if (_mainLoopDriver._netEvents.EscSeqRequests.Statuses.Count > 0
                     && string.IsNullOrEmpty (request.AnsiRequest.Response))
                 {
-                    lock (request!.AnsiRequest._responseLock)
+                    lock (request.AnsiRequest._responseLock)
                     {
                         // Bad request or no response at all
                         _mainLoopDriver._netEvents.EscSeqRequests.Statuses.TryDequeue (out _);

+ 17 - 17
Terminal.Gui/ConsoleDrivers/NetDriver/NetEvents.cs

@@ -1,4 +1,4 @@
-// TODO: #nullable enable
+#nullable enable
 using System.Collections.Concurrent;
 using System.Diagnostics.CodeAnalysis;
 
@@ -6,10 +6,10 @@ namespace Terminal.Gui;
 
 internal class NetEvents : IDisposable
 {
-    private CancellationTokenSource _inputReadyCancellationTokenSource;
+    private CancellationTokenSource? _inputReadyCancellationTokenSource;
     private readonly BlockingCollection<InputResult> _inputQueue = new (new ConcurrentQueue<InputResult> ());
     private readonly ConsoleDriver _consoleDriver;
-    private ConsoleKeyInfo [] _cki;
+    private ConsoleKeyInfo []? _cki;
     private bool _isEscSeq;
 #if PROCESS_REQUEST
     bool _neededProcessRequest;
@@ -62,9 +62,9 @@ internal class NetEvents : IDisposable
             {
                 if (_retries > 1)
                 {
-                    if (EscSeqRequests.Statuses.TryPeek (out AnsiEscapeSequenceRequestStatus seqReqStatus) && string.IsNullOrEmpty (seqReqStatus.AnsiRequest.Response))
+                    if (EscSeqRequests.Statuses.TryPeek (out AnsiEscapeSequenceRequestStatus? seqReqStatus) && string.IsNullOrEmpty (seqReqStatus.AnsiRequest.Response))
                     {
-                        lock (seqReqStatus!.AnsiRequest._responseLock)
+                        lock (seqReqStatus.AnsiRequest._responseLock)
                         {
                             EscSeqRequests.Statuses.TryDequeue (out _);
 
@@ -319,7 +319,7 @@ internal class NetEvents : IDisposable
                                   out bool isMouse,
                                   out List<MouseFlags> mouseFlags,
                                   out Point pos,
-                                  out AnsiEscapeSequenceRequestStatus seqReqStatus,
+                                  out AnsiEscapeSequenceRequestStatus? seqReqStatus,
                                   (f, p) => HandleMouseEvent (MapMouseFlags (f), p)
                                  );
 
@@ -350,7 +350,7 @@ internal class NetEvents : IDisposable
 
         if (!string.IsNullOrEmpty (AnsiEscapeSequenceRequestUtils.InvalidRequestTerminator))
         {
-            if (EscSeqRequests.Statuses.TryDequeue (out AnsiEscapeSequenceRequestStatus result))
+            if (EscSeqRequests.Statuses.TryDequeue (out AnsiEscapeSequenceRequestStatus? result))
             {
                 lock (result.AnsiRequest._responseLock)
                 {
@@ -504,7 +504,7 @@ internal class NetEvents : IDisposable
         return mbs;
     }
 
-    private Point _lastCursorPosition;
+    //private Point _lastCursorPosition;
 
     //private void HandleRequestResponseEvent (string c1Control, string code, string [] values, string terminating)
     //{
@@ -651,15 +651,15 @@ internal class NetEvents : IDisposable
 
         public readonly override string ToString ()
         {
-            return EventType switch
-                   {
-                       EventType.Key => ToString (ConsoleKeyInfo),
-                       EventType.Mouse => MouseEvent.ToString (),
-
-                       //EventType.WindowSize => WindowSize.ToString (),
-                       //EventType.RequestResponse => RequestResponse.ToString (),
-                       _ => "Unknown event type: " + EventType
-                   };
+            return (EventType switch
+                    {
+                        EventType.Key => ToString (ConsoleKeyInfo),
+                        EventType.Mouse => MouseEvent.ToString (),
+
+                        //EventType.WindowSize => WindowSize.ToString (),
+                        //EventType.RequestResponse => RequestResponse.ToString (),
+                        _ => "Unknown event type: " + EventType
+                    })!;
         }
 
         /// <summary>Prints a ConsoleKeyInfoEx structure</summary>

+ 16 - 18
Terminal.Gui/ConsoleDrivers/NetDriver/NetMainLoop.cs

@@ -1,4 +1,5 @@
-using System.Collections.Concurrent;
+#nullable enable
+using System.Collections.Concurrent;
 
 namespace Terminal.Gui;
 
@@ -9,22 +10,22 @@ namespace Terminal.Gui;
 /// <remarks>This implementation is used for NetDriver.</remarks>
 internal class NetMainLoop : IMainLoopDriver
 {
-    internal NetEvents _netEvents;
+    internal NetEvents? _netEvents;
 
     /// <summary>Invoked when a Key is pressed.</summary>
-    internal Action<NetEvents.InputResult> ProcessInput;
+    internal Action<NetEvents.InputResult>? ProcessInput;
 
     private readonly ManualResetEventSlim _eventReady = new (false);
     private readonly CancellationTokenSource _inputHandlerTokenSource = new ();
     private readonly BlockingCollection<NetEvents.InputResult> _resultQueue = new (new ConcurrentQueue<NetEvents.InputResult> ());
     private readonly CancellationTokenSource _eventReadyTokenSource = new ();
-    private MainLoop _mainLoop;
+    private MainLoop? _mainLoop;
 
     /// <summary>Initializes the class with the console driver.</summary>
     /// <remarks>Passing a consoleDriver is provided to capture windows resizing.</remarks>
     /// <param name="consoleDriver">The console driver used by this Net main loop.</param>
     /// <exception cref="ArgumentNullException"></exception>
-    public NetMainLoop (ConsoleDriver consoleDriver = null)
+    public NetMainLoop (ConsoleDriver consoleDriver)
     {
         ArgumentNullException.ThrowIfNull (consoleDriver);
 
@@ -47,7 +48,7 @@ internal class NetMainLoop : IMainLoopDriver
 
     bool IMainLoopDriver.EventsPending ()
     {
-        if (_resultQueue.Count > 0 || _mainLoop.CheckTimersAndIdleHandlers (out int waitTimeout))
+        if (_resultQueue.Count > 0 || _mainLoop!.CheckTimersAndIdleHandlers (out int waitTimeout))
         {
             return true;
         }
@@ -88,24 +89,21 @@ internal class NetMainLoop : IMainLoopDriver
             // Always dequeue even if it's null and invoke if isn't null
             if (_resultQueue.TryTake (out NetEvents.InputResult dequeueResult))
             {
-                if (dequeueResult is { })
-                {
-                    ProcessInput?.Invoke (dequeueResult);
-                }
+                ProcessInput?.Invoke (dequeueResult);
             }
         }
     }
 
     void IMainLoopDriver.TearDown ()
     {
-        _inputHandlerTokenSource?.Cancel ();
-        _inputHandlerTokenSource?.Dispose ();
-        _eventReadyTokenSource?.Cancel ();
-        _eventReadyTokenSource?.Dispose ();
+        _inputHandlerTokenSource.Cancel ();
+        _inputHandlerTokenSource.Dispose ();
+        _eventReadyTokenSource.Cancel ();
+        _eventReadyTokenSource.Dispose ();
 
-        _eventReady?.Dispose ();
+        _eventReady.Dispose ();
 
-        _resultQueue?.Dispose();
+        _resultQueue.Dispose();
         _netEvents?.Dispose ();
         _netEvents = null;
 
@@ -123,9 +121,9 @@ internal class NetMainLoop : IMainLoopDriver
                     return;
                 }
 
-                if (_resultQueue?.Count == 0 || _netEvents._forceRead)
+                if (_resultQueue?.Count == 0 || _netEvents!._forceRead)
                 {
-                    NetEvents.InputResult? result = _netEvents.DequeueInput ();
+                    NetEvents.InputResult? result = _netEvents!.DequeueInput ();
 
                     if (result.HasValue)
                     {

+ 2 - 1
Terminal.Gui/ConsoleDrivers/NetDriver/NetWinVTConsole.cs

@@ -1,4 +1,5 @@
-using System.Runtime.InteropServices;
+#nullable enable
+using System.Runtime.InteropServices;
 
 namespace Terminal.Gui;