#nullable enable.

This commit is contained in:
BDisp
2024-11-07 15:41:58 +00:00
parent 44d5997460
commit 873b5783ef
4 changed files with 52 additions and 48 deletions

View File

@@ -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 _);

View File

@@ -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 (),
return (EventType switch
{
EventType.Key => ToString (ConsoleKeyInfo),
EventType.Mouse => MouseEvent.ToString (),
//EventType.WindowSize => WindowSize.ToString (),
//EventType.RequestResponse => RequestResponse.ToString (),
_ => "Unknown event type: " + EventType
};
//EventType.WindowSize => WindowSize.ToString (),
//EventType.RequestResponse => RequestResponse.ToString (),
_ => "Unknown event type: " + EventType
})!;
}
/// <summary>Prints a ConsoleKeyInfoEx structure</summary>

View File

@@ -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)
{

View File

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