feat: add console terminal io
- implement console-backed terminal input and resize polling - implement console-backed terminal output helpers - add example program for manual IO verification
This commit is contained in:
+72
-2
@@ -1,2 +1,72 @@
|
||||
// See https://aka.ms/new-console-template for more information
|
||||
Console.WriteLine("Hello, World!");
|
||||
using TinyTUI;
|
||||
using TinyTUI.Stdio;
|
||||
using TinyTUI.Stdout;
|
||||
|
||||
using var input = new ConsoleTerminalInput();
|
||||
var output = new ConsoleTerminalOutput();
|
||||
var done = new ManualResetEventSlim();
|
||||
var latestSize = input.CurrentSize;
|
||||
|
||||
output.ClearScreen();
|
||||
output.HideCursor();
|
||||
Render(output, latestSize, "等待输入");
|
||||
|
||||
input.DataReceived += (_, data) =>
|
||||
{
|
||||
if (data == "\x1b")
|
||||
{
|
||||
done.Set();
|
||||
return;
|
||||
}
|
||||
|
||||
Render(output, latestSize, $"按键: {FormatInput(data)}");
|
||||
};
|
||||
|
||||
input.Resized += (_, size) =>
|
||||
{
|
||||
latestSize = size;
|
||||
Render(output, latestSize, "窗口尺寸已变化");
|
||||
};
|
||||
|
||||
try
|
||||
{
|
||||
input.Start();
|
||||
done.Wait();
|
||||
}
|
||||
finally
|
||||
{
|
||||
input.Stop();
|
||||
output.ShowCursor();
|
||||
output.Write("\r\n");
|
||||
output.Flush();
|
||||
}
|
||||
|
||||
static void Render(ConsoleTerminalOutput output, TerminalSize size, string message)
|
||||
{
|
||||
output.ClearScreen();
|
||||
output.Write("TinyTUI IO 示例\r\n");
|
||||
output.Write("================\r\n");
|
||||
output.Write($"尺寸: {size.Columns} x {size.Rows}\r\n");
|
||||
output.Write($"{message}\r\n");
|
||||
output.Write("\r\n");
|
||||
output.Write("测试方式:\r\n");
|
||||
output.Write("- 输入普通字符 观察按键内容\r\n");
|
||||
output.Write("- 按方向键 Home End Delete F1-F12 观察原始序列\r\n");
|
||||
output.Write("- 改变终端窗口大小 观察尺寸刷新\r\n");
|
||||
output.Write("- 按 Esc 退出\r\n");
|
||||
output.Flush();
|
||||
}
|
||||
|
||||
static string FormatInput(string data)
|
||||
{
|
||||
return string.Join(' ', data.Select(static c => c switch
|
||||
{
|
||||
'\r' => "\\r",
|
||||
'\n' => "\\n",
|
||||
'\t' => "\\t",
|
||||
'\b' => "\\b",
|
||||
'\x1b' => "\\x1b",
|
||||
_ when char.IsControl(c) => $"\\x{(int)c:x2}",
|
||||
_ => c.ToString(),
|
||||
}));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user