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
qwaylanddisplay_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QWAYLANDDISPLAY_H
5#define QWAYLANDDISPLAY_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtCore/QList>
19#include <QtCore/QObject>
20#include <QtCore/QPointer>
21#include <QtCore/QRect>
22#include <QtCore/QMutex>
23#include <QtCore/QReadWriteLock>
24
25#include <QtCore/QWaitCondition>
26#include <QtCore/QLoggingCategory>
27
28#include <QtWaylandClient/private/qwayland-wayland.h>
29#include <QtWaylandClient/private/qtwaylandclientglobal_p.h>
30#include <QtWaylandClient/private/qwaylandshm_p.h>
31
32#include <qpa/qplatforminputcontextfactory_p.h>
33
34#if QT_CONFIG(xkbcommon)
35#include <QtGui/private/qxkbcommon_p.h>
36#endif
37
38struct wl_cursor_image;
39struct wp_viewport;
40
42
43#define WAYLAND_IM_KEY "wayland"
44
46class QSocketNotifier;
47class QPlatformScreen;
49
50namespace QtWayland {
51 class qt_surface_extension;
52 class zwp_text_input_manager_v1;
53 class zwp_text_input_manager_v2;
54 class zwp_text_input_manager_v3;
55 class qt_text_input_method_manager_v1;
56 class wp_cursor_shape_manager_v1;
57 class wp_fractional_scale_manager_v1;
58 class wp_viewporter;
59 class xdg_toplevel_drag_manager_v1;
60}
61
62namespace QtWaylandClient {
63
64Q_WAYLANDCLIENT_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcQpaWayland);
65
67class QWaylandBuffer;
68class QWaylandScreen;
73#if QT_CONFIG(wayland_client_primary_selection)
75#endif
76#if QT_CONFIG(tabletevent)
78#endif
82class QWaylandWindow;
85class QWaylandSurface;
87class QWaylandCursor;
88class QWaylandCursorTheme;
89class EventThread;
90
91typedef void (*RegistryListener)(void *data,
92 struct wl_registry *registry,
93 uint32_t id,
94 const QString &interface,
95 uint32_t version);
96
97class Q_WAYLANDCLIENT_EXPORT QWaylandDisplay : public QObject, public QtWayland::wl_registry {
99
100public:
101 QWaylandDisplay(QWaylandIntegration *waylandIntegration);
102 ~QWaylandDisplay(void) override;
103
104 bool initialize();
105
106#if QT_CONFIG(xkbcommon)
107 struct xkb_context *xkbContext() const { return mXkbContext.get(); }
108#endif
109
110 QList<QWaylandScreen *> screens() const { return mScreens; }
111 QPlatformPlaceholderScreen *placeholderScreen() const { return mPlaceholderScreen; }
112 void ensureScreen();
113
114 QWaylandScreen *screenForOutput(struct wl_output *output) const;
115 void handleScreenInitialized(QWaylandScreen *screen);
116
117 struct wl_surface *createSurface(void *handle);
118 struct ::wl_region *createRegion(const QRegion &qregion);
119 struct ::wl_subsurface *createSubSurface(QWaylandWindow *window, QWaylandWindow *parent);
120 struct ::wp_viewport *createViewport(QWaylandWindow *window);
121
122 QWaylandShellIntegration *shellIntegration() const;
123 QWaylandClientBufferIntegration *clientBufferIntegration() const;
124 QWaylandWindowManagerIntegration *windowManagerIntegration() const;
125
126#if QT_CONFIG(cursor)
127 QWaylandCursor *waylandCursor();
128 QWaylandCursorTheme *loadCursorTheme(const QString &name, int pixelSize);
129#endif
130 struct wl_display *wl_display() const
131 {
132 return mDisplay;
133 }
134 struct ::wl_registry *wl_registry() { return object(); }
135
136 QtWayland::wl_compositor *compositor()
137 {
138 return mGlobals.compositor.get();
139 }
140
141 QList<QWaylandInputDevice *> inputDevices() const { return mInputDevices; }
142 QWaylandInputDevice *defaultInputDevice() const;
143 QWaylandInputDevice *currentInputDevice() const { return defaultInputDevice(); }
144#if QT_CONFIG(wayland_datadevice)
145 QWaylandDataDeviceManager *dndSelectionHandler() const
146 {
147 return mGlobals.dndSelectionHandler.get();
148 }
149#endif
150#if QT_CONFIG(wayland_client_primary_selection)
151 QWaylandPrimarySelectionDeviceManagerV1 *primarySelectionManager() const
152 {
153 return mGlobals.primarySelectionManager.get();
154 }
155#endif
156 QtWayland::qt_surface_extension *windowExtension() const
157 {
158 return mGlobals.surfaceExtension.get();
159 }
160#if QT_CONFIG(tabletevent)
161 QWaylandTabletManagerV2 *tabletManager() const
162 {
163 return mGlobals.tabletManager.get();
164 }
165#endif
167 {
168 return mGlobals.pointerGestures.get();
169 }
171 {
172 return mGlobals.touchExtension.get();
173 }
174 QtWayland::qt_text_input_method_manager_v1 *textInputMethodManager() const
175 {
176 return mGlobals.textInputMethodManager.get();
177 }
178 QtWayland::zwp_text_input_manager_v1 *textInputManagerv1() const
179 {
180 return mGlobals.textInputManagerv1.get();
181 }
182 QtWayland::zwp_text_input_manager_v2 *textInputManagerv2() const
183 {
184 return mGlobals.textInputManagerv2.get();
185 }
186 QtWayland::zwp_text_input_manager_v3 *textInputManagerv3() const
187 {
188 return mGlobals.textInputManagerv3.get();
189 }
191 {
192 return mGlobals.hardwareIntegration.get();
193 }
195 {
196 return mGlobals.xdgOutputManager.get();
197 }
198 QtWayland::wp_fractional_scale_manager_v1 *fractionalScaleManager() const
199 {
200 return mGlobals.fractionalScaleManager.get();
201 }
202 QtWayland::wp_viewporter *viewporter() const
203 {
204 return mGlobals.viewporter.get();
205 }
206 QtWayland::wp_cursor_shape_manager_v1 *cursorShapeManager() const
207 {
208 return mGlobals.cursorShapeManager.get();
209 }
210 QtWayland::xdg_toplevel_drag_manager_v1 *xdgToplevelDragManager() const
211 {
212 return mGlobals.xdgToplevelDragManager.get();
213 }
214
215
217 uint32_t id;
219 uint32_t version;
220 struct ::wl_registry *registry = nullptr;
221 RegistryGlobal(uint32_t id_, const QString &interface_, uint32_t version_, struct ::wl_registry *registry_)
222 : id(id_), interface(interface_), version(version_), registry(registry_) { }
223 };
224 QList<RegistryGlobal> globals() const
225 {
226 return mRegistryGlobals;
227 }
228 bool hasRegistryGlobal(QStringView interfaceName) const;
229
230 /* wl_registry_add_listener does not add but rather sets a listener, so this function is used
231 * to enable many listeners at once. */
232 void addRegistryListener(RegistryListener listener, void *data);
233 void removeListener(RegistryListener listener, void *data);
234
236 {
237 return mGlobals.shm.get();
238 }
239
240 void forceRoundTrip();
241
242 bool supportsWindowDecoration() const;
243
244 uint32_t lastInputSerial() const { return mLastInputSerial; }
245 QWaylandInputDevice *lastInputDevice() const { return mLastInputDevice; }
246 QWaylandWindow *lastInputWindow() const;
247 void setLastInputDevice(QWaylandInputDevice *device, uint32_t serial, QWaylandWindow *window);
248
249 bool isWindowActivated(const QWaylandWindow *window);
250 void handleWindowActivated(QWaylandWindow *window);
251 void handleWindowDeactivated(QWaylandWindow *window);
252 void handleKeyboardFocusChanged(QWaylandInputDevice *inputDevice);
253 void handleWindowDestroyed(QWaylandWindow *window);
254
255 wl_event_queue *frameEventQueue() { return m_frameEventQueue; };
256
257 bool isKeyboardAvailable() const;
258 bool isWaylandInputContextRequested() const;
259
260 void initEventThread();
261
262public Q_SLOTS:
263 void blockingReadEvents();
264 void flushRequests();
265
267 void connected();
270
271private:
272 void checkWaylandError();
273 void reconnect();
274 void setupConnection();
275 void handleWaylandSync();
276 void requestWaylandSync();
277
278 void checkTextInputProtocol();
279
280 struct Listener {
281 Listener() = default;
282 Listener(RegistryListener incomingListener,
283 void* incomingData)
284 : listener(incomingListener), data(incomingData)
285 {}
286 RegistryListener listener = nullptr;
287 void *data = nullptr;
288 };
289 struct wl_display *mDisplay = nullptr;
290 std::unique_ptr<EventThread> m_eventThread;
291 wl_event_queue *m_frameEventQueue = nullptr;
292 QScopedPointer<EventThread> m_frameEventQueueThread;
293 QList<QWaylandScreen *> mWaitingScreens;
294 QList<QWaylandScreen *> mScreens;
295 QPlatformPlaceholderScreen *mPlaceholderScreen = nullptr;
296 QList<QWaylandInputDevice *> mInputDevices;
297 QList<Listener> mRegistryListeners;
298 QWaylandIntegration *mWaylandIntegration = nullptr;
299#if QT_CONFIG(cursor)
300 struct WaylandCursorTheme {
302 int pixelSize;
303 std::unique_ptr<QWaylandCursorTheme> theme;
304 };
305 std::vector<WaylandCursorTheme> mCursorThemes;
306
307 struct FindExistingCursorThemeResult {
308 std::vector<WaylandCursorTheme>::const_iterator position;
309 bool found;
310
311 QWaylandCursorTheme *theme() const noexcept
312 { return found ? position->theme.get() : nullptr; }
313 };
314 FindExistingCursorThemeResult findExistingCursorTheme(const QString &name,
315 int pixelSize) const noexcept;
316 QScopedPointer<QWaylandCursor> mCursor;
317#endif
318
319 struct GlobalHolder
320 {
321 std::unique_ptr<QtWayland::wl_compositor> compositor;
322 std::unique_ptr<QWaylandShm> shm;
323#if QT_CONFIG(wayland_datadevice)
324 std::unique_ptr<QWaylandDataDeviceManager> dndSelectionHandler;
325#endif
326 std::unique_ptr<QtWayland::qt_surface_extension> surfaceExtension;
327 std::unique_ptr<QtWayland::wl_subcompositor> subCompositor;
328 std::unique_ptr<QWaylandTouchExtension> touchExtension;
329 std::unique_ptr<QWaylandQtKeyExtension> qtKeyExtension;
330#if QT_CONFIG(tabletevent)
331 std::unique_ptr<QWaylandTabletManagerV2> tabletManager;
332#endif
333 std::unique_ptr<QWaylandPointerGestures> pointerGestures;
334#if QT_CONFIG(wayland_client_primary_selection)
335 std::unique_ptr<QWaylandPrimarySelectionDeviceManagerV1> primarySelectionManager;
336#endif
337 std::unique_ptr<QtWayland::qt_text_input_method_manager_v1> textInputMethodManager;
338 std::unique_ptr<QtWayland::zwp_text_input_manager_v1> textInputManagerv1;
339 std::unique_ptr<QtWayland::zwp_text_input_manager_v2> textInputManagerv2;
340 std::unique_ptr<QtWayland::zwp_text_input_manager_v3> textInputManagerv3;
341 std::unique_ptr<QWaylandHardwareIntegration> hardwareIntegration;
342 std::unique_ptr<QWaylandXdgOutputManagerV1> xdgOutputManager;
343 std::unique_ptr<QtWayland::wp_viewporter> viewporter;
344 std::unique_ptr<QtWayland::wp_fractional_scale_manager_v1> fractionalScaleManager;
345 std::unique_ptr<QtWayland::wp_cursor_shape_manager_v1> cursorShapeManager;
346 std::unique_ptr<QtWayland::xdg_toplevel_drag_manager_v1> xdgToplevelDragManager;
347 std::unique_ptr<QWaylandWindowManagerIntegration> windowManagerIntegration;
348 } mGlobals;
349 int mFd = -1;
350 int mWritableNotificationFd = -1;
351 QList<RegistryGlobal> mRegistryGlobals;
352 uint32_t mLastInputSerial = 0;
353 QWaylandInputDevice *mLastInputDevice = nullptr;
354 QPointer<QWaylandWindow> mLastInputWindow;
355 QPointer<QWaylandWindow> mLastKeyboardFocus;
356 QList<QWaylandWindow *> mActiveWindows;
357 struct wl_callback *mSyncCallback = nullptr;
358 static const wl_callback_listener syncCallbackListener;
359 bool mWaylandTryReconnect = false;
360
361 bool mWaylandInputContextRequested = [] () {
362 const auto requested = QPlatformInputContextFactory::requested();
363 return requested.isEmpty() || requested.contains(QLatin1String(WAYLAND_IM_KEY));
364 }();
365 QStringList mTextInputManagerList;
366 int mTextInputManagerIndex = INT_MAX;
367
368 void registry_global(uint32_t id, const QString &interface, uint32_t version) override;
369 void registry_global_remove(uint32_t id) override;
370
371#if QT_CONFIG(xkbcommon)
373#endif
374
376};
377
378}
379
381
382#endif // QWAYLANDDISPLAY_H
IOBluetoothDevice * device
\inmodule QtCore
Definition qobject.h:103
The QPlatformScreen class provides an abstraction for visual displays.
The QRegion class specifies a clip region for a painter.
Definition qregion.h:27
\inmodule QtCore
\inmodule QtCore
\inmodule QtCore
Definition qstringview.h:78
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
std::unique_ptr< struct xkb_context, XKBContextDeleter > ScopedXKBContext
void globalAdded(const RegistryGlobal &global)
QtWayland::xdg_toplevel_drag_manager_v1 * xdgToplevelDragManager() const
QtWayland::qt_surface_extension * windowExtension() const
QWaylandTouchExtension * touchExtension() const
QList< QWaylandInputDevice * > inputDevices() const
QPlatformPlaceholderScreen * placeholderScreen() const
QtWayland::wl_compositor * compositor()
QWaylandInputDevice * lastInputDevice() const
QtWayland::wp_cursor_shape_manager_v1 * cursorShapeManager() const
QtWayland::zwp_text_input_manager_v3 * textInputManagerv3() const
QWaylandInputDevice * currentInputDevice() const
QtWayland::wp_fractional_scale_manager_v1 * fractionalScaleManager() const
QList< RegistryGlobal > globals() const
QtWayland::zwp_text_input_manager_v1 * textInputManagerv1() const
void globalRemoved(const RegistryGlobal &global)
QWaylandPointerGestures * pointerGestures() const
QWaylandXdgOutputManagerV1 * xdgOutputManager() const
QtWayland::zwp_text_input_manager_v2 * textInputManagerv2() const
struct wl_display * wl_display() const
QtWayland::qt_text_input_method_manager_v1 * textInputMethodManager() const
struct::wl_registry * wl_registry()
QtWayland::wp_viewporter * viewporter() const
QList< QWaylandScreen * > screens() const
QWaylandHardwareIntegration * hardwareIntegration() const
Combined button and popup list for selecting options.
void(* RegistryListener)(void *data, struct wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
static bool initialize()
Definition qctf.cpp:94
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char * interface
#define Q_DECLARE_LOGGING_CATEGORY(name)
static QOpenGLCompositor * compositor
GLuint64 GLenum void * handle
GLenum GLuint id
[7]
GLuint object
[3]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint name
QAnyStringView interfaceName(const Interface &iface)
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
QScreen * screen
[1]
Definition main.cpp:29
#define Q_OBJECT
#define Q_SLOTS
#define Q_SIGNALS
QT_BEGIN_NAMESPACE typedef uchar * output
#define WAYLAND_IM_KEY
aWidget window() -> setWindowTitle("New Window Title")
[2]
QJSValue global
RegistryGlobal(uint32_t id_, const QString &interface_, uint32_t version_, struct ::wl_registry *registry_)