最小限のQML

Minimal QMLはQMLでWaylandコンポジターを書く方法を示すシンプルな例です。

Minimal QMLはデスクトップスタイルのWaylandコンポジターの例で、完全なQt Wayland Compositor をできるだけ少ないコードで実装しています。コンポジターは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の例では、3つの異なるシェルをサポートしています:WlShell XdgShellIviApplication です。

クライアントはこれらのいずれかに接続することができ、新しいウィンドウの作成やサイズの交渉など、クライアントとコンポジター間で特定の事柄について通信するためのチャンネルとして使用されます。

クライアントが新しいサーフェスを作成すると、アクティブなエクステンションはこのシグナルを受け取ります。シグナルにはShellSurface 引数が含まれます。どのエクステンションがシグナルを受信したかによって、この引数はShellSurfaceWlShellSurface XdgSurface またはIviSurface のサブクラスになります。

このShellSurface を使って、特定のサーフェイスのシェルエクステンションの機能にアクセスすることができます。Minimal QMLの例では、単にクライアントをシーンに追加したいだけです。新しいウィンドウの存在を記録するために、ListModel

ListModel { id: shellSurfaces }

シーンの作成

必要なコンポジターコードのほとんどはすでに準備できています。最後のステップは、アプリケーションが実際に画面に表示されるようにすることです。

すべてのコンポジターで、少なくとも1つの出力を定義する必要があります。これは、WaylandCompositor の直接の子として、WaylandOutput オブジェクトをインスタンス化することで行います。出力が1つしかない場合、これがシステム上のプライマリ画面を表します。(複数のスクリーンがある場合は、WaylandOutput オブジェクトを複数作成して、複数のスクリーンに対応することもできます。この詳細については、マルチ・スクリーンの例を参照してください)。

WaylandOutput {
    sizeFollowsWindow: true
    window: Window {
        width: 1024
        height: 768
        visible: true

WaylandOutput 、シーンのコンテナとして機能する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の例をご覧ください。

サンプルプロジェクト @ code.qt.io

© 2025 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.