2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

次世代ターミナルエミュレータ「Ghostty」のWindowsネイティブ実装

2
Last updated at Posted at 2026-09-17

1. プロジェクトの目的と概要

Ghostty はZig言語で実装された、高速かつ機能豊富なGPUアクセラレーション対応ターミナルエミュレータです。公式アップストリーム(ghostty-org/ghostty)におけるWindowsネイティブ対応は開発途上のステータスにあります。

なお、公式アップストリームではAIの濫用に対する制限が厳密に定められており、PRやIssueの作成を含め厳格な運用ポリシーが存在します。本リポジトリではアップストリームへのPRやIssue作成を行わない運用をとっています。

本プロジェクト(fukuyori/ghostty / windows ブランチ)は、バイブコーディングによって進められており、サードパーティ製のGUIフレームワークを使用せず、Win32 API および Direct3D 11 (D3D11) / DirectComposition を直接用いたWindowsネイティブ移植を行っています。

本実装では、Phase 1(基本ランタイム・IME追従)から Phase 6(リリーススクリプト完備)までのロードマップを実装済みです。専用ConPTYホストの同梱による Kitty Graphics Protocol(画像表示)対応、日本語IMEのカーソル位置インライン追従、Win32ネイティブのタブバー、画面分割線のマウスドラッグ操作、マルチモニターDPI(Dynamic DPI)追従、ハイコントラスト対応、および Inno Setup インストーラー作成スクリプト(build-installer.ps1)が含まれます。

本稿では、本リポジトリの内部構造を起点とし、コミュニティ内の先行・関連移植フォーク(noctty、liamsmith86/ghostty-windows、zcg/ghostty-win、mattn/ghostty)および既存の主要Windowsターミナル製品(Windows Terminal、Alacritty、WezTerm)とのコードレベル・システムアーキテクチャレベルの詳細比較分析を行います。


2. Ghosttyの内部設計と本リポジトリのアーキテクチャ構成

Ghosttyのコードベースは、VTエスケープシーケンス解釈、内部グリッドバッファ、グリフアトラス生成といったプラットフォーム共通のコアロジック(src/terminal/ や src/font/)と、各OSのウィンドウ生成・描画・イベントループを担うランタイム抽象化層(apprt)が明確に分離された構造をとっています。

  • src/apprt/embedded.zig:macOS向け(AppKit、Metal)
  • src/apprt/gtk.zig:Linux向け(GTK4、Wayland/X11)
  • src/apprt/win32/:Windowsネイティブ向け(Win32 API、Direct3D 11)

本プロジェクト(fukuyori/ghostty)では、公式のアーキテクチャ設計にそのまま適合させるため、Win32ランタイムロジックを src/apprt/win32/ ディレクトリ配下にモジュール化して整理し、コアとの境界を極めてクリーンに保っています。

主要モジュール構成

  • App.zig:アプリケーションライフサイクル、メッセージ専用ウィンドウ(GhosttyWakeup / HWND_MESSAGE)によるモーダルループ内での非同期メッセージディスパッチ、GPUリセット・スリープ復帰に対応するバックオフ付き自動復旧機構(GPU Recovery / Power Resume)の管理。
  • Window.zig / Surface.zig / Tab.zig:Window -> Tab -> Surface/SplitTree という明確なオブジェクト所有権階層の構築。
  • TabBar.zig & TabBarAccessibility.zig:素のWin32 APIで描画されるネイティブタブバー。タブのドラッグ並べ替え、マウスホイール切替、ダブルクリックでのインライン名変更ダイアログ、オーバーフロー時左右スクロール、MSAA(Microsoft Active Accessibility)対応。
  • SplitTree.zig:Ghosttyコアのサーフェス分割ツリーと連動した、画面分割線のホバー表示・マウスドラッグリサイズ(GhosttySplitDivider レイヤードウィンドウ)・最小セルサイズ制約・Split Zoom表示。
  • DirectComposition.zig & Backdrop.zig / GaussianBlur.zig:DirectComposition Visualツリーを介した描画スワップチェーンの合成と、background-opacity(背景透過)およびDWM効果の制御。

