Ghostty 源码拆解

Ghostty 源码拆解

从进程入口到 GPU 帧的 Ghostty 源码阅读路线

Ghostty 源码拆解

Ghostty 的核心问题不是“把字符画到窗口里”,而是:在 shell、PTY、终端协议、字体 shaping、GPU 和原生窗口系统之间,如何保持高吞吐、低延迟、可移植,又不牺牲终端兼容性。

这套笔记以 ghostty-main 本地快照为基线,沿用 refs/dg-ai-notes 的拆解方法:每章都把概念、源码证据、运行链路、设计取舍和失败路径放在一起。

先看一张总图

CLI / AppKit / GTK
        │  runtime callbacks + C ABI

App ─── Surface ─── Renderer Thread
 │         │              │
 │         └──── Termio ──┘
 │                 │
 │        PTY / subprocess / xev
 │                 │
 └──────── TerminalStream

          Parser → Terminal → Screen/Page
                   │              │
                   └──── State ───┘

                font shaping + atlas

                   Metal/OpenGL/WebGL

章节导航

章节核心问题
00. 阅读指南如何带着问题读一个 4,000+ 文件的终端项目?
01. 全景架构Ghostty 的共享核心、运行时和渲染边界在哪里?
02. 启动与运行时一个进程如何从 main 走到窗口和线程?
03. 配置与输入配置、keybind、action 如何变成运行时行为?
04. PTY 与 Termioshell 输出如何被读取、写回和跨线程传递?
05. VT Parser 与 Terminal转义序列如何改变终端状态?
06. Screen 与 Scrollback网格、alternate screen、scrollback 和压缩如何组织?
07. 字体与 Renderer一个 Unicode cell 如何成为 GPU 可绘制几何?
08. 平台宿主macOS SwiftUI、GTK 和 embedded runtime 如何复用核心?
09. libghostty 与 C APIGhostty 如何从应用变成可嵌入库?
10. 构建、测试与发布Zig build graph 如何产出 exe、库、WASM 和文档?
11. 源码地图遇到具体问题时应该打开哪些文件?
12. 术语与不变量高频类型、线程边界和不能破坏的约束是什么?

阅读声明:本文是独立学习笔记,不是 Ghostty 官方文档。对于上游持续变化的内容,以本文记录的本地快照和源码路径为准。

On this page