
2026/03/16 0:09
**Wayland コンポジタとウィンドウマネージャーの分離**
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
River 0.4.0 は、コンポジタをウィンドウマネージャーコンポーネントから分離し、モジュラー型 Wayland アーキテクチャを構築します。これにより入力遅延が削減されつつ、フレームは完全にタイムリーに提供されます。
従来の単一体制では、各フレームごとにコンポジタとディスプレイサーバー間で往復通信が発生し遅延を増大させていました。River の新設計はウィンドウマネージャーがレイアウトポリシーを独立して処理できるようにし、ほとんどのイベントについてフレームごとの通信を排除します。river-window-management-v1 プロトコルは状態を window‑management(寸法・フォーカス・バインディング)と rendering(位置・順序・装飾)の2つに分離し、変更を「manage」と「render」の原子化されたシーケンスとしてまとめ、コンポジタがそれらを開始します。これにより、高水準のガベージコレクション言語でウィンドウマネージャーを書いても性能や入力遅延に影響しません。
コンポジタを分離することで開発者への敷居が下がり、デバッグが向上しクラッシュの隔離が可能になります。現在利用できる 15 の独立したウィンドウマネージャーからもその恩恵はすでに確認されています。一部の非従来型パラダイム(例:VR、揺れウィンドウ)はまだサポートされていませんが、シンプルなアニメーションはうまく動作し、将来リリースではカスタムシェーダーも検討できる可能性があります。
今後のリリースではウィンドウマネージャー間の切替をスムーズにすること、小規模な CLI の調整、および 1.0.0 マイルストーン前のその他 UX 改善に注力し、進捗は issue ラベルで追跡されます。結果としてユーザーには低遅延でより滑らかなアニメーションが提供され、開発者は新しいウィンドウマネージャーを貢献しやすくなり、Wayland の広範な採用の加速に寄与する可能性があります。
本文
従来の Wayland コンポジタ
モノリシック(単一)アーキテクチャでは、コンポジタとウィンドウマネージャを同じプログラムに統合します。
その結果、Wayland のウィンドウマネージャは不要なまでにコンポジタ全体を実装せざるを得ず、冗長になってしまいます。
river(0.4.0 リリース) は、非モノリシック Wayland コンポジタとして、この伝統から逸脱し、ウィンドウマネージャを別プロセスに分離しました。
現在、多くのウィンドウマネージャが river をサポートしています。
安定版
river-window-management-v1 プロトコルは、ウィンドウマネージャに以下を完全に制御させます。
- ウィンドウ位置
- キーバインディング
- それ以外のすべてのウィンドウ管理ポリシー
一方 river 自体はフレーム完璧なレンダリング、優れたパフォーマンス、低レベルの plumbing を提供します。
この記事では、このプロトコルに裏打ちされた設計決定を高レベルで概観します – FOSDEM 2026 で発表した内容とほぼ同じ情報です。
ディスプレイサーバ、コンポジタ、ウィンドウマネージャ
従来の Wayland アーキテクチャでは、3 つの役割をコンポジタプロセスに統合しています。
| 役割 | 責務 |
|---|---|
| ディスプレイサーバ | カーネルからウィンドウへ入力イベントを転送し、バッファをカーネルへ供給する。 |
| コンポジタ | 表示可能なすべてのウィンドウバッファを 1 つに合成してカーネルへ出力する。 |
| ウィンドウマネージャ | ウィンドウ配置、キーバインディング、その他ユーザー向け挙動を管理する。 |
なぜ Wayland がこれらの役割を統合したか
X11 ではディスプレイサーバはコンポジタやウィンドウマネージャから分離されていました。
- ユーザーがウィンドウ内でボタンをクリック。
- カーネルが入力イベントをディスプレイサーバへ送信。
- ディスプレイサーバはイベントを対象ウィンドウへ転送(コンポジタのシーングラフを知らない)。
- ウィンドウは新しいバッファを提出 → ディスプレイサーバがそれをコンポジタへ転送 → コンポジタが合成し、カーネルが表示。
ディスプレイサーバは不要な仲介者となり、レイテンシと往復回数を増やします。
Wayland はディスプレイサーバとコンポジタを 1 プロセスに統合してこの問題を解決しました。しかしウィンドウマネージャの統合は必須ではなく、おそらく最も簡単な道だっただけです。
ウィンドウ管理プロトコル設計上の制約
river-window-management-v1 プロトコルは以下を満たす必要があります。
- フレームごとや入力ごとの往復回数を避ける – モノリシック Wayland コンポジタと同等に入力遅延がないこと。
- フレーム完璧 を保持する:ユーザーはタイル配置変更時にギャップ、重なり、寸法不一致を決して目撃しない。
- 短時間のタイムアウトを許容し、ウィンドウが遅い場合はフレーム完璧性を徐々に低下させ、永遠にハングしないようにする。
ウィンドウ管理ステートマシン
プロトコルでは状態を 2 つの相互排他カテゴリに分けます。
| カテゴリ | 影響範囲 |
|---|---|
| ウィンドウ管理状態 | コンポジタと個々のウィンドウ間で通信(寸法、フルスクリーン、フォーカス、キーバインディング)。 |
| レンダリング状態 | 実際に描画される出力のみ(位置・順序・装飾・クロッピング)。 |
変更は原子単位の更新としてバッチ化されます。
- ウィンドウ管理変更 →
manage sequence - レンダリング変更 →
render sequence
両シーケンスはコンポジタが開始し、ウィンドウマネージャは状態変化(例:キーバインディングの押下や新しいウィンドウ)が起きるまでアイドルです。
この設計により、複雑なタイルレイアウトやサーバー側装飾でもフレーム完璧性を確保しつつ、同期作業はコンポジタ側で完結します。
モチベーション
コンポジタとウィンドウマネージャを分離する主なメリットは次の通りです。
- Wayland ウィンドウマネージャを書くハードルが下がる。
- ポリシーに専念でき、フルコンポジタ実装の負担が不要。
- クラッシュ隔離が向上:ウィンドウマネージャのクラッシュはセッション全体を終了させず、再起動や差し替えが可能。
- 高レベルでガベージコレクション言語(Python, Rust など)を使ってウィンドウマネージャを開発でき、フレームごとの往復回数がないためコンポジタ性能に影響しない。
river はすでに 15 件以上の異なるウィンドウマネージャをサポートしており、この可能性を示しています。
制限事項
river-window-management-v1 は従来型 2D デスクトップを想定しています。
- VR サポートはありません。
- 「ワッビーボタン」など過剰な視覚効果は対象外です。シンプルアニメーションは十分に機能します。
- 将来的にはカスタムシェーダでより細かなレンダリング制御が可能になるかもしれませんが、優先度は低いです。
これらの範囲を超える機能が必要な場合は issue を立てていただければ、プロトコル拡張について検討します。
今後のロードマップ
0.4.0 で river は任意の互換ウィンドウマネージャとともに日常使用に十分な機能を備えています。
プロトコルは安定しており、既存マネージャは 1.0.0 後も互換性があります。
今後のリリースでは次の点に注力します。
- river 互換ウィンドウマネージャを起動・切替時の UX 改善。
- 必要ならば小規模な CLI の変更(次期メジャーリリースは 1.0.0 を想定)。
寄付
River の開発は金銭的支援なしでは持続できません。このプロジェクトが価値あるものだと感じたら、Liberapay(推奨)で継続寄付を検討してください。
一括または月額の寄付も GitHub Sponsors や Ko-fi で受け付けています。
ご支援ありがとうございます!
ギャラリー
以下は river 上で動作している様々なウィンドウマネージャのスクリーンショットです。
選択は視覚的に興味深い例を優先していますが、他にも多くの優れたマネージャがあります。
- Canoe – クラシックな見た目と感触のスタッキングウィンドウマネージャ
- reka – Emacs ベースの river 用ウィンドウマネージャ(EXWM に似ている)
- tarazed – 強力で気晴らしのないデスクトップ体験
- rhine – 再帰的・モジュラーなウィンドウ管理とアニメーション