Minimal QML
Minimal QMLは、QMLでWaylandコンポジターを実装する方法を示すシンプルなサンプルです。
Minimal QMLは、可能な限り少ないコードで完全なQt Wayland Compositor を実装した、デスクトップスタイルのWaylandコンポジターのサンプルです。このコンポジターは、Qt Quick とQMLを使用して実装されています。

WaylandCompositor オブジェクト
コンポジターの最上位アイテムは `WaylandCompositor` です。これは Wayland サーバー自体を表し、クライアントからの接続が確立されるたびにその接続を管理します。
デフォルトでは、サーバーはクライアントとの通信にWaylandの中核プロトコルをサポートしています。ただし、通常はプロトコルの1つ以上の拡張機能もサポートしたい場合が多いでしょう。これにより、クライアントはウィンドウシステムにおける自身の役割に影響を与えるためのツールをさらに得ることができます。
Qtは、いくつかの標準的かつ一般的な拡張機能をサポートしています。さらに、クライアント側とサーバー側の双方のコードにサポートを追加できる限り、カスタム拡張機能の作成やサポートも容易です。
シェル拡張機能
通常、コンポジターは少なくとも1つのシェル拡張機能をサポートします。拡張機能は、WaylandCompositor オブジェクトの直接の子としてインスタンス化することでコンポジターに追加されます。これらは自動的にそのextensions プロパティに追加され、クライアントが接続した際にクライアントにブロードキャストされます。
WlShell {
onWlShellSurfaceCreated: (shellSurface) => shellSurfaces.append({shellSurface: shellSurface});
}
XdgShell {
onToplevelCreated: (toplevel, xdgSurface) => shellSurfaces.append({shellSurface: xdgSurface});
}
IviApplication {
onIviSurfaceCreated: (iviSurface) => shellSurfaces.append({shellSurface: iviSurface});
}「Minimal QML」のサンプルでは、WlShell 、XdgShell 、IviApplication の3つの異なるシェルがサポートされています。
クライアントはこれらいずれかに接続することができ、そのシェルは、新しいウィンドウの作成やサイズのネゴシエーションなど、クライアントとコンポジター間の特定の通信を行うためのチャネルとして使用されます。
クライアントが新しいサーフェスを作成すると、そのアクティブな拡張機能にこのことを示すシグナルが送信されます。このシグナルには `ShellSurface ` 引数が含まれます。シグナルを受信した拡張機能に応じて、この引数は `ShellSurface` のサブクラスとなり、それぞれ `WlShellSurface`、`XdgSurface `、または `IviSurface ` となります。
ShellSurface を使用すると、特定のサーフェスに対するシェル拡張機能の機能にアクセスできます。最小限のQMLサンプルでは、単にクライアントをシーンに追加したいだけです。新しいウィンドウの存在を記録するために、保管用にシンプルなListModel に追加します。
ListModel { id: shellSurfaces }シーンの作成
必要なコンポジターのコードのほとんどはすでに準備ができています。最後のステップは、アプリケーションが実際に画面上に表示されることを確認することです。
すべてのコンポジターにおいて、少なくとも1つの出力を定義する必要があります。これは、`WaylandCompositor`の直接の子として`WaylandOutput `オブジェクトをインスタンス化することで行います。出力が1つしかない場合、これがシステム上のプライマリ画面を表します。 (利用可能な場合は、複数の画面に対応するために複数のWaylandOutput オブジェクトを作成することもできます。詳細については、「マルチスクリーン」の例を参照してください。)
WaylandOutput {
sizeFollowsWindow: true
window: Window {
width: 1024
height: 768
visible: trueWaylandOutput 内部では、シーンのコンテナとなるWindowを作成します。この例では、このWindowにサイズを指定しています。このサイズは、コンポジターが、カスタムサイズのウィンドウをサポートする別のウィンドウシステム内でアプリケーションとして実行されている場合に使用されます。 組み込みデバイスでの一般的な使用例では、コンポジターが実行中の唯一のディスプレイサーバーであるため、おそらくフルスクリーンのプラットフォームプラグイン(eglfs など)上で実行されており、ここで設定したサイズは関係ありません。
最後のステップは、作成された各ShellSurface オブジェクトに対してアイテムを作成することです。これには、ShellSurfaceItem クラスを使用できます。
Repeater {
model: shellSurfaces
// ShellSurfaceItem handles displaying a shell surface.
// It has implementations for things like interactive
// resize/move, and forwarding of mouse and keyboard
// events to the client process.
ShellSurfaceItem {
shellSurface: modelData
onSurfaceDestroyed: shellSurfaces.remove(index)
}
}モデル内の各シェルサーフェスに対してShellSurfaceItem を作成し、それらをshellSurface プロパティに割り当てます。さらに、シェルサーフェスが破棄された際にモデルが確実に更新されるようにします。これは、クライアントが手動でウィンドウを閉じた場合や、クライアントが終了またはクラッシュした場合に発生する可能性があります。
以上が、Qt Quick とQMLを使用して機能的なWaylandコンポジターを作成するために必要なすべてのコードです。QMLで記述され、さらにいくつかの機能を備えたコンポジターの別の例については、「Fancy Compositor」のサンプルをご覧ください。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.