外部の重厚なUIフレームワーク(Electron, WinUI, SDL, GLFW等)を挟まず、OS標準のC-ABI(Win32 API)とZig標準ライブラリのみで構成されているため、公式アップストリームの更新を取り込みやすい高い追従性を確保しています。


3. 他のWindows移植フォークとのコードレベル詳細比較

コミュニティ内で先行・関連する主要フォークと本プロジェクト(fukuyori/ghostty)の技術仕様の比較です。

フォーク実装の技術比較表

項目 本リポジトリ (fukuyori/ghostty) noctty (旧 winghostty) liamsmith86/ghostty-windows zcg/ghostty-win mattn/ghostty (参考参照元)
描画API Direct3D 11 + DirectComposition (一部OpenGL互換可) OpenGL (WGL 4.3+) OpenGL (WGL) Direct3D 11 / Direct2D OpenGL (WGL)
コード構成 src/apprt/win32/ 配下に機能別モジュール設計 独自外付けランタイム src/apprt/win32.zig 単一ファイル拡張 独自エントリポイント統合 初期Win32実装プロトタイプ
ConPTY統合 OpenConsole / conpty.dll 同梱 (Kitty画像表示完全対応) OpenConsole 同梱 + in-box フォールバック (Kitty画像表示対応) kernel32.dll in-box ConPTY (非同期パイプ) kernel32.dll in-box ConPTY kernel32.dll in-box ConPTY
タブ・画面分割 ネイティブWin32 TabBar & マウスドラッグ分割線 ネイティブWin32 タブ・分割 + セッション保存/復元 オーナー描画タブ (初期実験) 基礎的単一〜複数Surface 基礎的単一Surface
IME対応 ImmSetCompositionWindow カーソル位置完全インライン追従 ImmSetCompositionWindow 連動 ImmAssociateContextEx 連動 DirectWrite連携 基本文字入力のみ
DPI / アクセシビリティ Dynamic DPI 完全追従 + ハイコントラスト + MSAA Per-monitor DPI + UI Automation (一部) 基本DPI対応 DWMスケール依存 基本DPI対応
パッケージング インストーラー インストーラー (-setup.exe) & ポータブル (.zip) / Scoop / WinGet マニュアルビルド (リリースなし) 単体バイナリ配布 (ghostty.exe) ポータブルアーカイブ (.zip)
特有の付加機能 D3D11透過/Backdrop/Blur、GPU復旧耐性、タブ名変更ダイアログ コマンドパレット、設定GUI、シェルピッカー、自動更新 なし(最小限の拡張) DirectWriteフォント描画実験 最小限の初期実装

詳細なコード差分分析

1. ウィンドウ生成、メッセージループ、および GPU リセット耐性

  • 本リポジトリ (fukuyori/ghostty):
    RegisterClassExW で GhosttyWindow、GhosttyTabBar、GhosttySplitDivider、およびメッセージ専用の GhosttyWakeup ウィンドウクラスを生成します。WndProc 内で受け取ったイベントを即座にGhosttyコアへ伝達するだけでなく、D3D11デバイスの消失(GPUドライバクラッシュやスリープ復帰等)を検知した際に、バックオフアルゴリズムを伴う安全な自動復旧ロジック(gpu_recovery_max_cycles)を App.zig 内で駆動させます。
  • noctty:
    バックグラウンドでのセッション管理、UI Automation、ホットキーフック、外部メッセージ受信を処理するため、WndProc の手前に独自メッセージキューとディスパッチャを挟み込む構成をとっています。
  • その他フォーク (liamsmith86 / zcg / mattn):
    標準的な WndProc による基本的なメッセージディスパッチにとどまり、GPUロスト復旧やモーダルループ中のメッセージ待避構造は持ちません。

2. 疑似コンソール(ConPTY)と Kitty Graphics 接続

  • 本リポジトリ (fukuyori/ghostty) & noctty:
    Windows標準(kernel32.dll)の in-box ConPTY は、Kitty Graphics Protocol 等で使われる APC エスケープシーケンス(画像データ)を削ぎ落としてしまう既知の制約があります。そのため、両プロジェクトともに外部の最新 OpenConsole ホスト(conpty.dll / OpenConsole.exe)を同梱・バインドし、バイナリ完全なシーケンス透過による画像表示を可能にしています。
  • その他フォーク (liamsmith86 / zcg / mattn):
    OS標準の kernel32.dll ConPTY に直接接続しているため、テキスト入出力は機能するものの、Kitty Graphics 等の高度な画像描画シーケンスがConPTY層で破棄されます。

