6つの用語は担当する層と役割が違う
X11とWaylandは、アプリと画面・入力装置のやり取りを定めたプロトコル(通信の決まりごと)の名前です。ディスプレイサーバーは、このプロトコルに従って動くプログラムです。アプリが描いた内容を画面に出し、キーボードやマウスの入力をアプリに渡します。
ウィンドウマネージャは、ウィンドウの位置、大きさ、枠、どのウィンドウを操作対象にするか(フォーカス)を決めます。コンポジタは、ウィンドウごとの描画結果を重ねて1枚の画面にまとめます。影や透過、アニメーションもコンポジタの仕事です。デスクトップ環境は、これらにパネル、設定アプリ、ファイルマネージャなどを加えた一式を指します。
混乱しやすいのは、X11とWaylandで「どのプログラムがどの役割を受け持つか」の分け方が違うためです。この違いを知っておくと、ツールが動かない原因を自分で切り分けられます。
X11では役割ごとに別のプログラムが動く
X11環境では、ディスプレイサーバーとしてXorg(X.Org Server)が動きます。ウィンドウマネージャは、Xorgに接続するクライアントの1つとして別に起動します。i3やOpenboxがその例です。影や透過がほしい場合は、picomなどのコンポジタも別のプログラムとして追加します。
[アプリ] [アプリ] [ウィンドウマネージャ] [コンポジタ]
(i3 など) (picom など)
| | | |
+--------+----- X11プロトコル -----+-----+
|
[ディスプレイサーバー: Xorg]
|
[カーネル: 画面・入力デバイス]この構成では、ウィンドウマネージャだけを入れ替えたり、コンポジタを止めたりできます。その一方で、どのクライアントもXorgを通して他のアプリの画面や入力にアクセスできます。この点が後で説明する「動かない問題」につながります。
Waylandではコンポジタがディスプレイサーバーを兼ねる
Waylandには、Xorgにあたる共通のサーバープログラムがありません。コンポジタがディスプレイサーバーとウィンドウマネージャを兼ね、1つのプログラムですべての役割を受け持ちます。Wayland環境で「Waylandコンポジタ」という言葉がよく出てくるのはこのためです。
[アプリ] [アプリ] [X11アプリ]
| | |
| | [XWayland] ← X11アプリ向けの互換層
| | |
+---- Waylandプロトコル ----+
|
[Waylandコンポジタ = ディスプレイサーバー
+ ウィンドウマネージャ + 合成処理]
(Mutter / KWin / Hyprland など)
|
[カーネル: 画面・入力デバイス]X11向けに作られたアプリは、XWaylandという互換用のXサーバーを通してWayland上でも動きます。XWaylandはWaylandコンポジタの上で動くため、X11の機能を全面的に使えるわけではありません。
GNOME・KDE Plasma・Hyprlandはどの層にあたるか
| 名前 | 分類 | Waylandでのコンポジタ | X11での動作 |
|---|---|---|---|
| GNOME | デスクトップ環境 | Mutter(gnome-shellに組み込み) | X11セッションを廃止する方向で進んでいる(執筆時点) |
| KDE Plasma | デスクトップ環境 | KWin | X11セッションも提供されている。KWinがWMとコンポジタを兼ねる |
| Xfce | デスクトップ環境 | Wayland対応を進めている段階(執筆時点) | xfwm4がWMとコンポジタを兼ねる |
| Hyprland | Waylandコンポジタ | Hyprland自身 | なし |
| Sway / i3 | コンポジタ / WM | Sway | i3(SwayはそのWayland版にあたる) |
Hyprlandはデスクトップ環境ではありません。パネルやランチャー、通知の表示などは含まれていないため、利用者がWaybarなどを組み合わせて環境を作ります。逆に、GNOMEの「コンポジタ」だけを取り出して別のパネルと組み合わせる使い方は一般的ではありません。デスクトップ環境が一式として作られているためです。
今のセッションがX11かWaylandかを確かめる
端末で次のコマンドを実行します。
echo $XDG_SESSION_TYPE
結果がwaylandならWaylandセッション、x11ならX11セッションです。SSH接続やテキストコンソールではttyと表示されます。この変数はログイン時にsystemd-logindやログイン画面のソフトが設定します。構成によっては空のこともあるため、その場合は次の方法も試します。
echo $WAYLAND_DISPLAY loginctl show-session "$XDG_SESSION_ID" -p Type
WAYLAND_DISPLAYにwayland-0などの値が入っていれば、Waylandコンポジタに接続しています。どのコンポジタかはecho $XDG_CURRENT_DESKTOPで確認できます。
Waylandセッションの中で、個々のアプリがXWayland経由で動いているかを調べたい場合はxeyesが使えます。目玉が動くのは、マウスポインタがX11のウィンドウ上にあるときだけです。パッケージ名はディストリビューションによって異なります。
「Waylandでは動かない」と言われる理由
X11では、どのクライアントでも画面全体の内容を読み取れました。XTEST拡張を使えば、他のウィンドウにキー入力を送ることもできます。xdotoolやx11vncはこの仕組みに頼っています。便利な反面、悪意のあるアプリでもキー入力を盗み見たり画面を撮ったりできてしまいます。
Waylandのコンポジタは、各アプリに自分のウィンドウと自分宛ての入力しか渡しません。画面の読み取りや入力の送り込みは、Waylandプロトコルの中核には含まれていません。これらはコンポジタごとに個別に実装される機能です。そのため「Waylandでは動かない」の多くは、正確には「そのツールが使う方法を、今のコンポジタが提供していない」という意味になります。
画面共有とリモートデスクトップ
Waylandでの画面共有は、主にxdg-desktop-portalとPipeWireを組み合わせて行います。アプリはポータル(アプリとシステムの間を仲介する仕組み)に画面共有を頼みます。コンポジタ用のバックエンドが利用者に許可を求め、許可が出れば映像がPipeWireで渡されます。バックエンドはxdg-desktop-portal-gnome、-kde、-wlr、-hyprlandのように、コンポジタごとに分かれています。画面共有で真っ黒な画面しか映らないときは、バックエンドが入っていない場合か、アプリがX11の方法しか持たずXWaylandのウィンドウしか見えていない場合が多いです。
リモートデスクトップも同様で、Xorgに接続するx11vncはWaylandセッションを操作できません。GNOMEにはGNOME Remote Desktop、KDE PlasmaにはKRdp、wlrootsを基にしたコンポジタにはwayvncがあります。どれを使うかは、使っているコンポジタで決まります。
キーボードの自動入力ツール
xdotoolはXTESTを使うため、Waylandセッションでは入力がXWaylandのウィンドウにしか届きません。wtypeは仮想キーボード用のWayland拡張プロトコルを使います。SwayやHyprlandでは動きますが、この拡張を実装していないGNOMEでは動きません。ydotoolは、カーネルの/dev/uinputを使って入力装置そのものを模倣します。コンポジタの種類に左右されない代わりに、デバイスへの書き込み権限とデーモン(常駐プログラム)の設定が必要です。
ツールが動かないときの確かめ方
まず$XDG_SESSION_TYPEと$XDG_CURRENT_DESKTOPで、セッションの種類とコンポジタを確かめます。次に、ツールの説明に書かれた対応方式を見ます。「Wayland対応」とだけあっても、それがポータル経由なのか、wlroots系の拡張プロトコルなのかで、動くコンポジタが変わります。対応する方式がない場合は、ログイン画面でX11セッションを選ぶ方法があります。ただしGNOMEのようにX11セッションを廃止する方向のデスクトップ環境もあるため、長く使うならコンポジタに合った代わりのツールへ移るほうが安全です。