多屏幕
多屏幕是一个适用于多屏幕的桌面式 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);
另请参阅 多输出。
© 2024 Qt公司。本文档中的文档贡献版权属于各自的拥有者。提供的文档是根据自由软件基金会发布的GNU自由文档许可第1.3版的条款许可的。Qt及其相关标志是芬兰及/或其他国家Qt公司的商标。所有其他商标均为其各自所有者的财产。