3. グラフィックススタックとシェーダーパイプライン

  • 本リポジトリ (fukuyori/ghostty):
    Windows ネイティブの Direct3D 11 レンダラー(src/renderer/D3D11.zig)および DirectComposition を採用しています。Kitty 画像レンダリング時の頂点シェーダーz座標クリッピングバグ(ortho2d 変換で z=-1 となり描画消失する問題)を修正済みであり、background-opacity によるウィンドウ背景の透過合成や、DirectComposition Visual ツリーを用いた Backdrop / Gaussian Blur の実験的実装を含みます。
  • noctty:
    Ghostty 本家の OpenGL (WGL 4.3+) パイプラインを継続利用しています。背景の不透明度調整(background-opacity)は動作しますが、DWM による背景ブラー効果(background-blur)は現行実装では無効(inert)となっています。
  • zcg/ghostty-win:
    Direct3D 11 / Direct2D への移行を図り、フォントレンダラーを DirectWrite に置き換えていますが、本家(FreeType/HarfBuzz)のグリフキャッシュ設計と大きく乖離するため、アップストリーム更新の追従コストが高くなっています。

4. タブ・画面分割・UI 機能

  • 本リポジトリ (fukuyori/ghostty):
    素の Win32 API によるネイティブ TabBar(ドラッグ並べ替え、マウスホイール切替、ダブルクリックでの名変更ダイアログ、オーバーフロー時スクロールボタン)と、画面分割線のマウスドラッグリサイズ(レイヤードウィンドウ描画、ホバー判定、最小セル制約)を完備。Ghostty コアの SplitTree と密接に統合されています。
  • noctty:
    ネイティブタブ・画面分割に加え、セッションの永続化保存・復元(session-state.json)、コマンドパレット、シェルピッカー(PowerShell / cmd / Git Bash / WSL の選択起動)、設定GUIなど、外付けの付加機能を幅広く実装しています。

5. IME(日本語入力)・DPI・アクセシビリティ統合

  • 本リポジトリ (fukuyori/ghostty):
    WM_IME_* をトラップし、ターミナル内のグリッドセル座標からピクセル座標を換算して ImmSetCompositionWindow (CFS_POINT / CFS_RECT) を呼び出すことで、IME 変換候補ウィンドウをカーソル直下に完全インライン追従させます。また、マルチモニター間の Dynamic DPI 追従(WM_DPICHANGED)、Windows ハイコントラストモード連動、MSAA 経由でのタブ要素公開(TabBarAccessibility.zig)を実装しています。
  • noctty:
    IME 入力および Per-monitor DPI スケーリングに対応し、UI Automation 経由でのコントロール公開を進めています。

4. 既存の主要Windowsターミナル製品との比較分析

Windows環境で広く利用されている代表的なターミナル製品(Windows Terminal、Alacritty、WezTerm)と、本実装の構造的な違いを技術的観点から比較します。

プロダクト技術仕様比較表

項目 本リポジトリ (fukuyori/ghostty) Windows Terminal Alacritty WezTerm
実装言語 Zig C++ / C# (WinRT) Rust Rust
GUIスタック 純Win32 API + DirectComposition WinUI 2 / XAML Islands winit (Win32抽象化層) 独自ウィンドウ層 (window crate)
描画API Direct3D 11 Direct3D 11 (DirectWrite/D2D) OpenGL WebGPU / OpenGL
フォントエンジン FreeType + HarfBuzz DirectWrite Crossfont (DirectWrite) HarfBuzz + FreeType / DirectWrite
タブ・画面分割 ネイティブWin32 UI + 内蔵SplitTree XAMLタブ・分割コントロール なし(tmux等の外部ツール前提) 独自GUI描画タブ・分割
設定方式 プレーンテキスト (config.ghostty) JSONファイル + GUI設定画面 TOMLファイル Luaスクリプト
画像プロトコル Kitty Graphics Protocol 完全対応 なし(Sixel実験的対応) なし Sixel, iTerm2, Kitty互換
実行フットプリント 超軽量・即時起動 XAML/WinRT初期化コストあり 軽量 Lua/各種依存クレートにより重厚

