マルチスクリーン

Multi Screen はマルチスクリーン用のデスクトップ型 Wayland コンポジターです。

はじめに

Multi-screenはマルチスクリーン用のデスクトップ型Waylandコンポジターのサンプルです。

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

マルチスクリーンのサポート

システム上で利用可能な各画面に対して、この例ではWaylandOutput のサブクラスであるCompositorScreen を作成します。 物理的に利用可能な画面が1つしかない場合、この例ではダミーデータで3つの画面をエミュレートします。

Instantiator {
    id: screens
    model: emulated ? emulatedScreens : Qt.application.screens

    delegate: CompositorScreen {
        surfaceArea.color: "lightsteelblue"
        text: name
        compositor: comp
        screen: emulated ? Qt.application.screens[0] : modelData
        Component.onCompleted: if (!comp.defaultOutput) comp.defaultOutput = this
        position: Qt.point(virtualX, virtualY)
        windowed: emulated
    }
}

Qt Wayland Compositorの標準的なセットアップと同じように、それぞれのWaylandOutput にはWindowがあり、クライアントのコンテンツを表示します。それぞれのWindowは他のWindowから分離されているため、Window間でQt Quickアイテムを共有することはできません。そのため、クライアントが接続し、ShellSurface が作成されると、ShellSurfaceItem が各スクリーンに作成されます。

for (var i = 0; i < screens.count; ++i)
    createShellSurfaceItem(shellSurface, moveItem, screens.objectAt(i));

これらのアイテムは、同じクライアントのコンテンツのビューとして機能します。クライアントのサーフェス自体は一度だけ作成され、サーフェスアイテムによって共有されます。

トップレベルのサーフェスアイテムは、各出力の背景Rectangle の子として作成される。これらのビューは後のために保存され、クライアントが子ウィンドウを生成する場合、それらはトップレベル・ウィンドウのアイテムの親になります。

var parentSurfaceItem = output.viewsBySurface[shellSurface.parentSurface];
var parent = parentSurfaceItem || output.surfaceArea;

クライアントのコンテンツは、一度に1つまたは2つのスクリーンのみに表示されます。ShellSurfaceItem 位置が同期されているので、ウィンドウが1つのスクリーンに入ると、同時に別のスクリーンから移動されます。これにより、画面間をシームレスに移動する1つのアイテムのように見えます。クライアントのグローバルな位置は共有のmoveItem に保存され、各画面のShellSurfaceItem の相対的な位置はこれに基づいて計算されます。現在moveItem があるスクリーンの境界の外にある場合、その座標はこれを反映し、そのスクリーンには表示されません。

x: surfaceItem.moveItem.x - surfaceItem.output.geometry.x
y: surfaceItem.moveItem.y - surfaceItem.output.geometry.y

最後に、WaylandQuickItem::setPrimary() が適切なタイミングで呼び出され、ShellSurface のプライマリ・ビューが設定されます。これは、クライアントが最大化またはフルスクリーンを要求したときに使用されます。プライマリ・ビューShellSurfaceItem は、現在どの程度表示されているかに基づいて選択される。

注意: 同じコンポジターで複数のWayland出力をサポートするためには、QGuiApplication オブジェクトを構築する前にQt::AA_ShareOpenGLContexts 属性を設定する必要があります。この例では、main() 関数の先頭でこれを行います。

QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true);

プロジェクト例 @ code.qt.io

Multi Outputも参照してください

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