File indexing completed on 2024-04-28 04:58:58

0001 /*
0002     SPDX-FileCopyrightText: 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "screencasting.h"
0008 #include "qwayland-zkde-screencast-unstable-v1.h"
0009 #include <KWayland/Client/registry.h>
0010 #include <QDebug>
0011 #include <QRect>
0012 #include <QPointer>
0013 
0014 using namespace KWayland::Client;
0015 
0016 class ScreencastingStreamPrivate : public QtWayland::zkde_screencast_stream_unstable_v1
0017 {
0018 public:
0019     ScreencastingStreamPrivate(ScreencastingStream *q)
0020         : q(q)
0021     {
0022     }
0023     ~ScreencastingStreamPrivate() override
0024     {
0025         close();
0026         q->deleteLater();
0027     }
0028 
0029     void zkde_screencast_stream_unstable_v1_created(uint32_t node) override
0030     {
0031         m_nodeId = node;
0032         Q_EMIT q->created(node);
0033     }
0034 
0035     void zkde_screencast_stream_unstable_v1_closed() override
0036     {
0037         Q_EMIT q->closed();
0038     }
0039 
0040     void zkde_screencast_stream_unstable_v1_failed(const QString &error) override
0041     {
0042         Q_EMIT q->failed(error);
0043     }
0044 
0045     uint m_nodeId = 0;
0046     QPointer<ScreencastingStream> q;
0047 };
0048 
0049 ScreencastingStream::ScreencastingStream(QObject *parent)
0050     : QObject(parent)
0051     , d(new ScreencastingStreamPrivate(this))
0052 {
0053 }
0054 
0055 ScreencastingStream::~ScreencastingStream() = default;
0056 
0057 quint32 ScreencastingStream::nodeId() const
0058 {
0059     return d->m_nodeId;
0060 }
0061 
0062 class ScreencastingPrivate : public QtWayland::zkde_screencast_unstable_v1
0063 {
0064 public:
0065     ScreencastingPrivate(Registry *registry, int id, int version, Screencasting *q)
0066         : QtWayland::zkde_screencast_unstable_v1(*registry, id, version)
0067         , q(q)
0068     {
0069     }
0070 
0071     ScreencastingPrivate(::zkde_screencast_unstable_v1 *screencasting, Screencasting *q)
0072         : QtWayland::zkde_screencast_unstable_v1(screencasting)
0073         , q(q)
0074     {
0075     }
0076 
0077     ~ScreencastingPrivate() override
0078     {
0079         destroy();
0080     }
0081 
0082     Screencasting *const q;
0083 };
0084 
0085 Screencasting::Screencasting(QObject *parent)
0086     : QObject(parent)
0087 {
0088 }
0089 
0090 Screencasting::Screencasting(Registry *registry, int id, int version, QObject *parent)
0091     : QObject(parent)
0092     , d(new ScreencastingPrivate(registry, id, version, this))
0093 {
0094 }
0095 
0096 Screencasting::~Screencasting() = default;
0097 
0098 ScreencastingStream * Screencasting::createVirtualMonitorStream(const QString& name, const QSize& resolution, qreal dpr, Screencasting::CursorMode mode)
0099 {
0100     auto stream = new ScreencastingStream(this);
0101     stream->d->init(d->stream_virtual_output(name, resolution.width(), resolution.height(), wl_fixed_from_double(dpr), mode));
0102     return stream;
0103 }
0104 
0105 void Screencasting::setup(::zkde_screencast_unstable_v1 *screencasting)
0106 {
0107     d.reset(new ScreencastingPrivate(screencasting, this));
0108 }
0109 
0110 void Screencasting::destroy()
0111 {
0112     d.reset(nullptr);
0113 }