Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qwaylandclientextension.cpp
Go to the documentation of this file.
1// Copyright (C) 2017 Erik Larsson.
2// Copyright (C) 2021 David Redondo <qt@david-redondo.de>
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4
7#include <QtWaylandClient/private/qwaylanddisplay_p.h>
8#include <QtWaylandClient/private/qwaylandintegration_p.h>
9
11
12using RegistryGlobal = QtWaylandClient::QWaylandDisplay::RegistryGlobal;
13using namespace Qt::StringLiterals;
14
15QWaylandClientExtensionPrivate::QWaylandClientExtensionPrivate()
16{
17 // Keep the possibility to use a custom waylandIntegration as a plugin,
18 // but also add the possibility to run it as a QML component.
19 waylandIntegration = QtWaylandClient::QWaylandIntegration::instance();
20 if (!waylandIntegration)
21 waylandIntegration = new QtWaylandClient::QWaylandIntegration("wayland"_L1);
22}
23
24void QWaylandClientExtensionPrivate::globalAdded(const RegistryGlobal &global)
25{
26 Q_Q(QWaylandClientExtension);
27 if (!active && global.interface == QLatin1String(q->extensionInterface()->name)) {
28 q->bind(global.registry, global.id, global.version);
29 active = true;
30 emit q->activeChanged();
31 }
32}
33
34void QWaylandClientExtensionPrivate::globalRemoved(const RegistryGlobal &global)
35{
36 Q_Q(QWaylandClientExtension);
37 if (active && global.interface == QLatin1String(q->extensionInterface()->name)) {
38 active = false;
39 emit q->activeChanged();
40 }
41}
42
43/*!
44 \class QWaylandClientExtension
45 \internal
46*/
47
48void QWaylandClientExtension::initialize()
49{
50 Q_D(QWaylandClientExtension);
51 if (d->active) {
52 return;
53 }
54 const QtWaylandClient::QWaylandDisplay *display = d->waylandIntegration->display();
55 const auto globals = display->globals();
56 auto global =
57 std::find_if(globals.cbegin(), globals.cend(), [this](const RegistryGlobal &global) {
58 return global.interface == QLatin1String(extensionInterface()->name);
59 });
60 if (global != globals.cend()) {
61 bind(global->registry, global->id, global->version);
62 d->active = true;
63 emit activeChanged();
64 }
65}
66
67QWaylandClientExtension::QWaylandClientExtension(const int ver)
68 : QObject(*new QWaylandClientExtensionPrivate())
69{
70 Q_D(QWaylandClientExtension);
71 d->version = ver;
72 auto display = d->waylandIntegration->display();
73 QObjectPrivate::connect(display, &QtWaylandClient::QWaylandDisplay::globalAdded, d,
74 &QWaylandClientExtensionPrivate::globalAdded);
75 QObjectPrivate::connect(display, &QtWaylandClient::QWaylandDisplay::globalRemoved, d,
76 &QWaylandClientExtensionPrivate::globalRemoved);
77 // This function uses virtual functions and we don't want it to be called from the constructor.
78 QMetaObject::invokeMethod(this, "initialize", Qt::QueuedConnection);
79}
80
81QWaylandClientExtension::~QWaylandClientExtension()
82{
83}
84
85QtWaylandClient::QWaylandIntegration *QWaylandClientExtension::integration() const
86{
87 Q_D(const QWaylandClientExtension);
88 return d->waylandIntegration;
89}
90
91int QWaylandClientExtension::version() const
92{
93 Q_D(const QWaylandClientExtension);
94 return d->version;
95}
96
97void QWaylandClientExtension::setVersion(const int ver)
98{
99 Q_D(QWaylandClientExtension);
100 if (d->version != ver) {
101 d->version = ver;
102 emit versionChanged();
103 }
104}
105
106bool QWaylandClientExtension::isActive() const
107{
108 Q_D(const QWaylandClientExtension);
109 return d->active;
110}
111
112QT_END_NAMESPACE
113
114#include "moc_qwaylandclientextension.cpp"
Combined button and popup list for selecting options.