Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qtwaylandcompositor-overview.qdoc
Go to the documentation of this file.
1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
3
4/*!
5 \page qtwaylandcompositor-index.html
6 \title Qt Wayland Compositor
7 \brief An API to develop display servers that support the Wayland protocol.
8
9 The Qt Wayland Compositor is a module that provides convenient and powerful
10 QML and C++ APIs for developing custom display servers based on the
11 \l {https://wayland.freedesktop.org/}{Wayland} protocol. The display server,
12 often called a compositor, displays content from client applications that
13 support the Wayland protocol.
14
15 Wayland's design philosophy is to keep the core protocol simple and minimal.
16 Developers can then expand on this core protocol with use-case-specific
17 extensions. Qt Wayland Compositor supports many common extensions by default,
18 and also has APIs to enable the creation of new, custom extensions.
19
20 Typically, a compositor written with Qt Wayland Compositor becomes a
21 subsystem inside a larger application manager process. Qt Wayland Compositor
22 provides the APIs to communicate with clients and display their content on
23 the screen. The QML APIs contain high-level APIs that easily integrate with
24 the rest of Qt, enabling convenient animations, effects, and UI through
25 Qt Quick. There are also C++ APIs available - if you need more low-level
26 access.
27
28 An application manager would typically implement additional features such as
29 application life cycle, virtual keyboard input, security, and Inter-Process
30 Communication (IPC). Qt provides the APIs that can be used to develop the
31 remaining parts of an application manager in other modules. The
32 \l {https://www.qt.io/qt-automotive-suite/}{Qt Automotive Suite} provides
33 \l{https://doc.qt.io/QtApplicationManager}{Qt Application Manager}, which is a complete application manager that
34 includes a compositor developed using Qt Wayland Compositor.
35
36 For more information on Wayland, see \l{Wayland and Qt}.
37
38 \section1 Features of Qt Wayland Compositor
39
40 The Qt Wayland Compositor includes features necessary to create a compositor:
41
42 \list
43 \li A QML API to display and manipulate client content, fully integrated
44 with all the features in Qt Quick.
45 \li A C++ API for low-level access and control.
46 \li Support for common extensions, including XDG Shell and IVI Application.
47 \li APIs to easily expand the support for custom extensions.
48 \endlist
49
50 \section1 Environment Variables and Command-line Arguments
51
52 The Qt Wayland Compositor recognizes the following environment variables and
53 command-line arguments:
54
55 \list
56 \li Environment variables:
57 \list
58 \li \b QT_WAYLAND_HARDWARE_INTEGRATION Selects the hardware integration
59 plugin to use.
60 \li \b QT_WAYLAND_CLIENT_BUFFER_INTEGRATION Selects the client buffer
61 integration plugin to use.
62 \li \b QT_WAYLAND_SERVER_BUFFER_INTEGRATION Selects the server
63 integration plugin to use.
64 \endlist
65 \li Command-line arguments:
66 \list
67 \li \c{--wayland-socket-name} Overrides the default socket name used for
68 communicating with clients.
69 \endlist
70 \endlist
71
72 \section1 Running the Wayland compositor
73
74 As long as it does not depend on any unavailable platform-specific features, the compositor can
75 easily be tested on an X11-based desktop system. This can be useful during development, both for
76 simplified debugging and efficient turn-around on trying out new features.
77
78 Qt Wayland supports several backends for sharing graphics buffers between clients and the
79 server. The main one is:
80
81 \list
82 \li \c{wayland-egl}: This is the default backend and should be preferred whenever possible.
83 It requires support in the OpenGL driver on the system for this to work.
84 \endlist
85
86 Other backends may be selected by setting the \c QT_WAYLAND_CLIENT_BUFFER_INTEGRATION environment variable.
87
88 \note If Qt Wayland Compositor is unable to initialize the client buffer backend, then it will
89 fall back to using the "shared memory" backend (based on \c{wl_shm}) as a fail-safe. This backend
90 will use CPU memory for sharing the graphics buffers and copy the data back and forth as needed.
91 This has performance implications, especially on high density screens and limited graphics
92 hardware. When investigating performance issues with Qt Wayland Compositor, start by checking that
93 the correct client buffer integration is used.
94
95 Also bear in mind that if your system is already running a Wayland compositor, you may have to set
96 \c XDG_RUNTIME_DIR to point to a different location. If this is the case, you will see warnings
97 when starting the compositor. The \c XDG_RUNTIME_DIR can point to any accessible location which
98 is not already in use.
99
100 For instance, if you want to run the \l{Fancy Compositor}{fancy-compositor}
101 example with the \c wayland-egl backend, you could use the following command line:
102
103 \code
104 % XDG_RUNTIME_DIR=~/my_temporary_runtime QT_XCB_GL_INTEGRATION=xcb_egl QT_WAYLAND_CLIENT_BUFFER_INTEGRATION=wayland-egl ./fancy-compositor
105 \endcode
106
107 The client can subsequently be run on the compositor by setting the same \c XDG_RUNTIME_DIR and
108 by passing "-platform wayland" as a command line argument. The \c QT_QPA_PLATFORM environment
109 variable can also be used to select the Wayland QPA plugin on the client side.
110
111 \note In most cases, the client will adapt to the same OpenGL as the server when it connects.
112 However, when running with the EGL backend on some specific drivers, it is required that the
113 initialization happens earlier. If you encounter this problem, you may pass
114 "-platform wayland-egl" instead to pre-initialize the client to EGL.
115
116 \section1 Troubleshooting
117
118 Sometimes, when you are developing a complex compositor, you may encounter issues that require
119 further investigation.
120
121 Setting the \c WAYLAND_DEBUG environment variable to "1" will enable log output for the Wayland
122 library itself. This can be very useful, for example, when debugging custom extensions to the
123 Wayland protocol. It will show you exactly which events and requests are being passed between
124 the client and the server, as well as timestamps for these.
125
126 In addition, Qt has logging categories \c qt.waylandcompositor.* and \c qt.qpa.wayland.* to
127 enable additional logging. The latter should be set on the client side, as it enables logging
128 from the Wayland QPA plugin.
129
130 \section1 Examples
131
132 Take a look at the \l{Qt Wayland Compositor Examples} to learn how these APIs
133 can be used to write custom compositors.
134
135 \section1 API Reference
136
137 The Qt Wayland Compositor can be used from C++ or QML:
138
139 \list
140 \li \l{Qt Wayland Compositor QML Types}
141 \li \l{Qt Wayland Compositor C++ Classes}
142 \endlist
143
144 In addition, the module provides the CMake function
145 \l{qt_generate_wayland_protocol_server_sources}{qt_generate_wayland_protocol_server_sources()}.
146
147 \section1 Module Evolution
148 \l{Porting to Qt 6 - Qt Wayland Compositor} lists important changes in the
149 module API and functionality that were done for the Qt 6 series of Qt.
150
151 \section1 Licenses and Attributions
152
153 Qt Wayland Compositor and the Qt Wayland integration plugin
154 are available under commercial licenses from \l{The Qt Company}.
155
156 In addition, Qt Wayland Compositor is available under the
157 \l{GNU General Public License, version 3}, while
158 the Qt Wayland integration plugin is available under the
159 \l{GNU Lesser General Public License, version 3} or the
160 \l{GNU General Public License, version 2}.
161
162 See \l{Qt Licensing} for further details.
163
164 Qt Wayland Compositor and the Qt Wayland integration plugin
165 use protocol definitions under following permissive licenses:
166
167 \generatelist{groupsbymodule attributions-qtwaylandcompositor}
168
169*/