mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2026-01-02 01:03:29 +01:00
Change TryWriteAnsiRequest method to virtual which use common code for all drivers.
This commit is contained in:
@@ -187,68 +187,6 @@ internal class WindowsDriver : ConsoleDriver
|
||||
}
|
||||
}
|
||||
|
||||
private readonly ManualResetEventSlim _waitAnsiResponse = new (false);
|
||||
private CancellationTokenSource? _ansiResponseTokenSource;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override bool TryWriteAnsiRequest (AnsiEscapeSequenceRequest ansiRequest)
|
||||
{
|
||||
if (_mainLoopDriver is null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
_ansiResponseTokenSource ??= new ();
|
||||
|
||||
try
|
||||
{
|
||||
lock (ansiRequest._responseLock)
|
||||
{
|
||||
ansiRequest.ResponseFromInput += (s, e) =>
|
||||
{
|
||||
Debug.Assert (s == ansiRequest);
|
||||
Debug.Assert (e == ansiRequest.AnsiEscapeSequenceResponse);
|
||||
|
||||
_waitAnsiResponse.Set ();
|
||||
};
|
||||
|
||||
AnsiEscapeSequenceRequests.Add (ansiRequest);
|
||||
|
||||
WriteRaw (ansiRequest.Request);
|
||||
|
||||
_mainLoopDriver._forceRead = true;
|
||||
}
|
||||
|
||||
_waitAnsiResponse.Wait (_ansiResponseTokenSource.Token);
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
lock (ansiRequest._responseLock)
|
||||
{
|
||||
_mainLoopDriver._forceRead = false;
|
||||
|
||||
if (AnsiEscapeSequenceRequests.Statuses.TryPeek (out AnsiEscapeSequenceRequestStatus? request))
|
||||
{
|
||||
if (AnsiEscapeSequenceRequests.Statuses.Count > 0
|
||||
&& string.IsNullOrEmpty (request.AnsiRequest.AnsiEscapeSequenceResponse?.Response))
|
||||
{
|
||||
lock (request.AnsiRequest._responseLock)
|
||||
{
|
||||
// Bad request or no response at all
|
||||
AnsiEscapeSequenceRequests.Statuses.TryDequeue (out _);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_waitAnsiResponse.Reset ();
|
||||
|
||||
return ansiRequest.AnsiEscapeSequenceResponse is { Valid: true };
|
||||
}
|
||||
}
|
||||
|
||||
internal override void WriteRaw (string ansi) { WinConsole?.WriteANSI (ansi); }
|
||||
|
||||
#region Not Implemented
|
||||
|
||||
Reference in New Issue
Block a user