Qt 6.x
The Qt SDK
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
44class QSocketNotifier;
45class QPlatformScreen;
47
48namespace QtWayland {
49 class qt_surface_extension;
50 class zwp_text_input_manager_v1;
51 class zwp_text_input_manager_v2;
52 class zwp_text_input_manager_v4;
53 class qt_text_input_method_manager_v1;
54 class wp_cursor_shape_manager_v1;
55 class wp_fractional_scale_manager_v1;
56 class wp_viewporter;
57 class qt_toplevel_drag_manager_v1;
58}
59
60namespace QtWaylandClient {
61
62Q_WAYLANDCLIENT_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcQpaWayland);
63
65class QWaylandBuffer;
66class QWaylandScreen;
71#if QT_CONFIG(wayland_client_primary_selection)
73#endif
74#if QT_CONFIG(tabletevent)
76#endif
80class QWaylandWindow;
83class QWaylandSurface;
85class QWaylandCursor;
86class QWaylandCursorTheme;
87class EventThread;
88
89typedef void (*RegistryListener)(void *data,
90 struct wl_registry *registry,
91 uint32_t id,
92 const QString &interface,
93 uint32_t version);
94
95class Q_WAYLANDCLIENT_EXPORT QWaylandDisplay : public QObject, public QtWayland::wl_registry {
97
98public:
99 QWaylandDisplay(QWaylandIntegration *waylandIntegration);
100 ~QWaylandDisplay(void) override;
101
102 bool initialize();
103
104#if QT_CONFIG(xkbcommon)
105 struct xkb_context *xkbContext() const { return mXkbContext.get(); }
106#endif
107
108 QList<QWaylandScreen *> screens() const { return mScreens; }
109 QPlatformPlaceholderScreen *placeholderScreen() const { return mPlaceholderScreen; }
110 void ensureScreen();
111
112 QWaylandScreen *screenForOutput(struct wl_output *output) const;
113 void handleScreenInitialized(QWaylandScreen *screen);
114
115 struct wl_surface *createSurface(void *handle);
116 struct ::wl_region *createRegion(const QRegion &qregion);
117 struct ::wl_subsurface *createSubSurface(QWaylandWindow *window, QWaylandWindow *parent);
118 struct ::wp_viewport *createViewport(QWaylandWindow *window);
119
120 QWaylandShellIntegration *shellIntegration() const;
121 QWaylandClientBufferIntegration *clientBufferIntegration() const;
122 QWaylandWindowManagerIntegration *windowManagerIntegration() const;
123
124#if QT_CONFIG(cursor)
125 QWaylandCursor *waylandCursor();
126 QWaylandCursorTheme *loadCursorTheme(const QString &name, int pixelSize);
127#endif
128 struct wl_display *wl_display() const { return mDisplay; }
129 struct ::wl_registry *wl_registry() { return object(); }
130
131 const struct wl_compositor *wl_compositor() const { return mCompositor.object(); }
132 QtWayland::wl_compositor *compositor() { return &mCompositor; }
133
134 QList<QWaylandInputDevice *> inputDevices() const { return mInputDevices; }
135 QWaylandInputDevice *defaultInputDevice() const;
136 QWaylandInputDevice *currentInputDevice() const { return defaultInputDevice(); }
137#if QT_CONFIG(wayland_datadevice)
138 QWaylandDataDeviceManager *dndSelectionHandler() const
139 {
140 return mGlobals.dndSelectionHandler.get();
141 }
142#endif
143#if QT_CONFIG(wayland_client_primary_selection)
144 QWaylandPrimarySelectionDeviceManagerV1 *primarySelectionManager() const
145 {
146 return mGlobals.primarySelectionManager.get();
147 }
148#endif
149 QtWayland::qt_surface_extension *windowExtension() const
150 {
151 return mGlobals.surfaceExtension.get();
152 }
153#if QT_CONFIG(tabletevent)
154 QWaylandTabletManagerV2 *tabletManager() const
155 {
156 return mGlobals.tabletManager.get();
157 }
158#endif
160 {
161 return mGlobals.pointerGestures.get();
162 }
164 {
165 return mGlobals.touchExtension.get();
166 }
167 QtWayland::qt_text_input_method_manager_v1 *textInputMethodManager() const
168 {
169 return mGlobals.textInputMethodManager.get();
170 }
171 QtWayland::zwp_text_input_manager_v1 *textInputManagerv1() const
172 {
173 return mGlobals.textInputManagerv1.get();
174 }
175 QtWayland::zwp_text_input_manager_v2 *textInputManagerv2() const
176 {
177 return mGlobals.textInputManagerv2.get();
178 }
179 QtWayland::zwp_text_input_manager_v4 *textInputManagerv4() const
180 {
181 return mGlobals.textInputManagerv4.get();
182 }
184 {
185 return mGlobals.hardwareIntegration.get();
186 }
188 {
189 return mGlobals.xdgOutputManager.get();
190 }
191 QtWayland::wp_fractional_scale_manager_v1 *fractionalScaleManager() const
192 {
193 return mGlobals.fractionalScaleManager.get();
194 }
195 QtWayland::wp_viewporter *viewporter() const
196 {
197 return mGlobals.viewporter.get();
198 }
199 QtWayland::wp_cursor_shape_manager_v1 *cursorShapeManager() const
200 {
201 return mGlobals.cursorShapeManager.get();
202 }
203 QtWayland::qt_toplevel_drag_manager_v1 *xdgToplevelDragManager() const
204 {
205 return mGlobals.xdgToplevelDragManager.get();
206 }
207
209 uint32_t id;
211 uint32_t version;
212 struct ::wl_registry *registry = nullptr;
213 RegistryGlobal(uint32_t id_, const QString &interface_, uint32_t version_, struct ::wl_registry *registry_)
214 : id(id_), interface(interface_), version(version_), registry(registry_) { }
215 };
217 {
218 return mRegistryGlobals;
219 }
220 bool hasRegistryGlobal(QStringView interfaceName) const;
221
222 /* wl_registry_add_listener does not add but rather sets a listener, so this function is used
223 * to enable many listeners at once. */
224 void addRegistryListener(RegistryListener listener, void *data);
225 void removeListener(RegistryListener listener, void *data);
226
227 QWaylandShm *shm() const { return mShm.data(); }
228
229 static uint32_t currentTimeMillisec();
230
231 void forceRoundTrip();
232
233 bool supportsWindowDecoration() const;
234
235 uint32_t lastInputSerial() const { return mLastInputSerial; }
236 QWaylandInputDevice *lastInputDevice() const { return mLastInputDevice; }
237 QWaylandWindow *lastInputWindow() const;
238 void setLastInputDevice(QWaylandInputDevice *device, uint32_t serial, QWaylandWindow *window);
239
240 bool isWindowActivated(const QWaylandWindow *window);
241 void handleWindowActivated(QWaylandWindow *window);
242 void handleWindowDeactivated(QWaylandWindow *window);
243 void handleKeyboardFocusChanged(QWaylandInputDevice *inputDevice);
244 void handleWindowDestroyed(QWaylandWindow *window);
245
246 wl_event_queue *frameEventQueue() { return m_frameEventQueue; };
247
248 bool isKeyboardAvailable() const;
249 bool isClientSideInputContextRequested() const;
250
251 void initEventThread();
252
253public slots:
254 void blockingReadEvents();
255 void flushRequests();
256
257signals:
261
262private:
263 void checkWaylandError();
264 void reconnect();
265 void setupConnection();
266 void handleWaylandSync();
267 void requestWaylandSync();
268
269 void checkTextInputProtocol();
270
271 struct Listener {
272 Listener() = default;
273 Listener(RegistryListener incomingListener,
274 void* incomingData)
275 : listener(incomingListener), data(incomingData)
276 {}
277 RegistryListener listener = nullptr;
278 void *data = nullptr;
279 };
280
281 struct wl_display *mDisplay = nullptr;
282 std::unique_ptr<EventThread> m_eventThread;
283 wl_event_queue *m_frameEventQueue = nullptr;
284 QScopedPointer<EventThread> m_frameEventQueueThread;
285 QtWayland::wl_compositor mCompositor;
287 QList<QWaylandScreen *> mWaitingScreens;
289 QPlatformPlaceholderScreen *mPlaceholderScreen = nullptr;
290 QList<QWaylandInputDevice *> mInputDevices;
291 QList<Listener> mRegistryListeners;
292 QWaylandIntegration *mWaylandIntegration = nullptr;
293#if QT_CONFIG(cursor)
294 struct WaylandCursorTheme {
296 int pixelSize;
297 std::unique_ptr<QWaylandCursorTheme> theme;
298 };
299 std::vector<WaylandCursorTheme> mCursorThemes;
300
301 struct FindExistingCursorThemeResult {
302 std::vector<WaylandCursorTheme>::const_iterator position;
303 bool found;
304
305 QWaylandCursorTheme *theme() const noexcept
306 { return found ? position->theme.get() : nullptr; }
307 };
308 FindExistingCursorThemeResult findExistingCursorTheme(const QString &name,
309 int pixelSize) const noexcept;
311#endif
312
313 QScopedPointer<QWaylandWindowManagerIntegration> mWindowManagerIntegration;
314
315 struct GlobalHolder
316 {
317#if QT_CONFIG(wayland_datadevice)
318 std::unique_ptr<QWaylandDataDeviceManager> dndSelectionHandler;
319#endif
320 std::unique_ptr<QtWayland::qt_surface_extension> surfaceExtension;
321 std::unique_ptr<QtWayland::wl_subcompositor> subCompositor;
322 std::unique_ptr<QWaylandTouchExtension> touchExtension;
323 std::unique_ptr<QWaylandQtKeyExtension> qtKeyExtension;
324#if QT_CONFIG(tabletevent)
325 std::unique_ptr<QWaylandTabletManagerV2> tabletManager;
326#endif
327 std::unique_ptr<QWaylandPointerGestures> pointerGestures;
328#if QT_CONFIG(wayland_client_primary_selection)
329 std::unique_ptr<QWaylandPrimarySelectionDeviceManagerV1> primarySelectionManager;
330#endif
331 std::unique_ptr<QtWayland::qt_text_input_method_manager_v1> textInputMethodManager;
332 std::unique_ptr<QtWayland::zwp_text_input_manager_v1> textInputManagerv1;
333 std::unique_ptr<QtWayland::zwp_text_input_manager_v2> textInputManagerv2;
334 std::unique_ptr<QtWayland::zwp_text_input_manager_v4> textInputManagerv4;
335 std::unique_ptr<QWaylandHardwareIntegration> hardwareIntegration;
336 std::unique_ptr<QWaylandXdgOutputManagerV1> xdgOutputManager;
337 std::unique_ptr<QtWayland::wp_viewporter> viewporter;
338 std::unique_ptr<QtWayland::wp_fractional_scale_manager_v1> fractionalScaleManager;
339 std::unique_ptr<QtWayland::wp_cursor_shape_manager_v1> cursorShapeManager;
340 std::unique_ptr<QtWayland::qt_toplevel_drag_manager_v1> xdgToplevelDragManager;
341 } mGlobals;
342
343 int mFd = -1;
344 int mWritableNotificationFd = -1;
345 QList<RegistryGlobal> mRegistryGlobals;
346 uint32_t mLastInputSerial = 0;
347 QWaylandInputDevice *mLastInputDevice = nullptr;
348 QPointer<QWaylandWindow> mLastInputWindow;
349 QPointer<QWaylandWindow> mLastKeyboardFocus;
350 QList<QWaylandWindow *> mActiveWindows;
351 struct wl_callback *mSyncCallback = nullptr;
352 static const wl_callback_listener syncCallbackListener;
353 bool mWaylandTryReconnect = false;
354
355 bool mClientSideInputContextRequested = [] () {
357 return !requested.isEmpty() && requested != QLatin1String("wayland");
358 }();
359 QStringList mTextInputManagerList;
360 int mTextInputManagerIndex = INT_MAX;
361
362 void registry_global(uint32_t id, const QString &interface, uint32_t version) override;
363 void registry_global_remove(uint32_t id) override;
364
365#if QT_CONFIG(xkbcommon)
367#endif
368
370};
371
372}
373
375
376#endif // QWAYLANDDISPLAY_H
IOBluetoothDevice * device
Definition qlist.h:74
\inmodule QtCore
Definition qobject.h:90
The QPlatformScreen class provides an abstraction for visual displays.
\inmodule QtCore
Definition qpointer.h:18
The QRegion class specifies a clip region for a painter.
Definition qregion.h:27
\inmodule QtCore
\inmodule QtCore
\inmodule QtCore
\inmodule QtCore
Definition qstringview.h:76
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:1083
std::unique_ptr< struct xkb_context, XKBContextDeleter > ScopedXKBContext
void globalAdded(const RegistryGlobal &global)
QtWayland::qt_surface_extension * windowExtension() const
const struct wl_compositor * wl_compositor() const
QtWayland::zwp_text_input_manager_v4 * textInputManagerv4() 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
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
QtWayland::qt_toplevel_drag_manager_v1 * xdgToplevelDragManager() 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:67
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)
GLuint64 GLenum void * handle
GLenum GLuint id
[7]
GLuint object
[3]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint name
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 slots
#define signals
QT_BEGIN_NAMESPACE typedef uchar * output
aWidget window() -> setWindowTitle("New Window Title")
[2]
QJSValue global
RegistryGlobal(uint32_t id_, const QString &interface_, uint32_t version_, struct ::wl_registry *registry_)
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent