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:
chuan
2026-06-03 21:48:00 +08:00
parent 3e60aa16ab
commit 0d9a36b6a6
3 changed files with 294 additions and 2 deletions
+72 -2
View File
@@ -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(),
}));
}