最小限のQML

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

Minimal QMLはデスクトップスタイルのWaylandコンポジターのサンプルで、できるだけ少ないコードで完全なQt 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の例では、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

©2024 The Qt Company Ltd. ここに含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。