各プロダクトとの詳細比較

1. vs Windows Terminal

  • GUIアーキテクチャと起動速度:
    Windows Terminal は WinUI(XAML Islands)を採用しており、OS標準のタブデザインやアクセシビリティに適合する反面、XAMLランタイムの初期化オーバーヘッドや関連DLLのロード負荷が発生します。本実装はXAMLを一切介さず、素の Win32 ウィンドウ上に D3D11 / DirectComposition を直接構築するため、プロセスの起動とリソース消費が非常に軽量です。
  • 機能拡張性と画像描画:
    Windows Terminal のテキスト描画は DirectWrite に依存しており、画像表示プロトコルのサポートが限定的です。本実装は Ghostty コアの高性能シェーダーにより、Kitty Graphics Protocol などの拡張仕様をネイティブに高速ラスタライズできます。

2. vs Alacritty

  • 設計思想と UI 機能の統合:
    Alacritty は「単一サーフェス描画の速度を追求し、タブや画面分割は外部ツール(tmux等)に委ねる」という思想のもと、Rustの汎用抽象化ライブラリ(winit)を使用しています。本実装(Ghostty)は、コア内部に強力な SplitTree サーフェス管理機構を備えており、Windowsネイティブの TabBar や画面分割線のマウスドラッグリサイズを外部ツールなしで快適に操作できます。

3. vs WezTerm

  • ランタイムオーバーヘッドとコンパイル・バイナリサイズ:
    WezTerm は組み込み Lua エンジンによる高度なスクリプト拡張性を備えていますが、Luaランタイムや多数の重厚な依存クレートをリンクするため、バイナリサイズが大きく、起動・実行時のフットプリントが増大します。本実装は Zig の静的メモリ管理と C-ABI 直接呼び出しで完結しているため、動的スクリプトエンジンのロードなしに最小限のフットプリントと高速なレスポンスを実現しています。

5. 本実装(fukuyori/ghostty)の技術的特徴

  1. 公式アップストリームへの極めて高い追従性
    Win32/D3D11固有の処理を src/apprt/win32/ 配下に完璧に分離・モジュール化しているため、公式リポジトリのコアロジック更新(VTパーサー改善、エスケープシーケンス機能拡張、Zigコンパイラバージョン更新等)に対するマージ摩擦が最小限に抑えられています。
  2. Direct3D 11 + DirectComposition によるネイティブ描画
    Windows の標準グラフィックスAPIである D3D11 をネイティブ駆動し、DirectComposition 経由でスワップチェーンを合成。background-opacity による完璧なウィンドウ透過処理を実現しています。
  3. OpenConsole 同梱による完全な Kitty Graphics Protocol サポート
    kernel32.dll の ConPTY 制限を回避するため、専用ビルド/パッケージング処理の中で OpenConsole/conpty.dll を自動的に取得・配置し、ターミナル内での高品位な画像表示をサポートします。
  4. Windows デスクトップ環境への深い統合
    日本語 IME 変換候補のインライン追従、マルチモニター異体 DPI(Dynamic DPI)自動スケール、Windows ハイコントラストモード対応、MSAA アクセシビリティ通知など、Windows ユーザーが期待するOS統合品質を達成しています。
  5. ポータブル版および Inno Setup インストーラーの自動生成
    scripts/build-release.ps1 によるワンクリックリリースビルドに加え、scripts/build-installer.ps1 により signtool.exe 署名対応の Inno Setup インストーラー(.exe)を再現性高く生成可能です。

6. 完成度

本移植プロジェクトは、docs/windows-roadmap.md に定義されたすべての Phase(Phase 1〜6)を 100% 達成 しており使用可能な状態です。しかし、まだ不具合や改善点は残っており、アルファ版の位置付けとなっています。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?