summaryrefslogtreecommitdiff
blob: 6aa94ccb7f695ffe49410b9315a123542061fea7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
From 3dbd366516c38d987025623feea18f79c15d72dd Mon Sep 17 00:00:00 2001
From: Aleix Pol <aleixpol@kde.org>
Date: Mon, 30 May 2022 15:42:02 +0200
Subject: [PATCH] Backport of 5f7fe7482ae3de6e5dabbd2712c283439b0eecac

Since the codebases had diverged over time, I've backported it by hand
using the same concepts as the forementioned fix, trying to minimise the
delta with the latest released Plasma 5.24.
---
 src/remotedesktop.cpp      | 12 ++------
 src/screencast.cpp         | 15 ++++++----
 src/waylandintegration.cpp | 60 +++++++++++++++-----------------------
 src/waylandintegration.h   | 26 +++++++++++++++--
 src/waylandintegration_p.h | 15 ++--------
 5 files changed, 61 insertions(+), 67 deletions(-)

diff --git a/src/remotedesktop.cpp b/src/remotedesktop.cpp
index f36def4..9282ff0 100644
--- a/src/remotedesktop.cpp
+++ b/src/remotedesktop.cpp
@@ -122,20 +122,14 @@ uint RemoteDesktopPortal::Start(const QDBusObjectPath &handle,
 
     if (remoteDesktopDialog->exec()) {
         if (session->screenSharingEnabled()) {
-            if (!WaylandIntegration::startStreamingOutput(remoteDesktopDialog->selectedScreens().first(), Screencasting::Hidden)) {
+            auto stream = WaylandIntegration::startStreamingOutput(remoteDesktopDialog->selectedScreens().first(), Screencasting::Hidden);
+            if (!stream.isValid()) {
                 return 2;
             }
 
             WaylandIntegration::authenticate();
 
-            QVariant streams = WaylandIntegration::streams();
-
-            if (!streams.isValid()) {
-                qCWarning(XdgDesktopPortalKdeRemoteDesktop()) << "Pipewire stream is not ready to be streamed";
-                return 2;
-            }
-
-            results.insert(QStringLiteral("streams"), streams);
+            results.insert(QStringLiteral("streams"), QVariant::fromValue<WaylandIntegration::Streams>({stream}));
         } else {
             qCWarning(XdgDesktopPortalKdeRemoteDesktop()) << "Only stream input";
             WaylandIntegration::startStreamingInput();
diff --git a/src/screencast.cpp b/src/screencast.cpp
index 210bbbb..5be6210 100644
--- a/src/screencast.cpp
+++ b/src/screencast.cpp
@@ -147,26 +147,29 @@ uint ScreenCastPortal::Start(const QDBusObjectPath &handle,
 
     if (screenDialog->exec()) {
         const auto selectedScreens = screenDialog->selectedScreens();
+        WaylandIntegration::Streams streams;
         for (quint32 outputid : selectedScreens) {
-            if (!WaylandIntegration::startStreamingOutput(outputid, Screencasting::CursorMode(session->cursorMode()))) {
+            auto stream = WaylandIntegration::startStreamingOutput(outputid, Screencasting::CursorMode(session->cursorMode()));
+            if (!stream.isValid()) {
                 return 2;
             }
+            streams << stream;
         }
         const auto selectedWindows = screenDialog->selectedWindows();
         for (const auto &win : selectedWindows) {
-            if (!WaylandIntegration::startStreamingWindow(win)) {
+            auto stream = WaylandIntegration::startStreamingWindow(win);
+            if (!stream.isValid()) {
                 return 2;
             }
+            streams << stream;
         }
 
-        QVariant streams = WaylandIntegration::streams();
-
-        if (!streams.isValid()) {
+        if (streams.isEmpty()) {
             qCWarning(XdgDesktopPortalKdeScreenCast) << "Pipewire stream is not ready to be streamed";
             return 2;
         }
 
-        results.insert(QStringLiteral("streams"), streams);
+        results.insert(QStringLiteral("streams"), QVariant::fromValue(streams));
 
         if (inhibitionsEnabled()) {
             new NotificationInhibition(app_id, i18nc("Do not disturb mode is enabled because...", "Screen sharing in progress"), session);
diff --git a/src/waylandintegration.cpp b/src/waylandintegration.cpp
index 44d862a..9f5a177 100644
--- a/src/waylandintegration.cpp
+++ b/src/waylandintegration.cpp
@@ -43,7 +43,7 @@ Q_LOGGING_CATEGORY(XdgDesktopPortalKdeWaylandIntegration, "xdp-kde-wayland-integ
 
 Q_GLOBAL_STATIC(WaylandIntegration::WaylandIntegrationPrivate, globalWaylandIntegration)
 
-static QDebug operator<<(QDebug dbg, const WaylandIntegration::WaylandIntegrationPrivate::Stream &c)
+static QDebug operator<<(QDebug dbg, const WaylandIntegration::Stream &c)
 {
     dbg.nospace() << "Stream(" << c.map << ", " << c.nodeId << ")";
     return dbg.space();
@@ -74,12 +74,12 @@ void WaylandIntegration::startStreamingInput()
     globalWaylandIntegration->startStreamingInput();
 }
 
-bool WaylandIntegration::startStreamingOutput(quint32 outputName, Screencasting::CursorMode mode)
+WaylandIntegration::Stream WaylandIntegration::startStreamingOutput(quint32 outputName, Screencasting::CursorMode mode)
 {
     return globalWaylandIntegration->startStreamingOutput(outputName, mode);
 }
 
-bool WaylandIntegration::startStreamingWindow(const QMap<int, QVariant> &win)
+WaylandIntegration::Stream WaylandIntegration::startStreamingWindow(const QMap<int, QVariant> &win)
 {
     return globalWaylandIntegration->startStreamingWindow(win);
 }
@@ -124,11 +124,6 @@ QMap<quint32, WaylandIntegration::WaylandOutput> WaylandIntegration::screens()
     return globalWaylandIntegration->screens();
 }
 
-QVariant WaylandIntegration::streams()
-{
-    return globalWaylandIntegration->streams();
-}
-
 // Thank you kscreen
 void WaylandIntegration::WaylandOutput::setOutputType(const QString &type)
 {
@@ -157,7 +152,9 @@ void WaylandIntegration::WaylandOutput::setOutputType(const QString &type)
     }
 }
 
-const QDBusArgument &operator>>(const QDBusArgument &arg, WaylandIntegration::WaylandIntegrationPrivate::Stream &stream)
+namespace WaylandIntegration
+{
+const QDBusArgument &operator>>(const QDBusArgument &arg, Stream &stream)
 {
     arg.beginStructure();
     arg >> stream.nodeId;
@@ -177,7 +174,7 @@ const QDBusArgument &operator>>(const QDBusArgument &arg, WaylandIntegration::Wa
     return arg;
 }
 
-const QDBusArgument &operator<<(QDBusArgument &arg, const WaylandIntegration::WaylandIntegrationPrivate::Stream &stream)
+const QDBusArgument &operator<<(QDBusArgument &arg, const Stream &stream)
 {
     arg.beginStructure();
     arg << stream.nodeId;
@@ -186,9 +183,7 @@ const QDBusArgument &operator<<(QDBusArgument &arg, const WaylandIntegration::Wa
 
     return arg;
 }
-
-Q_DECLARE_METATYPE(WaylandIntegration::WaylandIntegrationPrivate::Stream)
-Q_DECLARE_METATYPE(WaylandIntegration::WaylandIntegrationPrivate::Streams)
+}
 
 KWayland::Client::PlasmaWindowManagement *WaylandIntegration::plasmaWindowManagement()
 {
@@ -207,8 +202,8 @@ WaylandIntegration::WaylandIntegrationPrivate::WaylandIntegrationPrivate()
     , m_fakeInput(nullptr)
     , m_screencasting(nullptr)
 {
-    qDBusRegisterMetaType<WaylandIntegrationPrivate::Stream>();
-    qDBusRegisterMetaType<WaylandIntegrationPrivate::Streams>();
+    qDBusRegisterMetaType<Stream>();
+    qDBusRegisterMetaType<Streams>();
 }
 
 WaylandIntegration::WaylandIntegrationPrivate::~WaylandIntegrationPrivate() = default;
@@ -228,25 +223,25 @@ void WaylandIntegration::WaylandIntegrationPrivate::startStreamingInput()
     m_streamInput = true;
 }
 
-bool WaylandIntegration::WaylandIntegrationPrivate::startStreamingWindow(const QMap<int, QVariant> &win)
+WaylandIntegration::Stream WaylandIntegration::WaylandIntegrationPrivate::startStreamingWindow(const QMap<int, QVariant> &win)
 {
     auto uuid = win[KWayland::Client::PlasmaWindowModel::Uuid].toString();
     return startStreaming(m_screencasting->createWindowStream(uuid, Screencasting::Hidden), {}, win);
 }
 
-bool WaylandIntegration::WaylandIntegrationPrivate::startStreamingOutput(quint32 outputName, Screencasting::CursorMode mode)
+WaylandIntegration::Stream WaylandIntegration::WaylandIntegrationPrivate::startStreamingOutput(quint32 outputName, Screencasting::CursorMode mode)
 {
     auto output = m_outputMap.value(outputName).output();
 
     return startStreaming(m_screencasting->createOutputStream(output.data(), mode), output, {});
 }
 
-bool WaylandIntegration::WaylandIntegrationPrivate::startStreaming(ScreencastingStream *stream,
-                                                                   QSharedPointer<KWayland::Client::Output> output,
-                                                                   const QMap<int, QVariant> &win)
+WaylandIntegration::Stream WaylandIntegration::WaylandIntegrationPrivate::startStreaming(ScreencastingStream *stream,
+                                                                                         QSharedPointer<KWayland::Client::Output> output,
+                                                                                         const QMap<int, QVariant> &win)
 {
     QEventLoop loop;
-    bool streamReady = false;
+    Stream ret;
     connect(stream, &ScreencastingStream::failed, this, [&](const QString &error) {
         qCWarning(XdgDesktopPortalKdeWaylandIntegration) << "failed to start streaming" << stream << error;
 
@@ -255,30 +250,26 @@ bool WaylandIntegration::WaylandIntegrationPrivate::startStreaming(Screencasting
         notification->setText(error);
         notification->setIconName(QStringLiteral("dialog-error"));
         notification->sendEvent();
-
-        streamReady = false;
         loop.quit();
     });
     connect(stream, &ScreencastingStream::created, this, [&](uint32_t nodeid) {
-        Stream s;
-        s.stream = stream;
-        s.nodeId = nodeid;
+        ret.stream = stream;
+        ret.nodeId = nodeid;
         if (output) {
             m_streamedScreenPosition = output->globalPosition();
-            s.map = {
+            ret.map = {
                 {QLatin1String("size"), output->pixelSize()},
                 {QLatin1String("source_type"), static_cast<uint>(ScreenCastPortal::Monitor)},
             };
         } else {
-            s.map = {{QLatin1String("source_type"), static_cast<uint>(ScreenCastPortal::Window)}};
+            ret.map = {{QLatin1String("source_type"), static_cast<uint>(ScreenCastPortal::Window)}};
         }
-        m_streams.append(s);
+        m_streams.append(ret);
         startStreamingInput();
 
         connect(stream, &ScreencastingStream::closed, this, [this, nodeid] {
             stopStreaming(nodeid);
         });
-        streamReady = true;
 
         auto item = new KStatusNotifierItem(stream);
         item->setStandardActionsEnabled(false);
@@ -303,10 +294,10 @@ bool WaylandIntegration::WaylandIntegrationPrivate::startStreaming(Screencasting
     QTimer::singleShot(3000, &loop, &QEventLoop::quit);
     loop.exec();
 
-    return streamReady;
+    return ret;
 }
 
-void WaylandIntegration::WaylandIntegrationPrivate::Stream::close()
+void WaylandIntegration::Stream::close()
 {
     stream->deleteLater();
 }
@@ -390,11 +381,6 @@ QMap<quint32, WaylandIntegration::WaylandOutput> WaylandIntegration::WaylandInte
     return m_outputMap;
 }
 
-QVariant WaylandIntegration::WaylandIntegrationPrivate::streams()
-{
-    return QVariant::fromValue<WaylandIntegrationPrivate::Streams>(m_streams);
-}
-
 void WaylandIntegration::WaylandIntegrationPrivate::authenticate()
 {
     if (!m_waylandAuthenticationRequested) {
diff --git a/src/waylandintegration.h b/src/waylandintegration.h
index 04319c9..b8e6a00 100644
--- a/src/waylandintegration.h
+++ b/src/waylandintegration.h
@@ -9,6 +9,7 @@
 #ifndef XDG_DESKTOP_PORTAL_KDE_WAYLAND_INTEGRATION_H
 #define XDG_DESKTOP_PORTAL_KDE_WAYLAND_INTEGRATION_H
 
+#include <QDBusArgument>
 #include <QObject>
 #include <QPoint>
 #include <QSize>
@@ -28,6 +29,23 @@ class ScreencastingSource;
 
 namespace WaylandIntegration
 {
+
+struct Stream {
+    ScreencastingStream *stream = nullptr;
+    uint nodeId;
+    QVariantMap map;
+
+    bool isValid() const
+    {
+        return stream != nullptr;
+    }
+
+    void close();
+};
+typedef QVector<Stream> Streams;
+const QDBusArgument &operator<<(QDBusArgument &arg, const Stream &stream);
+const QDBusArgument &operator>>(const QDBusArgument &arg, Stream &stream);
+
 class WaylandOutput
 {
 public:
@@ -110,8 +128,8 @@ bool isStreamingEnabled();
 bool isStreamingAvailable();
 
 void startStreamingInput();
-bool startStreamingOutput(quint32 outputName, Screencasting::CursorMode mode);
-bool startStreamingWindow(const QMap<int, QVariant> &win);
+Stream startStreamingOutput(quint32 outputName, Screencasting::CursorMode mode);
+Stream startStreamingWindow(const QMap<int, QVariant> &win);
 void stopAllStreaming();
 
 void requestPointerButtonPress(quint32 linuxButton);
@@ -123,7 +141,6 @@ void requestPointerAxisDiscrete(Qt::Orientation axis, qreal delta);
 void requestKeyboardKeycode(int keycode, bool state);
 
 QMap<quint32, WaylandOutput> screens();
-QVariant streams();
 
 void init();
 
@@ -132,4 +149,7 @@ KWayland::Client::PlasmaWindowManagement *plasmaWindowManagement();
 WaylandIntegration *waylandIntegration();
 }
 
+Q_DECLARE_METATYPE(WaylandIntegration::Stream)
+Q_DECLARE_METATYPE(WaylandIntegration::Streams)
+
 #endif // XDG_DESKTOP_PORTAL_KDE_WAYLAND_INTEGRATION_H
diff --git a/src/waylandintegration_p.h b/src/waylandintegration_p.h
index 220ad3d..e95f6a0 100644
--- a/src/waylandintegration_p.h
+++ b/src/waylandintegration_p.h
@@ -53,15 +53,6 @@ private:
     KWayland::Client::PlasmaWindowManagement *m_windowManagement = nullptr;
 
 public:
-    struct Stream {
-        ScreencastingStream *stream = nullptr;
-        uint nodeId;
-        QVariantMap map;
-
-        void close();
-    };
-    typedef QVector<Stream> Streams;
-
     void authenticate();
 
     bool isStreamingEnabled() const;
@@ -69,9 +60,9 @@ public:
 
     void startStreamingInput();
 
-    bool startStreaming(ScreencastingStream *stream, QSharedPointer<KWayland::Client::Output> output, const QMap<int, QVariant> &win);
-    bool startStreamingOutput(quint32 outputName, Screencasting::CursorMode mode);
-    bool startStreamingWindow(const QMap<int, QVariant> &win);
+    Stream startStreaming(ScreencastingStream *stream, QSharedPointer<KWayland::Client::Output> output, const QMap<int, QVariant> &win);
+    Stream startStreamingOutput(quint32 outputName, Screencasting::CursorMode mode);
+    Stream startStreamingWindow(const QMap<int, QVariant> &win);
     void stopStreaming(uint32_t nodeid);
     void stopAllStreaming();
 
-- 
GitLab