Qt 6.x
The Qt SDK
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
45#include <QtGui/QDesktopServices>
46#include <QtGui/QScreen>
47
48#include <QtGui/qpa/qwindowsysteminterface_p.h>
49#include <QtGui/qpa/qplatformnativeinterface.h>
50#include <QtGui/private/qguiapplication_p.h>
51
52#if QT_CONFIG(opengl)
53# include <QOpenGLTextureBlitter>
54# include <QOpenGLTexture>
55# include <QOpenGLContext>
56# include <QOpenGLFramebufferObject>
57# include <QMatrix4x4>
58#endif
59
61
62Q_LOGGING_CATEGORY(qLcWaylandCompositor, "qt.waylandcompositor")
63Q_LOGGING_CATEGORY(qLcWaylandCompositorHardwareIntegration, "qt.waylandcompositor.hardwareintegration")
64Q_LOGGING_CATEGORY(qLcWaylandCompositorInputMethods, "qt.waylandcompositor.inputmethods")
65#if QT_WAYLAND_TEXT_INPUT_V4_WIP
66Q_LOGGING_CATEGORY(qLcWaylandCompositorTextInput, "qt.waylandcompositor.textinput")
67#endif // QT_WAYLAND_TEXT_INPUT_V4_WIP
68
69namespace QtWayland {
70
72{
73public:
76 {
79 handleKeyEvent(keyEvent);
80 } else {
82 }
83 return true;
84 }
85
87 {
88 auto *seat = compositor->defaultSeat();
89 if (!seat)
90 return;
91
93
94#if defined(Q_OS_QNX)
95 // The QNX platform plugin delivers scan codes that haven't been adjusted to be
96 // xkbcommon compatible. xkbcommon requires that the scan codes be bumped up by
97 // 8 because that's how evdev/XKB deliver scan codes. You might think that it
98 // would've been better to remove this (odd) requirement from xkbcommon on QNX
99 // but it turns out that conforming to it has much less impact.
100 static int offset = QGuiApplication::platformName() == QStringLiteral("qnx") ? 8 : 0;
101 ke->nativeScanCode += offset;
102#endif
103 uint32_t code = ke->nativeScanCode;
104 if (code == 0)
105 code = seat->keyboard()->keyToScanCode(ke->key);
106 bool isDown = ke->keyType == QEvent::KeyPress;
107
108#if QT_CONFIG(xkbcommon)
109 xkb_state *xkbState = keyb->xkbState();
110
111 const xkb_keysym_t sym = xkb_state_key_get_one_sym(xkbState, code);
112 Qt::KeyboardModifiers modifiers = QXkbCommon::modifiers(xkbState, sym);
113 int qtkey = QXkbCommon::keysymToQtKey(sym, modifiers, xkbState, code);
114 QString text = QXkbCommon::lookupString(xkbState, code);
115
116 ke->key = qtkey;
117 ke->modifiers = modifiers;
118 ke->nativeVirtualKey = sym;
119 ke->nativeModifiers = keyb->xkbModsMask();
120 ke->unicode = text;
121#endif
122 if (!ke->repeat)
123 keyb->keyEvent(code, isDown ? WL_KEYBOARD_KEY_STATE_PRESSED : WL_KEYBOARD_KEY_STATE_RELEASED);
124
126
127 if (!ke->repeat) {
128 keyb->maybeUpdateKeymap();
129 keyb->updateModifierState(code, isDown ? WL_KEYBOARD_KEY_STATE_PRESSED : WL_KEYBOARD_KEY_STATE_RELEASED);
130 }
131 }
132
134};
135
136} // namespace
137
139{
141 display = static_cast<wl_display*>(QGuiApplication::platformNativeInterface()->nativeResourceForIntegration("server_wl_display"));
142
143 if (!display) {
144 display = wl_display_create();
145 ownsDisplay = true;
146 }
147
149 timer.start();
150
152
153#if QT_CONFIG(xkbcommon)
154 mXkbContext.reset(xkb_context_new(XKB_CONTEXT_NO_FLAGS));
155 if (!mXkbContext) {
156 qWarning("Failed to create a XKB context: keymap will not be supported");
157 return;
158 }
159#endif
160}
161
163{
166
167 if (socket_name.isEmpty()) {
168 const int socketArg = arguments.indexOf(QLatin1String("--wayland-socket-name"));
169 if (socketArg != -1 && socketArg + 1 < arguments.size())
170 socket_name = arguments.at(socketArg + 1).toLocal8Bit();
171 }
172 wl_compositor::init(display, 4);
173 wl_subcompositor::init(display, 1);
174
175#if QT_CONFIG(wayland_datadevice)
176 data_device_manager = new QtWayland::DataDeviceManager(q);
177#endif
179
180 wl_display_init_shm(display);
181
182 for (QWaylandCompositor::ShmFormat format : shmFormats)
183 wl_display_add_shm_format(display, wl_shm_format(format));
184
185 if (!socket_name.isEmpty()) {
186 if (wl_display_add_socket(display, socket_name.constData()))
187 qFatal("Fatal: Failed to open server socket: \"%s\". XDG_RUNTIME_DIR is: \"%s\"\n", socket_name.constData(), getenv("XDG_RUNTIME_DIR"));
188 } else {
189 const char *autoSocketName = wl_display_add_socket_auto(display);
190 if (!autoSocketName)
191 qFatal("Fatal: Failed to open default server socket. XDG_RUNTIME_DIR is: \"%s\"\n", getenv("XDG_RUNTIME_DIR"));
192 socket_name = autoSocketName;
193 emit q->socketNameChanged(socket_name);
194 }
195
197
198 loop = wl_display_get_event_loop(display);
199
200 int fd = wl_event_loop_get_fd(loop);
201
203 QObject::connect(sockNot, SIGNAL(activated(QSocketDescriptor)), q, SLOT(processWaylandEvents()));
204
206 QObject::connect(dispatcher, SIGNAL(aboutToBlock()), q, SLOT(processWaylandEvents()));
207
210 q,
211 &QWaylandCompositor::applicationStateChanged);
212
215
216 initialized = true;
217
218 for (const QPointer<QObject> &object : std::exchange(polish_objects, {})) {
219 if (object) {
220 QEvent polishEvent(QEvent::Polish);
221 QCoreApplication::sendEvent(object.data(), &polishEvent);
222 }
223 }
224
225 emit q->createdChanged();
226}
227
229{
230 // Take copies, since the lists will get modified as elements are deleted
231 const auto clientsToDelete = clients;
232 qDeleteAll(clientsToDelete);
233
234 const auto outputsToDelete = outputs;
235 qDeleteAll(outputsToDelete);
236
237#if QT_CONFIG(wayland_datadevice)
238 delete data_device_manager;
239#endif
240
241 // Some client buffer integrations need to clean up before the destroying the wl_display
243
244 if (ownsDisplay)
245 wl_display_destroy(display);
246}
247
249{
251
252 if (preInitialized)
253 return;
254
255 if (seats.empty())
256 seats.append(q->createSeat());
257
258 preInitialized = true;
259}
260
262{
264 q->surfaceAboutToBeDestroyed(surface);
265
266 delete surface;
267}
268
270{
271 if (!all_surfaces.removeOne(surface))
272 qWarning("%s Unexpected state. Cant find registered surface\n", Q_FUNC_INFO);
273}
274
276{
278 if (retainSelection)
279 q->retainedSelectionReceived(data);
280}
281
283{
284 if (initialized) {
286 } else {
287 polish_objects.push_back(object);
288 }
289}
290
292{
293 // Clear out any backlog of user-supplied external socket descriptors
294 for (int fd : std::as_const(externally_added_socket_fds)) {
295 if (wl_display_add_socket_fd(display, fd) != 0)
296 qWarning() << "Failed to integrate user-supplied socket fd into the Wayland event loop";
297 }
299}
300
301void QWaylandCompositorPrivate::compositor_create_surface(wl_compositor::Resource *resource, uint32_t id)
302{
304 QWaylandClient *client = QWaylandClient::fromWlClient(q, resource->client());
305 emit q->surfaceRequested(client, id, resource->version());
306#ifndef QT_NO_DEBUG
307 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());
308#endif
309 struct wl_resource *surfResource = wl_client_get_object(client->client(), id);
310
311 QWaylandSurface *surface = nullptr;
312 if (surfResource) {
313 surface = QWaylandSurface::fromResource(surfResource);
314 } else {
315 surface = createDefaultSurface();
316 surface->initialize(q, client, id, resource->version());
317 }
318 Q_ASSERT(surface);
319 all_surfaces.append(surface);
320 emit q->surfaceCreated(surface);
321}
322
323void QWaylandCompositorPrivate::compositor_create_region(wl_compositor::Resource *resource, uint32_t id)
324{
325 new QtWayland::Region(resource->client(), id);
326}
327
328void QWaylandCompositorPrivate::subcompositor_get_subsurface(wl_subcompositor::Resource *resource, uint32_t id, wl_resource *surface, wl_resource *parent)
329{
331 QWaylandSurface *childSurface = QWaylandSurface::fromResource(surface);
333 QWaylandSurfacePrivate::get(childSurface)->initSubsurface(parentSurface, resource->client(), id, 1);
334 QWaylandSurfacePrivate::get(parentSurface)->subsurfaceChildren.append(childSurface);
335 emit q->subsurfaceChanged(childSurface, parentSurface);
336}
337
344{
345 return new QWaylandSurface();
346}
347
349{
350public:
351 void initializeHardware(wl_display *display) override;
352 QtWayland::ClientBuffer *createBufferFor(wl_resource *buffer) override;
353};
354
356{
357}
358
360{
361 if (wl_shm_buffer_get(buffer))
363 return nullptr;
364}
365
367{
368 client_buffer_integrations.prepend(new SharedMemoryClientBufferIntegration); // TODO: clean up the opengl dependency
369
370#if QT_CONFIG(opengl)
372 if (use_hw_integration_extension)
373 hw_integration.reset(new QtWayland::HardwareIntegration(q));
374
377
378 for (auto *integration : std::as_const(client_buffer_integrations))
379 integration->initializeHardware(display);
380#endif
381}
382
384{
385 for (QWaylandSeat *seat : std::as_const(seats))
386 seat->initialize();
387}
388
390{
391#if QT_CONFIG(opengl)
394 QStringList targetKeys;
395 QByteArray clientBufferIntegration = qgetenv("QT_WAYLAND_HARDWARE_INTEGRATION");
396 if (clientBufferIntegration.isEmpty())
397 clientBufferIntegration = qgetenv("QT_WAYLAND_CLIENT_BUFFER_INTEGRATION");
398
399 for (auto b : clientBufferIntegration.split(';')) {
401 if (keys.contains(s))
402 targetKeys.append(s);
403 }
404
405 if (targetKeys.isEmpty()) {
406 if (keys.contains(QString::fromLatin1("wayland-egl"))) {
407 targetKeys.append(QString::fromLatin1("wayland-egl"));
408 } else if (!keys.isEmpty()) {
409 targetKeys.append(keys.first());
410 }
411 }
412
413 QString hwIntegrationName;
414
415 for (auto targetKey : std::as_const(targetKeys)) {
416 auto *integration = QtWayland::ClientBufferIntegrationFactory::create(targetKey, QStringList());
417 if (integration) {
418 integration->setCompositor(q);
420 if (hwIntegrationName.isEmpty())
421 hwIntegrationName = targetKey;
422 }
423 }
424
425 if (hw_integration && !hwIntegrationName.isEmpty())
426 hw_integration->setClientBufferIntegrationName(hwIntegrationName);
427
428#endif
429}
430
432{
433#if QT_CONFIG(opengl)
436 QString targetKey;
437 QByteArray serverBufferIntegration = qgetenv("QT_WAYLAND_SERVER_BUFFER_INTEGRATION");
438 if (keys.contains(QString::fromLocal8Bit(serverBufferIntegration.constData()))) {
439 targetKey = QString::fromLocal8Bit(serverBufferIntegration.constData());
440 }
441 if (!targetKey.isEmpty()) {
442 server_buffer_integration.reset(QtWayland::ServerBufferIntegrationFactory::create(targetKey, QStringList()));
443 if (server_buffer_integration) {
444 qCDebug(qLcWaylandCompositorHardwareIntegration)
445 << "Loaded server buffer integration:" << targetKey;
446 if (!server_buffer_integration->initializeHardware(q)) {
447 qCWarning(qLcWaylandCompositorHardwareIntegration)
448 << "Failed to initialize hardware for server buffer integration:" << targetKey;
449 server_buffer_integration.reset();
450 }
451 } else {
452 qCWarning(qLcWaylandCompositorHardwareIntegration)
453 << "Failed to load server buffer integration:" << targetKey;
454 }
455 }
456
457 if (server_buffer_integration && hw_integration)
458 hw_integration->setServerBufferIntegrationName(targetKey);
459#endif
460}
461
463{
464 QWaylandSeat *dev = nullptr;
465 for (int i = 0; i < seats.size(); i++) {
466 QWaylandSeat *candidate = seats.at(i);
467 if (candidate->isOwner(inputEvent)) {
468 dev = candidate;
469 break;
470 }
471 }
472 return dev;
473}
474
545QWaylandCompositor::QWaylandCompositor(QObject *parent)
547{
548}
549
554QWaylandCompositor::QWaylandCompositor(QWaylandCompositorPrivate &dptr, QObject *parent)
555 : QWaylandObject(dptr, parent)
556{
557}
558
562QWaylandCompositor::~QWaylandCompositor()
563{
564}
565
570void QWaylandCompositor::create()
571{
573 d->preInit();
574 d->init();
575}
576
590bool QWaylandCompositor::isCreated() const
591{
592 Q_D(const QWaylandCompositor);
593 return d->initialized;
594}
595
617void QWaylandCompositor::setSocketName(const QByteArray &name)
618{
620
621 if (d->socket_name == name)
622 return;
623
624 if (d->initialized) {
625 qWarning("%s: Changing socket name after initializing the compositor is not supported.\n", Q_FUNC_INFO);
626 return;
627 }
628
629 d->socket_name = name;
630 emit socketNameChanged(name);
631}
632
633QByteArray QWaylandCompositor::socketName() const
634{
635 Q_D(const QWaylandCompositor);
636 return d->socket_name;
637}
638
667void QWaylandCompositor::addSocketDescriptor(int fd)
668{
670 d->externally_added_socket_fds.append(fd);
671 if (isCreated())
672 d->connectToExternalSockets();
673}
674
678struct wl_display *QWaylandCompositor::display() const
679{
680 Q_D(const QWaylandCompositor);
681 return d->display;
682}
683
687uint32_t QWaylandCompositor::nextSerial()
688{
690 return wl_display_next_serial(d->display);
691}
692
696QList<QWaylandClient *>QWaylandCompositor::clients() const
697{
698 Q_D(const QWaylandCompositor);
699 return d->clients;
700}
701
711void QWaylandCompositor::destroyClientForSurface(QWaylandSurface *surface)
712{
713 destroyClient(surface->client());
714}
715
725void QWaylandCompositor::destroyClient(QWaylandClient *client)
726{
727 if (!client)
728 return;
729
731 if (wmExtension)
732 wmExtension->sendQuitMessage(client);
733
734 wl_client_destroy(client->client());
735}
736
740QList<QWaylandSurface *> QWaylandCompositor::surfacesForClient(QWaylandClient* client) const
741{
742 Q_D(const QWaylandCompositor);
744 for (QWaylandSurface *surface : d->all_surfaces) {
745 if (surface->client() == client)
746 surfs.append(surface);
747 }
748 return surfs;
749}
750
754QList<QWaylandSurface *> QWaylandCompositor::surfaces() const
755{
756 Q_D(const QWaylandCompositor);
757 return d->all_surfaces;
758}
759
763QWaylandOutput *QWaylandCompositor::outputFor(QWindow *window) const
764{
765 Q_D(const QWaylandCompositor);
766 for (QWaylandOutput *output : d->outputs) {
767 if (output->window() == window)
768 return output;
769 }
770
771 return nullptr;
772}
773
795QWaylandOutput *QWaylandCompositor::defaultOutput() const
796{
797 Q_D(const QWaylandCompositor);
798 return d->defaultOutput();
799}
800
801void QWaylandCompositor::setDefaultOutput(QWaylandOutput *output)
802{
804 if (d->outputs.size() && d->outputs.first() == output)
805 return;
806 bool alreadyAdded = d->outputs.removeOne(output);
807 d->outputs.prepend(output);
808 emit defaultOutputChanged();
809 if (!alreadyAdded)
810 emit outputAdded(output);
811}
812
816QList<QWaylandOutput *> QWaylandCompositor::outputs() const
817{
818 Q_D(const QWaylandCompositor);
819 return d->outputs;
820}
821
825uint QWaylandCompositor::currentTimeMsecs() const
826{
827 Q_D(const QWaylandCompositor);
828 return d->timer.elapsed();
829}
830
834void QWaylandCompositor::processWaylandEvents()
835{
837 int ret = wl_event_loop_dispatch(d->loop, 0);
838 if (ret)
839 fprintf(stderr, "wl_event_loop_dispatch error: %d\n", ret);
840 wl_display_flush_clients(d->display);
841}
842
846QWaylandSeat *QWaylandCompositor::createSeat()
847{
848 return new QWaylandSeat(this);
849}
850
854QWaylandPointer *QWaylandCompositor::createPointerDevice(QWaylandSeat *seat)
855{
856 return new QWaylandPointer(seat);
857}
858
862QWaylandKeyboard *QWaylandCompositor::createKeyboardDevice(QWaylandSeat *seat)
863{
864 return new QWaylandKeyboard(seat);
865}
866
870QWaylandTouch *QWaylandCompositor::createTouchDevice(QWaylandSeat *seat)
871{
872 return new QWaylandTouch(seat);
873}
874
886void QWaylandCompositor::setRetainedSelectionEnabled(bool enabled)
887{
889
890 if (d->retainSelection == enabled)
891 return;
892
893 d->retainSelection = enabled;
894 emit retainedSelectionChanged(enabled);
895}
896
897bool QWaylandCompositor::retainedSelectionEnabled() const
898{
899 Q_D(const QWaylandCompositor);
900 return d->retainSelection;
901}
902
906void QWaylandCompositor::retainedSelectionReceived(QMimeData *)
907{
908}
909
913void QWaylandCompositor::overrideSelection(const QMimeData *data)
914{
916#if QT_CONFIG(wayland_datadevice)
917 d->data_device_manager->overrideSelection(*data);
918#endif
919}
920
934QWaylandSeat *QWaylandCompositor::defaultSeat() const
935{
936 Q_D(const QWaylandCompositor);
937 if (d->seats.size())
938 return d->seats.first();
939 return nullptr;
940}
941
946QWaylandSeat *QWaylandCompositor::seatFor(QInputEvent *inputEvent)
947{
949 return d->seatFor(inputEvent);
950}
951
969bool QWaylandCompositor::useHardwareIntegrationExtension() const
970{
971#if QT_CONFIG(opengl)
972 Q_D(const QWaylandCompositor);
973 return d->use_hw_integration_extension;
974#else
975 return false;
976#endif
977}
978
979void QWaylandCompositor::setUseHardwareIntegrationExtension(bool use)
980{
981#if QT_CONFIG(opengl)
983 if (use == d->use_hw_integration_extension)
984 return;
985
986 if (d->initialized)
987 qWarning("Setting QWaylandCompositor::useHardwareIntegrationExtension after initialization has no effect");
988
989 d->use_hw_integration_extension = use;
990 useHardwareIntegrationExtensionChanged();
991#else
992 if (use)
993 qWarning() << "Hardware integration not supported without OpenGL support";
994#endif
995}
996
1006void QWaylandCompositor::grabSurface(QWaylandSurfaceGrabber *grabber, const QWaylandBufferRef &buffer)
1007{
1008 if (buffer.isSharedMemory()) {
1009 emit grabber->success(buffer.image());
1010 } else {
1011#if QT_CONFIG(opengl)
1013 QOpenGLFramebufferObject fbo(buffer.size());
1014 fbo.bind();
1015 QOpenGLTextureBlitter blitter;
1016 blitter.create();
1017
1018
1019 glViewport(0, 0, buffer.size().width(), buffer.size().height());
1020
1021 QOpenGLTextureBlitter::Origin surfaceOrigin =
1025
1026 auto texture = buffer.toOpenGLTexture();
1027 blitter.bind(texture->target());
1028 blitter.blit(texture->textureId(), QMatrix4x4(), surfaceOrigin);
1029 blitter.release();
1030
1031 emit grabber->success(fbo.toImage());
1032 } else
1033#endif
1035 }
1036}
1037
1068void QWaylandCompositor::setAdditionalShmFormats(const QVector<ShmFormat> &additionalShmFormats)
1069{
1070 Q_D(QWaylandCompositor);
1071 if (d->initialized)
1072 qCWarning(qLcWaylandCompositorHardwareIntegration) << "Setting QWaylandCompositor::additionalShmFormats after initialization has no effect";
1073
1074 d->shmFormats = additionalShmFormats;
1075 emit additionalShmFormatsChanged();
1076}
1077
1078QVector<QWaylandCompositor::ShmFormat> QWaylandCompositor::additionalShmFormats() const
1079{
1080 Q_D(const QWaylandCompositor);
1081 return d->shmFormats;
1082}
1083
1084void QWaylandCompositor::applicationStateChanged(Qt::ApplicationState state)
1085{
1086#if QT_CONFIG(xkbcommon)
1088 auto *seat = defaultSeat();
1089 if (seat != nullptr) {
1090 QWaylandKeyboardPrivate *keyb = QWaylandKeyboardPrivate::get(seat->keyboard());
1091 keyb->resetKeyboardState();
1092 }
1093 }
1094#else
1095 Q_UNUSED(state);
1096#endif
1097}
1098
1100
1101#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:122
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:106
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)
static QStringList arguments()
void start() noexcept
Starts this timer.
\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
Definition qlist.h:74
qsizetype size() const noexcept
Definition qlist.h:386
bool empty() const noexcept
Definition qlist.h:682
bool removeOne(const AT &t)
Definition qlist.h:581
const_reference at(qsizetype i) const noexcept
Definition qlist.h:429
void prepend(rvalue_ref t)
Definition qlist.h:456
void append(parameter_type t)
Definition qlist.h:441
void clear()
Definition qlist.h:417
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:61
\inmodule QtCore
Definition qobject.h:90
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2823
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.
virtual void * nativeResourceForIntegration(const QByteArray &resource)
\inmodule QtCore
Definition qpointer.h:18
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
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5710
static QString fromLocal8Bit(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5788
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:1083
\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....
void updateModifierState(uint code, uint32_t state)
void keyEvent(uint code, uint32_t state)
static QWaylandKeyboardPrivate * get(QWaylandKeyboard *keyboard)
\inmodule QtWaylandCompositor
\inmodule QtWaylandCompositor
\qmltype WaylandOutput \instantiates QWaylandOutput \inqmlmodule QtWayland.Compositor
\inmodule QtWaylandCompositor
void sendQuitMessage(QWaylandClient *client)
\qmltype WaylandSeat \instantiates QWaylandSeat \inqmlmodule QtWayland.Compositor
virtual bool isOwner(QInputEvent *inputEvent) const
\inmodule QtWaylandCompositor
void success(const QImage &image)
void failed(Error error)
static bool hasUninitializedSurface()
static QWaylandSurfacePrivate * get(QWaylandSurface *surface)
QList< QPointer< QWaylandSurface > > subsurfaceChildren
void initSubsurface(QWaylandSurface *parent, struct ::wl_client *client, int id, int version)
\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())
double e
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:261
@ ApplicationInactive
Definition qnamespace.h:264
#define Q_FUNC_INFO
#define qWarning
Definition qlogging.h:162
#define qFatal
Definition qlogging.h:164
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
return ret
#define SLOT(a)
Definition qobjectdefs.h:51
#define SIGNAL(a)
Definition qobjectdefs.h:52
static QOpenGLCompositor * compositor
GLboolean GLboolean GLboolean b
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLenum GLuint buffer
GLenum GLuint texture
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLintptr offset
GLuint64 GLenum GLint fd
GLuint name
GLint GLsizei GLsizei GLenum format
const GLubyte * c
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLdouble s
[6]
Definition qopenglext.h:235
#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:29
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:955
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent