최소한의 QML
Minimal QML은 QML로 Wayland 컴포저를 작성하는 방법을 보여주는 간단한 예제입니다.
Minimal QML은 가능한 한 적은 코드로 완전한 Qt Wayland Compositor 을 구현하는 데스크톱 스타일의 Wayland 컴포저 예제입니다. 컴포저는 Qt Quick 및 QML로 구현됩니다.
웨이랜드 컴포저 객체
컴포저의 최상위 항목은 WaylandCompositor. 이것은 Wayland 서버 자체를 나타내며 클라이언트가 들어올 때 연결을 관리합니다.
기본적으로 서버는 클라이언트와 통신하기 위한 핵심 Wayland 프로토콜을 지원합니다. 하지만 일반적으로 프로토콜에 대한 하나 이상의 확장도 지원하려고 할 것입니다. 이렇게 하면 클라이언트가 윈도우 시스템에서 자신의 역할에 영향을 줄 수 있는 더 많은 도구를 사용할 수 있습니다.
Qt는 여러 표준 및 공통 확장을 지원합니다. 또한 클라이언트와 서버 코드 모두에서 지원을 추가할 수 있다면 사용자 정의 확장을 쉽게 만들고 지원할 수 있습니다.
셸 확장
일반적으로 컴포저는 하나 이상의 셸 확장을 지원합니다. 확장은 WaylandCompositor 객체의 직접 자식으로 인스턴스화하여 컴포저에 추가됩니다. 확장자는 자동으로 extensions
속성에 추가되고 클라이언트가 연결할 때 브로드캐스트됩니다.
WlShell { onWlShellSurfaceCreated: (shellSurface) => shellSurfaces.append({shellSurface: shellSurface}); } XdgShell { onToplevelCreated: (toplevel, xdgSurface) => shellSurfaces.append({shellSurface: xdgSurface}); } IviApplication { onIviSurfaceCreated: (iviSurface) => shellSurfaces.append({shellSurface: iviSurface}); }
Minimal QML 예제에서는 세 가지 셸을 지원합니다: WlShell, XdgShell 및 IviApplication 입니다.
클라이언트는 이 중 하나에 연결할 수 있으며 새 창 생성, 크기 협상 등과 같이 클라이언트와 컴포저 간의 특정 통신을 위한 채널로 사용됩니다.
클라이언트가 새 서페이스를 만들면 활성 확장은 이에 대한 신호를 받습니다. 이 신호에는 ShellSurface 인수가 포함됩니다. 신호를 수신한 확장에 따라 이 인수는 ShellSurface 의 서브클래스가 됩니다: WlShellSurface, XdgSurface 또는 IviSurface 의 서브클래스가 됩니다.
ShellSurface 은 특정 서페이스에 대한 셸 확장의 기능에 액세스하는 데 사용할 수 있습니다. 미니멀 QML 예제에서는 클라이언트를 씬에 추가하기만 하면 됩니다. 새 창의 존재를 기록하기 위해 안전한 보관을 위해 간단한 ListModel 에 추가합니다.
ListModel { id: shellSurfaces }
씬 만들기
필요한 컴포저 코드는 대부분 이미 준비되어 있습니다. 마지막 단계는 애플리케이션이 실제로 화면에 표시되는지 확인하는 것입니다.
모든 컴포저에 대해 하나 이상의 출력을 정의해야 합니다. 이는 WaylandCompositor 의 직접 자식으로 WaylandOutput 객체를 인스턴스화하여 수행됩니다. 출력이 하나만 있는 경우 시스템의 기본 화면을 나타냅니다. (사용 가능한 경우 여러 개의 WaylandOutput 개체를 만들어 여러 화면을 처리할 수도 있습니다. 이에 대한 자세한 내용은 다중 화면 예제를 참조하세요.)
WaylandOutput { sizeFollowsWindow: true window: Window { width: 1024 height: 768 visible: true
WaylandOutput 안에 씬의 컨테이너 역할을 하는 창을 만듭니다. 이 예제에서는 여기에 크기를 지정합니다. 컴포저가 사용자 지정 크기 창을 지원하는 다른 창 시스템 내에서 애플리케이션으로 실행되는 경우 사용되는 크기입니다. 임베디드 디바이스에서 컴포저가 유일한 디스플레이 서버로 실행되는 일반적인 사용 사례에서는 전체 화면 플랫폼 플러그인(예: eglfs
)에서 실행될 수 있으며 여기서 설정한 크기는 중요하지 않습니다.
마지막 단계는 생성된 ShellSurface 객체 각각에 대한 항목을 만드는 것입니다. 이를 위해 ShellSurfaceItem 클래스를 사용할 수 있습니다.
Repeater { model: shellSurfaces // ShellSurfaceItem handles displaying a shell surface. // It has implementations for things like interactive // resize/move, and forwarding of mouse and keyboard // events to the client process. ShellSurfaceItem { shellSurface: modelData onSurfaceDestroyed: shellSurfaces.remove(index) } }
모델의 각 셸 서페이스에 대해 ShellSurfaceItem 을 만들고 shellSurface
속성에 할당합니다. 또한 셸 표면이 파괴될 때 모델이 업데이트되도록 합니다. 이는 클라이언트가 수동으로 창을 닫거나 창이 종료되거나 충돌할 때 발생할 수 있습니다.
이것이 Qt Quick 및 QML을 사용하여 기능적인 Wayland 컴포저를 만드는 데 필요한 모든 코드입니다. QML로 작성되었지만 몇 가지 기능이 더 있는 컴포저의 다른 예시를 보려면 Fancy Composer 예제를 살펴보세요.
© 2025 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.