このページについて

IVI Compositor

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

はじめに

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

Qt を使用した Qt Wayland Compositor については、「Minimal Qml」サンプルを参照してください。

Protocol

IviApplication は、車載インフォテインメントシステムを構築するために特別に設計されたシェル拡張機能です。

これは最小限のプロトコルであり、以下の機能のみを提供します。

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

一般的なIviApplication 環境では、サーバーに接続可能なアプリケーションのセットが事前に定義されています。これらのアプリケーションはシステム設計時点で既に判明しているため、それらを識別するための固定の番号を割り当てることができます。クライアントとサーバーがこれらの番号について事前に合意していることを前提として、ID番号に意味論を組み込むことが可能です。

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

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

例

Qt Wayland Compositor は一度に複数のシェル拡張機能をサポートできますが、IVICompositorの例では IviApplication プロトコルのみをサポートしています。つまり、クライアントがサーバーに接続するには、このシェル拡張機能もサポートしている必要があります。

この例のコンポジターウィンドウは水平方向に2つに分割されています。左側の領域はID「1337」を持つ専用アプリケーション用に指定されており、右側の領域はその他のすべてのアプリケーション用です。

コンポジターウィンドウは水平に分割されており、左側の領域はアプリケーションID「1337」用、右側の領域はその他のアプリケーション用となっている

レイアウトの作成

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

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 を作成し、その上に、コンポジター内のすべてのコンテンツを格納する最上位コンテナとしてWindowを作成します。このウィンドウ内には、接続されるアプリケーションのコンテナとなる2つの矩形が作成されます。

クライアントの接続

追加の設定が行われていない場合、Qt アプリケーションは、そのプロセス ID と同じIVI-idで接続します。たとえば、-platform wayland で別の Qt サンプルアプリケーションを実行すると、その 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 で定義されており、クライアントにイベントを送信します。クライアントは新しいサイズを含むリサイズイベントを受信するため、コンテンツのレイアウトを再構築することができます。

複数のアプリケーションがレイアウト内の同じ領域に接続している場合、それらは通常の `Qt Quick ` の順序ルールに従って単純に重ねられます。アプリケーションの終了や状態管理のための組み込みメカニズムはありませんが、これは通常の `Qt Quick ` コードとして簡単に追加できます。

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

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