최소 QML
Minimal QML은 QML로 Wayland 컴포지터를 작성하는 방법을 보여주는 간단한 예제입니다.
'미니멀 QML'은 가능한 한 적은 코드로 완전한 Qt Wayland Compositor 을 구현한 데스크톱 스타일의 Wayland 컴포지터 예제입니다. 이 컴포지터는 Qt Quick 및 QML을 사용하여 구현되었습니다.

WaylandCompositor 객체
컴포지터의 최상위 항목은 ` 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 ` 객체를 생성할 수도 있습니다. 이에 대한 자세한 내용은 ‘다중 화면(Multi Screen)’ 예제를 참조하십시오.)
WaylandOutput {
sizeFollowsWindow: true
window: Window {
width: 1024
height: 768
visible: trueWaylandOutput 내부에서, 우리는 씬의 컨테이너 역할을 하는 Window를 생성합니다. 이 예제에서는 이 Window에 크기를 지정합니다. 이 크기는 컴포지터가 사용자 정의 크기의 창을 지원하는 다른 윈도우 시스템 내에서 애플리케이션으로 실행될 때 사용됩니다. 임베디드 장치에서 컴포지터가 유일한 디스플레이 서버로 실행되는 일반적인 사용 사례의 경우, 컴포지터는 아마도 전체 화면 플랫폼 플러그인(예: 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 Compositor 예제를 확인해 보세요.
© 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.