
2025/12/25 7:43
フェニックス:Zigでゼロから書かれたモダンなXサーバー
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
## Summary Phoenixは、完全にZigで書かれた全く新しいXサーバーです。Xorgのフォークではなく、現在は既存のX11またはWaylandコンポジタ内で「ネストモード」のみで動作し、DRM/Mesa GBMを介したフルハードウェアアクセラレーションによりGLX、EGL、Vulkanグラフィックスをレンダリングできます。プロジェクトの目標は、現代のアプリケーション(レガシーGTK2アプリも含む)に必要なX11プロトコルのサブセットだけを実装し、ほとんどのフォント操作を省略し、文字列をUTF‑8にデフォルト化することで、Xorgよりも単純にすることです。 セキュリティはコアコンセプトです。Phoenixは自動プロトコルパーシングを行い、ZigのReleaseSafe境界チェックを使用し、権限プロンプトでアプリケーションを分離し、従来のXorgの振る舞いに合わせてこれらのチェックを無効化することも可能です。Xorgへの改善点としては、モニタごとのDPI処理、異なるリフレッシュレート・VRR・HDRをサポートしたマルチモニタ機能、デフォルトでティアリングを排除するビルトインコンポジタ、および低いvsync/コンポジタ遅延が計画されています。 Phoenixは、新しい機能(HDRなど)に対応するためにX11プロトコルを拡張し、RandR経由でモニタごとのプロパティを公開します。Wayland互換性は、ネイティブまたは12to11のようなブリッジを通じて計画されており、将来的にWayland専用アプリが動作できるようになります。Wayland上で動かすことは、代替Xwaylandサーバーとして機能する可能性があります。 非目標:PhoenixはXorgを完全に置き換えること、複数画面(X11スクリーン)をサポートすること、GrabServerによる排他アクセスを提供すること、エンディアンが逆転したクライアントを扱うこと、または間接GLXを実装することを目指していません。リモートレンダリングの方が効率的と考えられます。 ビルド手順は簡単です: ```bash zig build -Doptimize=ReleaseSafe sudo zig build install -p /usr/local -Doptimize=ReleaseSafe
依存関係にはZig 0.14.1、x11/xcb、Wayland(client/egl)、libdrm、gbm、およびOpenGL用のlibglvndが含まれます。
結果として、レガシーGTK2アプリを実行しつつ、低遅延でより安全なディスプレイスタックが得られ、開発者はモダンLinuxグラフィックススタックへの統合を容易にしながらデスクトップエコシステム全体の保守負荷を削減できます。
本文
Phoenix – 現代的なXサーバ
Phoenixは、完全にZigで書かれた全く新しいXサーバです(Xorgのフォークではありません)。
軽量・安全・ハードウェアフレンドリーを目指し、現代アプリケーション向けの代替案として設計されています。
現状
- 本番環境での使用は未準備。
現時点では既存のXサーバ内にネストして動作させることで、ハードウェアアクセラレーション済みの簡易GLX/EGL/Vulkanグラフィックスを描画できます。 - 唯一サポートされているモード:
Phoenixは「ネスト型」でのみ実行可能です。単体で動作できるレベルになるまで、ネストされた状態で利用してください。
目標
| カテゴリ | 目的 |
|---|---|
| シンプルさ | 現代アプリが必要とするX11プロトコルのサブセット(過去約20年分)だけをサポート。GTK2レガシープログラムも含む。 |
| セキュリティ | 自動プロトコルパース;Zig の が境界エラーを検出。アプリは隔離され、他アプリへのアクセスや修飾なしグローバルホットキーには明示的な許可が必要。Xorg 互換性のために隔離機能を無効化するオプションも用意。 |
| モダンハードウェア対応 | 複数モニタ(異なるリフレッシュレート、VRR、HDR)への完全サポートと、各モニタの DPI を正しく処理。 |
| グラフィックハンドリング | 破綻のない組み込みコンポジターを備え、外部コンポジターやフルスクリーンアプリが走っている場合は自動で無効化。Xorg より低い vsync/コンポジター遅延を実現。 |
| 新規標準 | RandR プロパティとしての per‑monitor DPI;HDR などの機能拡張 X11プロトコル。 |
| Wayland 互換性 | ネイティブ Wayland サポート、またはブリッジ(例:12to11)。 |
| ネスト型ディスプレイサーバ | ハードウェアアクセラレーション付きで X11 または Wayland 上で Phoenix を実行。デバッグや開発に便利。 |
非目標
- Xorg サーバの完全置き換え。
- レガシー X11 スクリーン(複数モニタのみ)のフルサポート。
- 排他アクセス (
) – Phoenix では無効化済み。GrabServer - エンディアンスワップしたクライアント/サーバ処理(必要なら再検討)。
- 間接/リモート GLX – 複雑すぎるため、代わりにリモートレンダリングプロキシを検討。
X11 プロトコルとの違い
| 領域 | Phoenix の振る舞い |
|---|---|
| コアプロトコル | 必要最低限のフォント操作(例:カーソurfont)だけ実装。 |
| 文字列 | すべての文字列はデフォルトで UTF‑8 とみなされる;ISO Latin‑1 はサポートしない。 |
インストール
# ビルド&インストール(ReleaseSafe モード) zig build -Doptimize=ReleaseSafe sudo zig build install -p /usr/local -Doptimize=ReleaseSafe
アンインストール
Zig にはアンインストールコマンドがないため、手動で削除してください。
sudo rm /usr/local/bin/phoenix
開発ビルド
# デバッグモード(デフォルト) zig build # バイナリは ./zig-out/bin/phoenix に生成 # 直接実行 zig build run
プロトコルドキュメントの生成
zig build -Dgenerate-docs=true
.txt ファイルが ./zig-out/protocol/ 内に作成されます。
依存関係
| ライブラリ | 用途 |
|---|---|
| Zig 0.14.1 | コンパイラ |
| x11 (xcb) | X11 上でネストモードを動かす際のバックエンド () |
| wayland (client, egl) | Wayland 上でネストモードを動かす際のバックエンド (、未実装) |
| drm (libdrm, gbm) | 独立型 X11 サーバ用バックエンド (、未実装) |
| OpenGL (libglvnd) | GL & EGL のサポート |
FAQ
Q: なぜ Wayland コンポジターを作らずに新しい X サーバを書くのか?
A: 一般的な認識と逆に、最小限で機能する X サーバの実装はフル Wayland スタックよりもシンプルなケースが多いです。X プロトコルは明確に定義されており、多くのレガシーアプリケーションが既に依存しています。