多屏幕

多屏幕是一个适用于多屏幕的桌面式 Wayland 组合器。

简介

多屏幕是一个适用于多屏幕的桌面式 Wayland 组合器示例。

有关使用 Qt 创建 Qt Wayland Compositor 的基本原理的介绍,请参阅 最小 QML 示例

支持多屏幕

对于系统上可用的每个屏幕,示例创建一个 CompositorScreen,它是 WaylandOutput 的子类。如果只有一个物理屏幕可用,示例使用虚拟数据模拟三个屏幕。

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
    }
}

每个 WaylandOutput 包含一个 Window,用于包含客户端内容,就像 Qt Wayland Compositor 的标准设置一样。由于每个 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;

客户端内容将同时仅在一个或两个屏幕上可见。 ShellSurfaceItem 的位置是同步的,以便当窗口进入一个屏幕时,它们同时从一个屏幕上移开。这给人一种单个项在屏幕之间无缝移动的错觉。客户端的全局位置存储在一个共享的 moveItem 中,并且每个屏幕的 ShellSurfaceItem 的相对位置基于此计算。如果 moveItem 当前在屏幕界限之外,其坐标将反映这一点,并且在该屏幕上将不可见。

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

最后,在适当的时机调用 WaylandQuickItem::setPrimary() 来设置 ShellSurface 的主视图,当客户端请求最大化或全屏时使用。根据当前可见的主 ShellSurfaceItem 的部分选择主视图。

注意: 为了支持同一合成器中的多个Wayland输出,必须在构造Qt::AA_ShareOpenGLContexts属性之前设置QGuiApplication对象。在示例中,我们在main()函数的非常开始处做这件事。

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

示例项目 @ code.qt.io

另请参阅 多输出

© 2024 Qt公司。本文档中的文档贡献版权属于各自的拥有者。提供的文档是根据自由软件基金会发布的GNU自由文档许可第1.3版的条款许可的。Qt及其相关标志是芬兰及/或其他国家Qt公司的商标。所有其他商标均为其各自所有者的财产。