IVI コンポジター

IVI Compositor は、IviApplication 拡張機能の使用方法を示すサンプルです。

はじめに

この例では、Waylandディスプレイサーバー(Waylandコンポジターとしても知られています)でIviApplication シェル拡張機能を使用する方法を示します。

QtでQt Wayland Compositorを作成する基本原則については、Minimal QML exampleを参照してください。

プロトコル

IviApplication は、In-vehiceインフォテインメントシステムを作るために特別に設計されたシェル拡張です。

最小限のプロトコルで、以下の機能のみを提供します:

  1. クライアントはIVI-id を使用して自身を識別することができます。
  2. サーバはクライアントのサイズ変更を要求できます。
識別番号

一般的なIviApplication セットアップでは、サーバーに接続できるアプリケーションの事前定義が行われます。これらのアプリケーションは、システムが設計された時点で既に知られているため、それらを識別するハードコードされた番号を割り当てることができます。クライアントとサーバーがこれらの番号に前もって合意していれば、ID番号にセマンティクスを組み込むことができる。

例えば、クライアントが自身をナビゲーション・アプリケーションと識別した場合、サーバーはそれを認識し、画面の中央に大きくウィンドウを割り当てることができる。一方、時計と名乗るアプリケーションは、画面の余白の小さな領域に割り当てられます。

デフォルトでは、QtアプリケーションはシステムのPID(「プロセスID」)をIVI-IDとして通知します。クライアントはサーバに接続する前に、QT_IVI_SURFACE_ID を環境に設定することで、これを上書きすることができます。

Qt Wayland Compositorは一度に複数のシェル拡張をサポートすることができますが、IVICompositorの例では IviApplication プロトコルのみをサポートしています。つまり、サーバに接続するためにはクライアントもこのシェル拡張に対応していなければなりません。

例のコンポジターウィンドウは水平方向に2つに分割されている:左側の領域は "1337 "という特殊なアプリケーション用に指定され、右側の領域は他のすべてのアプリケーション用に指定されています。

レイアウトの作成

ウィンドウのレイアウトはWaylandOutput 内で作成されます。これは通常、コンポジターが利用できる物理的なスクリーンに対応します。IVICompositorの例のように、WaylandOutput が1つ作成される場合、それは通常プライマリー・スクリーンに対応します。

WaylandOutput {
    sizeFollowsWindow: true
    window: Window {
        width: 1024
        height: 768
        visible: true
        Rectangle {
            id: leftArea
            width: parent.width / 2
            height: parent.height
            anchors.left: parent.left
            color: "cornflowerblue"
            Text {
                anchors.centerIn: parent
                text: "Ivi surface with id 1337"
            }
        }
        Rectangle {
            id: rightArea
            width: parent.width / 2
            height: parent.height
            anchors.right: parent.right
            color: "burlywood"
            Text {
                anchors.centerIn: parent
                text: "Other surfaces"
            }
        }
    }
}

コードはスクリーン用にWaylandOutput を作成し、すべてのコンポジターコンテンツのトップレベルのコンテナとして、この上にウィンドウを作成します。このウィンドウの中に、接続するアプリケーションのコンテナとして機能する2つの矩形を作成します。

クライアントの接続

追加の設定が行われていない場合、Qt アプリケーションはそのプロセス ID に等しいIVI-idで接続します。例えば、別の Qt サンプルアプリケーションを-platform wayland で実行すると、その ID が「1337」とは異なるため、レイアウトの右側に委譲されます。

しかし、サンプルを開始する前に環境変数QT_IVI_SURFACE_ID を "1337 "に設定すると、レイアウトの左側に委譲されます。

クライアントがIVIApplication インターフェースに接続すると、iviSurfaceCreated シグナルを発する。ここで、アプリケーションの表面の位置決めが処理されます。

IviApplication {
    onIviSurfaceCreated: (iviSurface) =>  {
        var surfaceArea = iviSurface.iviId === 1337 ? leftArea : rightArea;
        var item = chromeComponent.createObject(surfaceArea, { "shellSurface": iviSurface } );
        item.handleResized();
    }
}

iviSurfaceCreated シグナルは、クライアントのIDにアクセスするために使用できるIviSurface 引数を受け取ります。コンポジターは次に、(chromeComponent で定義された)サーフェス用のShellSurfaceItem を作成します。ShellSurfaceItem はシェルのサーフェスを Qt Quick シーンに配置するために使用されるクラスで、Qt Wayland Compositor のすべてのサンプルでこれと同じパターンを見ることができます。

IVICompositorの例が特別なのは、入力されるシェルサーフェスのiviId プロパティをチェックし、これが何であるかによってShellSurfaceItem の親を決定することです。IDが "1337 "であれば、leftArea の親になり、そうでなければ、rightArea の親になります。

ShellSurfaceItem の実装は、サイズが変更されるたびに(コンポジターがデスクトップ・スタイルのウィンドウ・システムの中で実行されていて、そのウィンドウのサイズが変更される場合に起こりうる)クライアントに通知することによって、サイズ変更を処理します。

onWidthChanged: handleResized()
onHeightChanged: handleResized()
function handleResized() {
    if (width > 0 && height > 0)
        shellSurface.sendConfigure(Qt.size(width, height));
}

sendConfigure() メソッドはIviSurface で定義されており、クライアントにイベントを送信します。クライアントは新しいサイズのresizeイベントを受け取るので、その内容を中継することができます。

複数のアプリケーションがレイアウトの同じ領域に接続された場合、通常のQt Quickの順序ルールに従ってスタックされます。アプリケーションを閉じたり、状態を管理するメカニズムは組み込まれていませんが、通常のQt Quickのコードとして簡単に追加できます。

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

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