和warp终端功能上看似相似,但我们将杜绝saas式的终端模拟器,并将根据目前的linux资深用户的特点设计图形界面和配置系统,以及shell扩展 保持尽量低的内存占用和高可扩展、复用 对于llm的输出,将使用可靠的日志记录数据库(sqlite),通过数据库进行内容生成,且具备至少一个联网模型,进行实时搜索 nasm 用于硬件抽象、syscall、FFI hook注入控制 c用于通信处理、字符串解析 rust用于图形渲染和复杂的优化、事件处理等
st Terminal
.-----------------------------.
| main() |
| |
| Initializes terminal |
| Calls xinit() & run() |
'-------------.---------------'
|
v
.-----------------------------.
| xinit() |
| |
| Initializes X11 display, |
| window, fonts, and colors |
| |
| Calls: |
| - xloadfonts() |
| - xloadcols() |
| - XCreateWindow() |
| - xhints() |
'-------------.---------------'
|
v
.-----------------------------.
| run() |
| |
| Main event loop |
| Handles X11 and TTY events |
| |
| Calls: |
| - ttynew() |
| - ttyread() |
| - draw() |
| - handler[ev.type]() |
'-------------.---------------'
|
v
.-----------------------------.
| draw() |
| |
| Renders terminal content |
| Calls xdrawline() for each |
| line |
| |
| Calls: |
| - xstartdraw() |
| - xdrawline() |
| - xfinishdraw() |
'-------------.---------------'
|
v
.-----------------------------.
| xdrawline() |
| |
| Draws a single line |
| Handles glyph rendering |
| |
| Calls: |
| - xmakeglyphfontspecs() |
| - xdrawglyphfontspecs() |
'-------------.---------------'
|
v
.-----------------------------.
| Input Handling |
| |
| Processes keyboard/mouse |
| |
| Key Functions: |
| - kpress() |
| - bpress() |
| - brelease() |
| - bmotion() |
| |
| Uses: |
| - kmap() (key mappings) |
| - shortcuts[] (hotkeys) |
| - mshortcuts[] (mouse) |
'-----------------------------'
|
v
.-----------------------------.
| TTY Handling |
| |
| Manages terminal I/O |
| |
| Key Functions: |
| - ttynew() |
| - ttyread() |
| - ttywrite() |
| - ttyresize() |
'-----------------------------'
|
v
.-----------------------------.
| Selection Handling |
| |
| Manages copy/paste |
| |
| Key Functions: |
| - selinit() |
| - selpaste() |
| - clipcopy() |
| - clippaste() |
| - xsetsel() |
'-----------------------------'
逻辑表述:
#### 1. **程序初始化**
- **功能**:启动终端,配置初始环境,准备运行。
- **逻辑流程**:
1. 解析命令行参数,获取用户指定的选项(如字体、窗口大小、执行命令等)。
2. 初始化终端数据结构,设置默认行列数(80列,24行)。
3. 设置 X11 显示环境,创建窗口,加载字体和颜色配置。
4. 初始化终端的输入输出通道(TTY),确定默认 shell(如 `/bin/sh`)。
5. 设置选择(剪贴板)机制,准备处理文本复制粘贴。
6. 进入主事件循环,等待用户输入或系统事件。
#### 2. **窗口与显示初始化**
- **功能**:创建并配置终端的图形界面。
- **逻辑流程**:
1. 连接到 X11 显示服务器,创建终端窗口。
2. 加载用户指定的字体(如 Liberation Mono,大小 12),支持常规、粗体、斜体等变体。
3. 配置颜色表(16种基本颜色 + 256色扩展),设置前景、背景、游标颜色。
4. 设置窗口属性(如大小、边框、最小尺寸),支持嵌入其他窗口(如通过 `-w` 参数)。
5. 初始化输入法支持,允许处理复杂字符输入(如中文)。
6. 设置鼠标游标样式和颜色,初始化绘图上下文。
#### 3. **主事件循环**
- **功能**:持续处理用户输入和系统事件,保持终端运行。
- **逻辑流程**:
1. 监听 X11 事件(键盘、鼠标、窗口调整等)和 TTY 输入。
2. 如果有新事件(如按键、鼠标点击),调用对应的事件处理函数。
3. 如果有 TTY 数据输入(来自 shell 或命令),读取并更新终端内容。
4. 根据事件或输入,触发屏幕重绘以更新显示。
5. 使用延迟机制(2ms 至 33ms)优化渲染,减少闪烁,确保流畅显示。
6. 处理闪烁属性(如光标或文本闪烁),根据超时时间切换显示状态。
#### 4. **终端内容渲染**
- **功能**:将终端的文本内容绘制到窗口。
- **逻辑流程**:
1. 检查是否需要绘制(窗口是否可见)。
2. 遍历终端的每一行文本,逐字符生成绘图指令(glyph 规格)。
3. 对于每个字符:
- 确定字体(常规、粗体、斜体),根据字符属性选择。
- 如果字体不支持该字符,使用备用字体(通过字体缓存或动态查找)。
- 计算字符位置(基于行列和像素坐标)。
- 应用颜色(前景、背景,支持反显、闪烁等属性)。
- 处理特殊样式(如下划线、删除线)。
4. 绘制光标(支持块状、下划线、竖线或自定义形状,如雪人)。
5. 清理边框区域,确保无残留像素。
6. 将绘制内容从缓冲区复制到窗口,完成渲染。
#### 5. **输入处理**
- **功能**:处理键盘和鼠标输入,转换为终端命令或操作。
- **逻辑流程**:
1. **键盘输入**:
- 捕获按键事件,识别按键符号(如字母、功能键、方向键)。
- 检查修饰键(如 Shift、Control、Alt),匹配预定义快捷键。
- 如果是快捷键(例如 Ctrl+Shift+C 复制),执行对应功能。
- 如果是普通按键,转换为字符序列,发送到 TTY。
- 支持输入法,处理复杂字符(如多字节字符)。
2. **鼠标输入**:
- 捕获鼠标按下、释放、移动事件。
- 如果启用鼠标模式,发送鼠标事件到应用程序(如 vim)。
- 否则,处理选择操作(拖动选择文本)或触发快捷键(如中键粘贴)。
3. 支持特殊键序列(如方向键、F1-F12),根据终端模式(应用键模式、游标模式)生成不同输出。
#### 6. **TTY 输入输出管理**
- **功能**:管理终端与 shell 或命令的交互。
- **逻辑流程**:
1. 创建 TTY 通道,启动默认 shell 或用户指定的命令。
2. 读取 shell 输出,更新终端的文本缓冲区。
3. 将用户输入(键盘或粘贴内容)写入 TTY,传递给 shell。
4. 调整 TTY 大小以匹配窗口尺寸变化,确保显示一致。
5. 支持特殊 TTY 设置(如无回显、原始模式)以优化交互。
#### 7. **选择与剪贴板管理**
- **功能**:支持文本选择、复制和粘贴。
- **逻辑流程**:
1. 初始化选择状态,跟踪用户选择的文本区域。
2. 当用户拖动鼠标或使用快捷键选择文本:
- 记录选择的行列范围。
- 支持矩形选择(按 Alt 键)。
3. 复制操作:将选中文本存储到主剪贴板(Primary)或系统剪贴板(Clipboard)。
4. 粘贴操作:从剪贴板读取文本,发送到 TTY 或插入到终端。
5. 处理 X11 剪贴板事件,确保与其他应用程序的兼容性。
6. 清除选择状态(例如,窗口失去焦点时)。
#### 8. **窗口与状态管理**
- **功能**:管理窗口状态和终端属性。
- **逻辑流程**:
1. 处理窗口事件(如调整大小、获得/失去焦点、关闭)。
2. 调整窗口大小时,重新计算行列数,更新 TTY 和显示缓冲区。
3. 设置窗口标题(基于命令或用户指定)。
4. 处理紧急通知(如终端未聚焦时的铃声提醒)。
5. 支持屏幕保护状态查询和模式切换(如反显、闪烁)。
---
以llm注入支持为核心,下列参考st的理念大概结构
-
功能:启动终端,配置初始环境,准备 Wayland 连接和 LLM 接口。
-
逻辑流程
:
- 解析命令行参数,获取选项(如字体、窗口大小、初始命令、LLM 接口端口)。
- 初始化终端数据结构,设置默认行列数(80列,24行)和缓冲区。
- 连接 Wayland 显示服务器,创建表面(surface)和窗口,绑定必要的协议(如 wl_compositor、xdg_shell)。
- 加载字体(使用 fcft 或类似库,支持基本变体如粗体、斜体)和颜色配置(16色 + 256色扩展)。
- 初始化 TTY 输入输出通道,启动默认 shell(如 /bin/sh)。
- 设置 LLM 操控接口:创建一个监听套接字或管道,允许 LLM 发送 JSON 格式命令(如 {"action": "execute", "command": "ls"})。
- 进入主事件循环,等待 Wayland 事件、TTY 输入或 LLM 指令。
asm实现终端数据结构、简单参数配置、调用、设置llm输出的socket等核心功能, c实现套接字的创建和通信功能、接入wayland
-
功能:处理 Wayland 协议,实现窗口创建和事件通信。
-
逻辑流程
:
- 使用 Wayland 客户端库连接 compositor,创建表面并附加缓冲区。
- 支持最小化配置:绑定 xdg_wm_base 协议处理窗口状态(最大化、最小化、关闭)。
- 处理表面缩放(fractional scaling),动态调整像素缓冲区大小。
- 在服务器模式下,支持多窗口共享资源(如字体缓存),通过 Wayland 套接字通信。
- 设置窗口属性(如标题、图标),响应 compositor 事件(如配置变化)。
- 如果 LLM 发送“resize”指令,调整窗口大小并通知 compositor。
nasm负责调用绑定处理wayland事件,c依然负责协议通信
-
功能:处理 Wayland 事件、TTY 输入和 LLM 指令,确保高效响应。
-
逻辑流程
:
- 监听 Wayland 事件(键盘、鼠标、触摸、窗口调整)和 TTY 输出。
- 如果有新事件,调用对应处理函数;同时检查 LLM 接口是否有新指令。
- 对于 TTY 数据:读取 shell 输出,更新终端缓冲区。
- 对于 LLM 指令:解析 JSON(如执行命令、注入输入、查询状态),并发送到 TTY 或直接操作缓冲区。
- 使用延迟优化渲染(例如 2-33ms 闲置检测),减少不必要重绘。
- 处理闪烁(如光标),根据超时切换状态;如果 LLM 请求“monitor”,实时发送输出到 LLM。
nasm功能照旧,c提供系统调用
-
功能:高效绘制文本内容到 Wayland 表面。
-
逻辑流程
:
- 检查窗口是否可见或需要更新。
- 遍历终端行,逐字符生成渲染规格(glyph)。
- 对于每个字符:
- 选择字体变体(基于属性如粗体、斜体)。
- 如果字体不支持,使用备用字体缓存或动态加载。
- 计算位置(行列转像素),应用颜色(前景、背景,支持反显、闪烁)。
- 处理特殊样式(如下划线、删除线、盒子绘制)。
- 绘制光标(块状、下划线或竖线)。
- 使用共享内存缓冲区(shm)附加到 Wayland 表面,提交渲染。
- 如果 LLM 发送“render”指令,强制重绘或注入自定义文本。
nasm优化高频计算,c做字体和wayland渲染
-
功能:处理键盘、鼠标和 LLM 注入输入。
-
逻辑流程
:(cpp风格冒号(bushi
-
键盘/鼠标输入
:
- 捕获 Wayland 事件,识别键码或鼠标动作。
- 检查修饰键,匹配快捷键(如 Ctrl+Shift+C 复制)。
- 转换为字符序列,发送到 TTY。
- 支持 IME(输入法编辑器)处理复杂字符。
- 鼠标事件:选择文本、滚动或调整字体大小。
-
LLM 注入
:
- 如果 LLM 发送“input”指令(如模拟按键),直接注入到输入队列。
- 支持自动化:LLM 可以“watch”输出并响应(如解析错误,自动重试命令)。
-
-
功能:管理终端与 shell 的交互,支持 LLM 监控。
-
逻辑流程
:
- 创建 TTY 通道,启动 shell 或命令。
- 异步读取 shell 输出,更新缓冲区并触发渲染。
- 将用户或 LLM 输入写入 TTY。
- 调整 TTY 大小以匹配窗口变化。
- 支持 OSC 序列(操作系统命令)如设置标题、报告 CWD。
- LLM 操控:如果指令为“execute”,将命令发送到 TTY;“query”则返回当前输出快照。
-
功能:支持文本选择和粘贴,LLM 可访问。
-
逻辑流程
:
- 跟踪选择区域(鼠标拖动或快捷键)。
- 支持矩形选择。
- 复制:存储选中文本到 Wayland 剪贴板(wl_data_device_manager)。
- 粘贴:从剪贴板读取,注入到 TTY。
- LLM 操控:指令如“copy”提取文本发送给 LLM;“paste”从 LLM 接收文本插入。
-
功能:允许 LLM 底层控制终端,实现智能自动化。
-
逻辑流程
:
- 初始化接口(套接字监听),接受 JSON 指令。
- 支持指令类型:
- 执行命令:注入到 TTY。
- 监控输出:实时或批量发送终端缓冲区内容给 LLM。
- 自动化响应:LLM 解析输出,发送后续指令(如错误修复)。
- 查询状态:返回窗口大小、当前 shell 等。
- 确保安全:限制指令范围,避免无限循环。
- 集成到事件循环:与 Wayland/TTY 事件并行处理。