최근 출시된 Qt 5.7 에는 새로운 Qt Wayland Compositor API 에 대한 Technical Preview 가 공개되었습니다. 여기에서는 Qt Wayland 기능에 대한 개요와 더불어 개발자 고유의 Compositor 를 만드는 방법에 대한 몇 가지 예제를 제공 할 것입니다.
Wayland는 X Window System을 대체 할 수 있도록 설계된 경량 디스플레이 서버 프로토콜입니다. 특히 임베디드 및 모바일 시스템과 관련이 있습니다. Qt의 Wayland 지원을 통해 UI를 여러 프로세스로 분리하여 견고성과 안정성을 높일 수 있습니다. compositor API를 사용하면 디스플레이 서버에 대한 진정한 사용자 정의 UI를 만들 수 있습니다. 다른 프로세스의 디스플레이 정보를 정확하게 제어하고 고유 한 GUI 요소를 추가 할 수 있습니다.
Qt Wayland는 처음부터 컴포저 API를 포함 시켰지만 이 API는 공식적으로 출시되지 않았습니다. 이제 우리는 API를 재 작성하여 더욱 강력하고 사용하기가 훨씬 쉬워졌습니다.
다음은 임베디드 월드에서 보여준 데모의 스냅 샷입니다: 이것은 런처와 타일링 윈도우 관리자를 포함하는 컴포저이며 순수하게 QML로 작성되었습니다.
우리는 모든 5.7.x 패치 릴리스에 대해 소스 및 바이너리 호환성을 유지할 계획이지만, Technical Preview 이므로 최종 릴리스 전에 API 에 호환되지 않았던 개선 사항을 추가 할 예정입니다. Qt Wayland Compositor API는 Qt git 저장소의 dev 브랜치에서 활발히 개발되고 있습니다.
Qt Wayland Compositor Technical Preview는 Qt for Device Creation 패키지에 포함될 것입니다. 이 패키지는 Qt for Application Development 바이너리 패키지에 포함되어 있지 않지만 소스에서 Qt를 컴파일 할 때 Wayland 1.6이 설치되어 있는 한 기본적으로 빌드됩니다.
Qt Wayland 의 새로운 기능?
> 순수 QML로만 전체 compositor 를 작성할 수 있게 되었습니다.
> 향상된 API : QML 및 C ++ API 모두 작성하기가 쉽고 이해하기 쉽습니다.
> 완전하게 재 작업한 확장 지원 : 몇 줄의 QML 만 있으면 확장 기능을 추가 할 수 있으며 확장 기능을 작성하기위한 강력하고 사용하기 쉬운 C ++ API가 있습니다.
> 다중 화면 지원
> XDG-Shell 지원 : 비 Qt 클라이언트의 연결을 허용합니다.
> 마지막으로 API에서 볼 수 없지만 개발자로서의 삶을 더 편하게 만드는 변화 : 우리는 구현을 간편화했고 Qt Wayland는 표준 Qt PIMPL (Q_DECLARE_PRIVATE) 패턴을 따르고 있습니다.
자세한 내용은 API 설명서를 참조하십시오.
예제들
순수 QML로 작성된 완전히 기능적인 (그러나 최소한의) compositor 입니다 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
import QtQuick 2.6 import QtQuick.Window 2.2 import QtWayland.Compositor 1.0 WaylandCompositor { id: wlcompositor // The output defines the screen. WaylandOutput { compositor: wlcompositor window: Window { visible: true WaylandMouseTracker { anchors.fill: parent enableWSCursor: true Rectangle { id: surfaceArea color: "#1337af" anchors.fill: parent } } } } // The chrome defines the window look and behavior. // Here we use the built-in ShellSurfaceItem. Component { id: chromeComponent ShellSurfaceItem { onSurfaceDestroyed: destroy() } } // Extensions are additions to the core Wayland // protocol. We choose to support two different // shells (window management protocols). When the // client creates a new window, we instantiate a // chromeComponent on the output. extensions: [ WlShell { onShellSurfaceCreated: chromeComponent.createObject(surfaceArea, { "shellSurface": shellSurface } ); }, XdgShell { onXdgSurfaceCreated: chromeComponent.createObject(surfaceArea, { "shellSurface": xdgSurface } ); } ] } |
이것은 Technical Preview에서 pure-qml 예제를 제거한 것입니다. 그리고 정말로 완벽한 compositor 입니다. Technical Preview 에서 위의 텍스트를 복사하여 파일에 저장하고 qmlscene: 을 통해 실행할 수 있습니다.
위의 화면을 만들 때 사용한 명령은 다음과 같습니다:
1 2 3 4 |
./bin/qmlscene foo.qml & ./examples/widgets/widgets/wiggly/wiggly -platform wayland & weston-terminal & ./examples/opengl/qopenglwindow/qopenglwindow -platform wayland & |
Qt Wayland Compositor API는 당연히 데스크탑에도 사용될 수 있습니다. Grefsen compositor (https://github.com/ec1oud/grefsen)는 Qt Company에서 hackathon 프로젝트로 시작했으며 Shawn은 이후에도 계속 개발했습니다.
C ++ API
C ++ API는 좀 더 방대합니다. Technical Preview 에 포함 된 minimal-cpp 예제는 주석과 공백을 제외하고 195 행이 있습니다. 마우스 또는 키보드 입력을 따로 할 필요가 없습니다. qwindow-compositor 예제는 현재 743 라인으로, 윈도우 이동 / 크기 조정, 드래그 앤 드롭, 팝업 지원 및 마우스 커서를 구현합니다.
이러한 복잡성으로 인해 완전히 새로운 상호 작용 모델을 정의 할 수 있습니다. 우리는 새로운 API 로 이식될 모든 개발자들이 환영할만한 compositor 찾을 수 있는 시간을 벌었습니다.
이것은 아마도 Qt 로 Compositor 를 구현하는 가장 좋은 방법은 아니지만 어쨌든 코드를 사용할 수는 있습니다.
1 |
git clone https://github.com/paulolav/mazecompositor.git |
이후에 우리가 해야할 일은 무엇일까요?
API의 주요 부분은 완료되었지만 Technical Preview 의 피드백을 기반으로 일부 수정이 필요합니다.
QTBUG-48646 및 Trello 보드에 자세히 나와있는 몇 가지 알려진 문제가 있습니다.
해결되지 않은 주요 API 문제는 Input 핸들링에 관련한 것입니다.
어떻게 해야 할까요?
계속 시도하십시요! Qt 의 방대한 문서를 읽고, 예제를 실행하고, 자신의 프로젝트에서 도전해 보고, 개선 할 수 있는 것에 대한 피드백을 제공하십시오.
본 문서는 qt.io 의 “New Compositor API for Qt Wayland” 을 번역한 블로그로 의역 및 오역 이 있을 수 있습니다.