Add support for setting encoding
This commit is contained in:
Родитель
0e0d1bd1af
Коммит
28b951d919
|
@ -8,14 +8,20 @@ namespace Spectre.Terminals.Windows
|
||||||
internal sealed class WindowsTerminalReader : WindowsTerminalHandle, ITerminalReader
|
internal sealed class WindowsTerminalReader : WindowsTerminalHandle, ITerminalReader
|
||||||
{
|
{
|
||||||
private readonly WindowsDriver _driver;
|
private readonly WindowsDriver _driver;
|
||||||
|
private Encoding _encoding;
|
||||||
|
|
||||||
|
public Encoding Encoding
|
||||||
|
{
|
||||||
|
get => _encoding;
|
||||||
|
set => SetEncoding(value);
|
||||||
|
}
|
||||||
|
|
||||||
public Encoding Encoding { get; }
|
|
||||||
public bool IsRawMode => _driver.IsRawMode;
|
public bool IsRawMode => _driver.IsRawMode;
|
||||||
|
|
||||||
public WindowsTerminalReader(WindowsDriver driver)
|
public WindowsTerminalReader(WindowsDriver driver)
|
||||||
: base(STD_HANDLE_TYPE.STD_INPUT_HANDLE)
|
: base(STD_HANDLE_TYPE.STD_INPUT_HANDLE)
|
||||||
{
|
{
|
||||||
Encoding = EncodingHelper.GetEncodingFromCodePage((int)PInvoke.GetConsoleCP());
|
_encoding = EncodingHelper.GetEncodingFromCodePage((int)PInvoke.GetConsoleCP());
|
||||||
_driver = driver;
|
_driver = driver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,5 +51,13 @@ namespace Spectre.Terminals.Windows
|
||||||
|
|
||||||
return (int)result;
|
return (int)result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetEncoding(Encoding encoding)
|
||||||
|
{
|
||||||
|
if (PInvoke.SetConsoleCP((uint)encoding.CodePage))
|
||||||
|
{
|
||||||
|
_encoding = encoding;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace Spectre.Terminals
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the encoding.
|
/// Gets the encoding.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Encoding Encoding { get; }
|
Encoding Encoding { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a value indicating whether or not the reader has been redirected.
|
/// Gets a value indicating whether or not the reader has been redirected.
|
||||||
|
|
|
@ -9,7 +9,12 @@ namespace Spectre.Terminals
|
||||||
private readonly object _lock;
|
private readonly object _lock;
|
||||||
private ITerminalReader? _redirected;
|
private ITerminalReader? _redirected;
|
||||||
|
|
||||||
public Encoding Encoding => GetEncoding();
|
public Encoding Encoding
|
||||||
|
{
|
||||||
|
get => GetEncoding();
|
||||||
|
set => SetEncoding(value);
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsRedirected => GetIsRedirected();
|
public bool IsRedirected => GetIsRedirected();
|
||||||
|
|
||||||
public TerminalInput(ITerminalReader reader)
|
public TerminalInput(ITerminalReader reader)
|
||||||
|
@ -39,6 +44,19 @@ namespace Spectre.Terminals
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool GetIsRedirected()
|
||||||
|
{
|
||||||
|
lock (_lock)
|
||||||
|
{
|
||||||
|
if (_redirected != null)
|
||||||
|
{
|
||||||
|
return _redirected.IsRedirected;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _reader.IsRedirected;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Encoding GetEncoding()
|
private Encoding GetEncoding()
|
||||||
{
|
{
|
||||||
lock (_lock)
|
lock (_lock)
|
||||||
|
@ -52,16 +70,23 @@ namespace Spectre.Terminals
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool GetIsRedirected()
|
private void SetEncoding(Encoding encoding)
|
||||||
{
|
{
|
||||||
|
if (encoding is null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(encoding));
|
||||||
|
}
|
||||||
|
|
||||||
lock (_lock)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
if (_redirected != null)
|
if (_redirected != null)
|
||||||
{
|
{
|
||||||
return _redirected.IsRedirected;
|
_redirected.Encoding = encoding;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_reader.Encoding = encoding;
|
||||||
}
|
}
|
||||||
|
|
||||||
return _reader.IsRedirected;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче