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
qwaylandcompositor.cpp
Go to the documentation of this file.
1// Copyright (C) 2017 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
2// Copyright (C) 2020 The Qt Company Ltd.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
4
8
9#include <QtWaylandCompositor/qwaylandclient.h>
10#include <QtWaylandCompositor/qwaylandseat.h>
11#include <QtWaylandCompositor/qwaylandoutput.h>
12#include <QtWaylandCompositor/qwaylandview.h>
13#include <QtWaylandCompositor/qwaylandclient.h>
14#include <QtWaylandCompositor/qwaylandkeyboard.h>
15#include <QtWaylandCompositor/qwaylandpointer.h>
16#include <QtWaylandCompositor/qwaylandtouch.h>
17#include <QtWaylandCompositor/qwaylandsurfacegrabber.h>
18
19#include <QtWaylandCompositor/private/qwaylandkeyboard_p.h>
20#include <QtWaylandCompositor/private/qwaylandsurface_p.h>
21
22#if QT_CONFIG(wayland_datadevice)
25#endif
27
32
33#if QT_CONFIG(opengl)
35#endif
36
38
40
41#include <QtCore/QCoreApplication>
42#include <QtCore/QStringList>
43#include <QtCore/QSocketNotifier>
44#include <QStandardPaths>
45
46#include <QtGui/QDesktopServices>
47#include <QtGui/QScreen>
48
49#include <QtGui/qpa/qwindowsysteminterface_p.h>
50#include <QtGui/qpa/qplatformnativeinterface.h>
51#include <QtGui/private/qguiapplication_p.h>
52
53#if QT_CONFIG(opengl)
54# include <QOpenGLTextureBlitter>
55# include <QOpenGLTexture>
56# include <QOpenGLContext>
57# include <QOpenGLFramebufferObject>
58# include <QMatrix4x4>
59#endif
60
62
63Q_LOGGING_CATEGORY(qLcWaylandCompositor, "qt.waylandcompositor")
64Q_LOGGING_CATEGORY(qLcWaylandCompositorHardwareIntegration, "qt.waylandcompositor.hardwareintegration")
65Q_LOGGING_CATEGORY(qLcWaylandCompositorInputMethods, "qt.waylandcompositor.inputmethods")
66Q_LOGGING_CATEGORY(qLcWaylandCompositorTextInput, "qt.waylandcompositor.textinput")
67
68namespace QtWayland {
69
71{
72public:
75 {
78 handleKeyEvent(keyEvent);
79 } else {
81 }
82 return true;
83 }
84
86 {
87 auto *seat = compositor->defaultSeat();
88 if (!seat)
89 return;
90
92
93#if defined(Q_OS_QNX)
94 // The QNX platform plugin delivers scan codes that haven't been adjusted to be
95 // xkbcommon compatible. xkbcommon requires that the scan codes be bumped up by
96 // 8 because that's how evdev/XKB deliver scan codes. You might think that it
97 // would've been better to remove this (odd) requirement from xkbcommon on QNX
98 // but it turns out that conforming to it has much less impact.
99 static int offset = QGuiApplication::platformName() == QStringLiteral("qnx") ? 8 : 0;
100 ke->nativeScanCode += offset;
101#endif
102 uint32_t code = ke->nativeScanCode;
103 if (code == 0)
104 code = seat->keyboard()->keyToScanCode(ke->key);
105 bool isDown = ke->keyType == QEvent::KeyPress;
106
107#if QT_CONFIG(xkbcommon)
108 xkb_state *xkbState = keyb->xkbState();
109
110 const xkb_keysym_t sym = xkb_state_key_get_one_sym(xkbState, code);
111 Qt::KeyboardModifiers modifiers = QXkbCommon::modifiers(xkbState, sym);
112 int qtkey = QXkbCommon::keysymToQtKey(sym, modifiers, xkbState, code);
113 QString text = QXkbCommon::lookupString(xkbState, code);
114
115 ke->key = qtkey;
116 ke->modifiers = modifiers;
117 ke->nativeVirtualKey = sym;
118 ke->nativeModifiers = keyb->xkbModsMask();
119 ke->unicode = text;
120#endif
121 if (!ke->repeat)
122 keyb->keyEvent(code, isDown ? WL_KEYBOARD_KEY_STATE_PRESSED : WL_KEYBOARD_KEY_STATE_RELEASED);
123
125
126 if (!ke->repeat) {
127 keyb->maybeUpdateKeymap();
128 keyb->updateModifierState(code, isDown ? WL_KEYBOARD_KEY_STATE_PRESSED : WL_KEYBOARD_KEY_STATE_RELEASED);
129 }
130 }
131
133};
134
135} // namespace
136
138{
139 // Create XDG_RUNTIME_DIR, if it does not already exist
141
143 display = static_cast<wl_display*>(QGuiApplication::platformNativeInterface()->nativeResourceForIntegration("server_wl_display"));
144
145 if (!display) {
146 display = wl_display_create();
147 ownsDisplay = true;
148 }
149
151 timer.start();
152
154
155#if QT_CONFIG(xkbcommon)
156 mXkbContext.reset(xkb_context_new(XKB_CONTEXT_NO_FLAGS));
157 if (!mXkbContext) {
158 qWarning("Failed to create a XKB context: keymap will not be supported");
159 return;
160 }
161#endif
162}
163
165{
168
169 if (socket_name.isEmpty()) {
170 const int socketArg = arguments.indexOf(QLatin1String("--wayland-socket-name"));
171 if (socketArg != -1 && socketArg + 1 < arguments.size())
172 socket_name = arguments.at(socketArg + 1).toLocal8Bit();
173 if (socket_name.isEmpty())
174 socket_name = qgetenv("WAYLAND_DISPLAY");
175 }
176 wl_compositor::init(display, 4);
177 wl_subcompositor::init(display, 1);
178
179#if QT_CONFIG(wayland_datadevice)
180 data_device_manager = new QtWayland::DataDeviceManager(q);
181#endif
183
184 wl_display_init_shm(display);
185
186 for (QWaylandCompositor::ShmFormat format : shmFormats)
187 wl_display_add_shm_format(display, wl_shm_format(format));
188
189 if (!socket_name.isEmpty()) {
190 if (wl_display_add_socket(display, socket_name.constData()))
191 qFatal("Fatal: Failed to open server socket: \"%s\". XDG_RUNTIME_DIR is: \"%s\"\n", socket_name.constData(), getenv("XDG_RUNTIME_DIR"));
192 } else {
193 const char *autoSocketName = wl_display_add_socket_auto(display);
194 if (!autoSocketName)
195 qFatal("Fatal: Failed to open default server socket. XDG_RUNTIME_DIR is: \"%s\"\n", getenv("XDG_RUNTIME_DIR"));
196 socket_name = autoSocketName;
197 emit q->socketNameChanged(socket_name);
198 }
199
201
202 loop = wl_display_get_event_loop(display);
203
204 int fd = wl_event_loop_get_fd(loop);
205
207 QObject::connect(sockNot, SIGNAL(activated(QSocketDescriptor)), q, SLOT(processWaylandEvents()));
208
210 QObject::connect(dispatcher, SIGNAL(aboutToBlock()), q, SLOT(processWaylandEvents()));
211
214 q,
215 &QWaylandCompositor::applicationStateChanged);
216
219
220 initialized = true;
221
222 for (const QPointer<QObject> &object : std::exchange(polish_objects, {})) {
223 if (object) {
224 QEvent polishEvent(QEvent::Polish);
225 QCoreApplication::sendEvent(object.data(), &polishEvent);
226 }
227 }
228
229 emit q->createdChanged();
230}
231
233{
234 // Take copies, since the lists will get modified as elements are deleted
235 const auto clientsToDelete = clients;
236 qDeleteAll(clientsToDelete);
237
238 const auto outputsToDelete = outputs;
239 qDeleteAll(outputsToDelete);
240
241#if QT_CONFIG(wayland_datadevice)
242 delete data_device_manager;
243#endif
244
245 // Some client buffer integrations need to clean up before the destroying the wl_display
247
248 if (ownsDisplay)
249 wl_display_destroy(display);
250}
251
253{
255
256 if (preInitialized)
257 return;
258
259 if (seats.empty())
260 seats.append(q->createSeat());
261
262 preInitialized = true;
263}
264
266{
268 q->surfaceAboutToBeDestroyed(surface);
269
270 delete surface;
271}
272
274{
275 if (!all_surfaces.removeOne(surface))
276 qWarning("%s Unexpected state. Cant find registered surface\n", Q_FUNC_INFO);
277}
278
280{
282 if (retainSelection)
283 q->retainedSelectionReceived(data);
284}
285
287{
288 if (initialized) {
290 } else {
291 polish_objects.push_back(object);
292 }
293}
294
296{
297 // Clear out any backlog of user-supplied external socket descriptors
298 for (int fd : std::as_const(externally_added_socket_fds)) {
299 if (wl_display_add_socket_fd(display, fd) != 0)
300 qWarning() << "Failed to integrate user-supplied socket fd into the Wayland event loop";
301 }
303}
304
305void QWaylandCompositorPrivate::compositor_create_surface(wl_compositor::Resource *resource, uint32_t id)
306{
308 QWaylandClient *client = QWaylandClient::fromWlClient(q, resource->client());
309 emit q->surfaceRequested(client, id, resource->version());
310#ifndef QT_NO_DEBUG
311 Q_ASSERT_X(!QWaylandSurfacePrivate::hasUninitializedSurface(), "QWaylandCompositor", QStringLiteral("Found uninitialized QWaylandSurface after emitting QWaylandCompositor::createSurface for id %1. All surfaces has to be initialized immediately after creation. See QWaylandSurface::initialize.").arg(id).toLocal8Bit().constData());
312#endif
313 struct wl_resource *surfResource = wl_client_get_object(client->client(), id);
314
315 QWaylandSurface *surface = nullptr;
316 if (surfResource) {
317 surface = QWaylandSurface::fromResource(surfResource);
318 } else {
319 surface = createDefaultSurface();
320 surface->initialize(q, client, id, resource->version());
321 }
322 Q_ASSERT(surface);
323 all_surfaces.append(surface);
324 emit q->surfaceCreated(surface);
325}
326
327void QWaylandCompositorPrivate::compositor_create_region(wl_compositor::Resource *resource, uint32_t id)
328{
329 new QtWayland::Region(resource->client(), id);
330}
331
332void QWaylandCompositorPrivate::subcompositor_get_subsurface(wl_subcompositor::Resource *resource, uint32_t id, wl_resource *surface, wl_resource *parent)
333{
335 QWaylandSurface *childSurface = QWaylandSurface::fromResource(surface);
337 QWaylandSurfacePrivate::get(childSurface)->initSubsurface(parentSurface, resource->client(), id, 1);
338 QWaylandSurfacePrivate::get(parentSurface)->subsurfaceChildren.append(childSurface);
339 emit q->subsurfaceChanged(childSurface, parentSurface);
340}
341
351
353{
354public:
355 void initializeHardware(wl_display *display) override;
356 QtWayland::ClientBuffer *createBufferFor(wl_resource *buffer) override;
357};
358
362
364{
365 if (wl_shm_buffer_get(buffer))
367 return nullptr;
368}
369
371{
372 client_buffer_integrations.prepend(new SharedMemoryClientBufferIntegration); // TODO: clean up the opengl dependency
373
374#if QT_CONFIG(opengl)
376 if (use_hw_integration_extension)
377 hw_integration.reset(new QtWayland::HardwareIntegration(q));
378
381
382 for (auto *integration : std::as_const(client_buffer_integrations))
383 integration->initializeHardware(display);
384#endif
385}
386
388{
389 for (QWaylandSeat *seat : std::as_const(seats))
390 seat->initialize();
391}
392
394{
395#if QT_CONFIG(opengl)
398 QStringList targetKeys;
399 QByteArray clientBufferIntegration = qgetenv("QT_WAYLAND_HARDWARE_INTEGRATION");
400 if (clientBufferIntegration.isEmpty())
401 clientBufferIntegration = qgetenv("QT_WAYLAND_CLIENT_BUFFER_INTEGRATION");
402
403 for (auto b : clientBufferIntegration.split(';')) {
405 if (keys.contains(s))
406 targetKeys.append(s);
407 }
408
409 if (targetKeys.isEmpty()) {
410 if (keys.contains(QString::fromLatin1("wayland-egl"))) {
411 targetKeys.append(QString::fromLatin1("wayland-egl"));
412 } else if (!keys.isEmpty()) {
413 targetKeys.append(keys.first());
414 }
415 }
416
417 QString hwIntegrationName;
418
419 for (auto targetKey : std::as_const(targetKeys)) {
420 auto *integration = QtWayland::ClientBufferIntegrationFactory::create(targetKey, QStringList());
421 if (integration) {
422 integration->setCompositor(q);
424 if (hwIntegrationName.isEmpty())
425 hwIntegrationName = targetKey;
426 }
427 }
428
429 if (hw_integration && !hwIntegrationName.isEmpty())
430 hw_integration->setClientBufferIntegrationName(hwIntegrationName);
431
432#endif
433}
434
436{
437#if QT_CONFIG(opengl)
440 QString targetKey;
441 QByteArray serverBufferIntegration = qgetenv("QT_WAYLAND_SERVER_BUFFER_INTEGRATION");
442 if (keys.contains(QString::fromLocal8Bit(serverBufferIntegration.constData()))) {
443 targetKey = QString::fromLocal8Bit(serverBufferIntegration.constData());
444 }
445 if (!targetKey.isEmpty()) {
446 server_buffer_integration.reset(QtWayland::ServerBufferIntegrationFactory::create(targetKey, QStringList()));
447 if (server_buffer_integration) {
448 qCDebug(qLcWaylandCompositorHardwareIntegration)
449 << "Loaded server buffer integration:" << targetKey;
450 if (!server_buffer_integration->initializeHardware(q)) {
451 qCWarning(qLcWaylandCompositorHardwareIntegration)
452 << "Failed to initialize hardware for server buffer integration:" << targetKey;
453 server_buffer_integration.reset();
454 }
455 } else {
456 qCWarning(qLcWaylandCompositorHardwareIntegration)
457 << "Failed to load server buffer integration:" << targetKey;
458 }
459 }
460
461 if (server_buffer_integration && hw_integration)
462 hw_integration->setServerBufferIntegrationName(targetKey);
463#endif
464}
465
467{
468 QWaylandSeat *dev = nullptr;
469 for (int i = 0; i < seats.size(); i++) {
470 QWaylandSeat *candidate = seats.at(i);
471 if (candidate->isOwner(inputEvent)) {
472 dev = candidate;
473 break;
474 }
475 }
476 return dev;
477}
478
549QWaylandCompositor::QWaylandCompositor(QObject *parent)
551{
552}
553
558QWaylandCompositor::QWaylandCompositor(QWaylandCompositorPrivate &dptr, QObject *parent)
559 : QWaylandObject(dptr, parent)
560{
561}
562
566QWaylandCompositor::~QWaylandCompositor()
567{
568}
569
574void QWaylandCompositor::create()
575{
577 d->preInit();
578 d->init();
579}
580
594bool QWaylandCompositor::isCreated() const
595{
596 Q_D(const QWaylandCompositor);
597 return d->initialized;
598}
599
621void QWaylandCompositor::setSocketName(const QByteArray &name)
622{
624
625 if (d->socket_name == name)
626 return;
627
628 if (d->initialized) {
629 qWarning("%s: Changing socket name after initializing the compositor is not supported.\n", Q_FUNC_INFO);
630 return;
631 }
632
633 d->socket_name = name;
634 emit socketNameChanged(name);
635}
636
637QByteArray QWaylandCompositor::socketName() const
638{
639 Q_D(const QWaylandCompositor);
640 return d->socket_name;
641}
642
671void QWaylandCompositor::addSocketDescriptor(int fd)
672{
674 d->externally_added_socket_fds.append(fd);
675 if (isCreated())
676 d->connectToExternalSockets();
677}
678
682struct wl_display *QWaylandCompositor::display() const
683{
684 Q_D(const QWaylandCompositor);
685 return d->display;
686}
687
691uint32_t QWaylandCompositor::nextSerial()
692{
694 return wl_display_next_serial(d->display);
695}
696
700QList<QWaylandClient *>QWaylandCompositor::clients() const
701{
702 Q_D(const QWaylandCompositor);
703 return d->clients;
704}
705
715void QWaylandCompositor::destroyClientForSurface(QWaylandSurface *surface)
716{
717 destroyClient(surface->client());
718}
719
729void QWaylandCompositor::destroyClient(QWaylandClient *client)
730{
731 if (!client)
732 return;
733
735 if (wmExtension)
736 wmExtension->sendQuitMessage(client);
737
738 wl_client_destroy(client->client());
739}
740
744QList<QWaylandSurface *> QWaylandCompositor::surfacesForClient(QWaylandClient* client) const
745{
746 Q_D(const QWaylandCompositor);
747 QList<QWaylandSurface *> surfs;
748 for (QWaylandSurface *surface : d->all_surfaces) {
749 if (surface->client() == client)
750 surfs.append(surface);
751 }
752 return surfs;
753}
754
758QList<QWaylandSurface *> QWaylandCompositor::surfaces() const
759{
760 Q_D(const QWaylandCompositor);
761 return d->all_surfaces;
762}
763
767QWaylandOutput *QWaylandCompositor::outputFor(QWindow *window) const
768{
769 Q_D(const QWaylandCompositor);
770 for (QWaylandOutput *output : d->outputs) {
771 if (output->window() == window)
772 return output;
773 }
774
775 return nullptr;
776}
777
799QWaylandOutput *QWaylandCompositor::defaultOutput() const
800{
801 Q_D(const QWaylandCompositor);
802 return d->defaultOutput();
803}
804
805void QWaylandCompositor::setDefaultOutput(QWaylandOutput *output)
806{
808 if (d->outputs.size() && d->outputs.first() == output)
809 return;
810 bool alreadyAdded = d->outputs.removeOne(output);
811 d->outputs.prepend(output);
812 emit defaultOutputChanged();
813 if (!alreadyAdded)
814 emit outputAdded(output);
815}
816
820QList<QWaylandOutput *> QWaylandCompositor::outputs() const
821{
822 Q_D(const QWaylandCompositor);
823 return d->outputs;
824}
825
829uint QWaylandCompositor::currentTimeMsecs() const
830{
831 Q_D(const QWaylandCompositor);
832 return d->timer.elapsed();
833}
834
838void QWaylandCompositor::processWaylandEvents()
839{
841 int ret = wl_event_loop_dispatch(d->loop, 0);
842 if (ret)
843 fprintf(stderr, "wl_event_loop_dispatch error: %d\n", ret);
844 wl_display_flush_clients(d->display);
845}
846
850QWaylandSeat *QWaylandCompositor::createSeat()
851{
852 return new QWaylandSeat(this);
853}
854
858QWaylandPointer *QWaylandCompositor::createPointerDevice(QWaylandSeat *seat)
859{
860 return new QWaylandPointer(seat);
861}
862
866QWaylandKeyboard *QWaylandCompositor::createKeyboardDevice(QWaylandSeat *seat)
867{
868 return new QWaylandKeyboard(seat);
869}
870
874QWaylandTouch *QWaylandCompositor::createTouchDevice(QWaylandSeat *seat)
875{
876 return new QWaylandTouch(seat);
877}
878
890void QWaylandCompositor::setRetainedSelectionEnabled(bool enabled)
891{
893
894 if (d->retainSelection == enabled)
895 return;
896
897 d->retainSelection = enabled;
898 emit retainedSelectionChanged(enabled);
899}
900
901bool QWaylandCompositor::retainedSelectionEnabled() const
902{
903 Q_D(const QWaylandCompositor);
904 return d->retainSelection;
905}
906
910void QWaylandCompositor::retainedSelectionReceived(QMimeData *)
911{
912}
913
917void QWaylandCompositor::overrideSelection(const QMimeData *data)
918{
920#if QT_CONFIG(wayland_datadevice)
921 d->data_device_manager->overrideSelection(*data);
922#endif
923}
924
938QWaylandSeat *QWaylandCompositor::defaultSeat() const
939{
940 Q_D(const QWaylandCompositor);
941 if (d->seats.size())
942 return d->seats.first();
943 return nullptr;
944}
945
950QWaylandSeat *QWaylandCompositor::seatFor(QInputEvent *inputEvent)
951{
953 return d->seatFor(inputEvent);
954}
955
973bool QWaylandCompositor::useHardwareIntegrationExtension() const
974{
975#if QT_CONFIG(opengl)
976 Q_D(const QWaylandCompositor);
977 return d->use_hw_integration_extension;
978#else
979 return false;
980#endif
981}
982
983void QWaylandCompositor::setUseHardwareIntegrationExtension(bool use)
984{
985#if QT_CONFIG(opengl)
987 if (use == d->use_hw_integration_extension)
988 return;
989
990 if (d->initialized)
991 qWarning("Setting QWaylandCompositor::useHardwareIntegrationExtension after initialization has no effect");
992
993 d->use_hw_integration_extension = use;
994 useHardwareIntegrationExtensionChanged();
995#else
996 if (use)
997 qWarning() << "Hardware integration not supported without OpenGL support";
998#endif
999}
1000
1010void QWaylandCompositor::grabSurface(QWaylandSurfaceGrabber *grabber, const QWaylandBufferRef &buffer)
1011{
1012 if (buffer.isSharedMemory()) {
1013 emit grabber->success(buffer.image());
1014 } else {
1015#if QT_CONFIG(opengl)
1017 QOpenGLFramebufferObject fbo(buffer.size());
1018 fbo.bind();
1019 QOpenGLTextureBlitter blitter;
1020 blitter.create();
1021
1022
1023 glViewport(0, 0, buffer.size().width(), buffer.size().height());
1024
1025 QOpenGLTextureBlitter::Origin surfaceOrigin =
1029
1030 auto texture = buffer.toOpenGLTexture();
1031 blitter.bind(texture->target());
1032 blitter.blit(texture->textureId(), QMatrix4x4(), surfaceOrigin);
1033 blitter.release();
1034
1035 emit grabber->success(fbo.toImage());
1036 } else
1037#endif
1039 }
1040}
1041
1072void QWaylandCompositor::setAdditionalShmFormats(const QVector<ShmFormat> &additionalShmFormats)
1073{
1074 Q_D(QWaylandCompositor);
1075 if (d->initialized)
1076 qCWarning(qLcWaylandCompositorHardwareIntegration) << "Setting QWaylandCompositor::additionalShmFormats after initialization has no effect";
1077
1078 d->shmFormats = additionalShmFormats;
1079 emit additionalShmFormatsChanged();
1080}
1081
1082QVector<QWaylandCompositor::ShmFormat> QWaylandCompositor::additionalShmFormats() const
1083{
1084 Q_D(const QWaylandCompositor);
1085 return d->shmFormats;
1086}
1087
1088void QWaylandCompositor::applicationStateChanged(Qt::ApplicationState state)
1089{
1090#if QT_CONFIG(xkbcommon)
1092 auto *seat = defaultSeat();
1093 if (seat != nullptr) {
1094 QWaylandKeyboardPrivate *keyb = QWaylandKeyboardPrivate::get(seat->keyboard());
1095 keyb->resetKeyboardState();
1096 }
1097 }
1098#else
1099 Q_UNUSED(state);
1100#endif
1101}
1102
1104
1105#include "moc_qwaylandcompositor.cpp"
\inmodule QtCore
Definition qbytearray.h:57
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
Definition qbytearray.h:124
QList< QByteArray > split(char sep) const
Splits the byte array into subarrays wherever sep occurs, and returns the list of those arrays.
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
Definition qbytearray.h:107
static QAbstractEventDispatcher * eventDispatcher
static bool sendEvent(QObject *receiver, QEvent *event)
Sends event event directly to receiver receiver, using the notify() function.
static QCoreApplication * instance() noexcept
Returns a pointer to the application's QCoreApplication (or QGuiApplication/QApplication) instance.
static void postEvent(QObject *receiver, QEvent *event, int priority=Qt::NormalEventPriority)
void start() noexcept
\typealias QElapsedTimer::Duration Synonym for std::chrono::nanoseconds.
\inmodule QtCore
Definition qcoreevent.h:45
@ KeyPress
Definition qcoreevent.h:64
\macro qGuiApp
static QPlatformNativeInterface * platformNativeInterface()
void applicationStateChanged(Qt::ApplicationState state)
QString platformName
The name of the underlying platform plugin.
\inmodule QtGui
Definition qevent.h:49
qsizetype size() const noexcept
Definition qlist.h:397
bool empty() const noexcept
Definition qlist.h:685
bool removeOne(const AT &t)
Definition qlist.h:598
const_reference at(qsizetype i) const noexcept
Definition qlist.h:446
void prepend(rvalue_ref t)
Definition qlist.h:473
void append(parameter_type t)
Definition qlist.h:458
void clear()
Definition qlist.h:434
The QMatrix4x4 class represents a 4x4 transformation matrix in 3D space.
Definition qmatrix4x4.h:25
\inmodule QtCore
Definition qmimedata.h:16
QObject * parent
Definition qobject.h:73
\inmodule QtCore
Definition qobject.h:103
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
static QOpenGLContext * currentContext()
Returns the last context which called makeCurrent in the current thread, or \nullptr,...
The QOpenGLFramebufferObject class encapsulates an OpenGL framebuffer object.
The QOpenGLTextureBlitter class provides a convenient way to draw textured quads via OpenGL.
bool create()
Initializes the graphics resources used by the blitter.
Origin
\value OriginBottomLeft Indicates that the data in the texture follows the OpenGL convention of coord...
void blit(GLuint texture, const QMatrix4x4 &targetTransform, Origin sourceOrigin)
Performs the blit with the source texture texture.
void release()
Unbinds the graphics resources used by the blitter.
void bind(GLenum target=GL_TEXTURE_2D)
Binds the graphics resources used by the blitter.
T * data() const noexcept
Returns the value of the pointer referenced by this object.
void reset(T *other=nullptr) noexcept(noexcept(Cleanup::cleanup(std::declval< T * >())))
Deletes the existing object it is pointing to (if any), and sets its pointer to other.
\inmodule QtCore
\inmodule QtCore
static QString writableLocation(StandardLocation type)
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5871
static QString fromLocal8Bit(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5949
\inmodule QtWaylandCompositor
\qmltype WaylandClient \instantiates QWaylandClient \inqmlmodule QtWayland.Compositor
static QWaylandClient * fromWlClient(QWaylandCompositor *compositor, wl_client *wlClient)
Returns the QWaylandClient corresponding to the Wayland client wlClient and compositor.
wl_client * client() const
Returns the Wayland client of this QWaylandClient.
static QWaylandQtWindowManager * findIn(QWaylandObject *container)
If any instance of the interface has been registered with container, this is returned.
QList< QWaylandOutput * > outputs
QList< QWaylandSeat * > seats
void subcompositor_get_subsurface(wl_subcompositor::Resource *resource, uint32_t id, struct ::wl_resource *surface, struct ::wl_resource *parent) override
void addPolishObject(QObject *object)
virtual QWaylandSeat * seatFor(QInputEvent *inputEvent)
void compositor_create_surface(wl_compositor::Resource *resource, uint32_t id) override
QList< QWaylandClient * > clients
QList< QtWayland::ClientBufferIntegration * > client_buffer_integrations
void feedRetainedSelectionData(QMimeData *data)
QtWayland::ServerBufferIntegration * serverBufferIntegration() const
void destroySurface(QWaylandSurface *surface)
QWaylandCompositorPrivate(QWaylandCompositor *compositor)
std::vector< QPointer< QObject > > polish_objects
void unregisterSurface(QWaylandSurface *surface)
QtWayland::BufferManager * buffer_manager
QList< QWaylandSurface * > all_surfaces
QVector< QWaylandCompositor::ShmFormat > shmFormats
QScopedPointer< QWindowSystemEventHandler > eventHandler
virtual QWaylandSurface * createDefaultSurface()
void compositor_create_region(wl_compositor::Resource *resource, uint32_t id) override
\qmltype WaylandCompositor \instantiates QWaylandCompositor \inqmlmodule QtWayland....
static QWaylandKeyboardPrivate * get(QWaylandKeyboard *keyboard)
\inmodule QtWaylandCompositor
\inmodule QtWaylandCompositor
\qmltype WaylandOutput \instantiates QWaylandOutput \inqmlmodule QtWayland.Compositor
\inmodule QtWaylandCompositor
\qmltype WaylandSeat \instantiates QWaylandSeat \inqmlmodule QtWayland.Compositor
virtual bool isOwner(QInputEvent *inputEvent) const
\inmodule QtWaylandCompositor
static bool hasUninitializedSurface()
static QWaylandSurfacePrivate * get(QWaylandSurface *surface)
\qmltype WaylandSurface \instantiates QWaylandSurface \inqmlmodule QtWayland.Compositor
static QWaylandSurface * fromResource(::wl_resource *resource)
Returns the QWaylandSurface corresponding to the Wayland resource resource.
QWaylandClient * client
\qmlproperty WaylandClient QtWayland.Compositor::WaylandSurface::client
Q_INVOKABLE void initialize(QWaylandCompositor *compositor, QWaylandClient *client, uint id, int version)
\qmlmethod void QtWayland.Compositor::WaylandSurface::initialize(WaylandCompositor compositor,...
\inmodule QtWaylandCompositor
virtual bool sendEvent(QWindowSystemInterfacePrivate::WindowSystemEvent *event)
static void installWindowSystemEventHandler(QWindowSystemEventHandler *handler)
\inmodule QtGui
Definition qwindow.h:63
static QString lookupString(struct xkb_state *state, xkb_keycode_t code)
static Qt::KeyboardModifiers modifiers(struct xkb_state *state, xkb_keysym_t keysym=XKB_KEY_VoidSymbol)
static int keysymToQtKey(xkb_keysym_t keysym, Qt::KeyboardModifiers modifiers)
static ClientBufferIntegration * create(const QString &name, const QStringList &args)
static ServerBufferIntegration * create(const QString &name, const QStringList &args)
void handleKeyEvent(QWindowSystemInterfacePrivate::KeyEvent *ke)
bool sendEvent(QWindowSystemInterfacePrivate::WindowSystemEvent *e) override
WindowSystemEventHandler(QWaylandCompositor *c)
QtWayland::ClientBuffer * createBufferFor(wl_resource *buffer) override
void initializeHardware(wl_display *display) override
EGLImageKHR int int EGLuint64KHR * modifiers
#define this
Definition dialogs.cpp:9
QString text
qDeleteAll(list.begin(), list.end())
QList< QVariant > arguments
else opt state
[0]
struct wl_display * display
Definition linuxdmabuf.h:41
Combined button and popup list for selecting options.
ApplicationState
Definition qnamespace.h:262
@ ApplicationInactive
Definition qnamespace.h:265
#define Q_FUNC_INFO
QList< QString > QStringList
Constructs a string list that contains the given string, str.
#define qWarning
Definition qlogging.h:166
#define qFatal
Definition qlogging.h:168
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
return ret
#define SLOT(a)
Definition qobjectdefs.h:52
#define SIGNAL(a)
Definition qobjectdefs.h:53
static QOpenGLCompositor * compositor
GLboolean GLboolean GLboolean b
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLenum GLuint buffer
GLenum GLuint texture
GLenum GLuint GLintptr offset
GLuint64 GLenum GLint fd
GLuint name
GLint GLsizei GLsizei GLenum format
GLdouble s
[6]
Definition qopenglext.h:235
const GLubyte * c
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define Q_ASSERT_X(cond, x, msg)
Definition qrandom.cpp:48
SSL_CTX int void * arg
static char * toLocal8Bit(char *out, QStringView in, QStringConverter::State *state)
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define QStringLiteral(str)
Q_CORE_EXPORT QByteArray qgetenv(const char *varName)
#define emit
#define Q_UNUSED(x)
unsigned int uint
Definition qtypes.h:34
QT_BEGIN_NAMESPACE typedef uchar * output
#define enabled
QStringList keys
aWidget window() -> setWindowTitle("New Window Title")
[2]
qsizetype indexOf(const AT &t, qsizetype from=0) const noexcept
Definition qlist.h:962