kwin/src/wayland/screencast_v1_interface.cpp
2022-03-15 16:09:45 +01:00

146 lines
5 KiB
C++

/*
SPDX-FileCopyrightText: 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include "screencast_v1_interface.h"
#include "display.h"
#include "output_interface.h"
#include <QDebug>
#include <QRect>
#include "qwayland-server-zkde-screencast-unstable-v1.h"
namespace KWaylandServer
{
static int s_version = 3;
class ScreencastStreamV1InterfacePrivate : public QtWaylandServer::zkde_screencast_stream_unstable_v1
{
public:
ScreencastStreamV1InterfacePrivate(ScreencastStreamV1Interface *q)
: q(q)
{
}
void zkde_screencast_stream_unstable_v1_destroy_resource(Resource *resource) override
{
Q_UNUSED(resource);
if (!stopped) {
Q_EMIT q->finished();
}
q->deleteLater();
}
void zkde_screencast_stream_unstable_v1_close(Resource *resource) override
{
Q_UNUSED(resource);
Q_EMIT q->finished();
stopped = true;
wl_resource_destroy(resource->handle);
}
bool stopped = false;
ScreencastStreamV1Interface *const q;
};
ScreencastStreamV1Interface::ScreencastStreamV1Interface(QObject *parent)
: QObject(parent)
, d(new ScreencastStreamV1InterfacePrivate(this))
{
}
ScreencastStreamV1Interface::~ScreencastStreamV1Interface() = default;
void ScreencastStreamV1Interface::sendCreated(quint32 nodeid)
{
d->send_created(nodeid);
}
void ScreencastStreamV1Interface::sendFailed(const QString &error)
{
d->send_failed(error);
}
void ScreencastStreamV1Interface::sendClosed()
{
if (!d->stopped) {
d->send_closed();
}
}
class ScreencastV1InterfacePrivate : public QtWaylandServer::zkde_screencast_unstable_v1
{
public:
ScreencastV1InterfacePrivate(Display *display, ScreencastV1Interface *q)
: QtWaylandServer::zkde_screencast_unstable_v1(*display, s_version)
, q(q)
{
}
ScreencastStreamV1Interface *createStream(Resource *resource, quint32 streamid) const
{
auto stream = new ScreencastStreamV1Interface(q);
stream->d->init(resource->client(), streamid, resource->version());
return stream;
}
void zkde_screencast_unstable_v1_stream_output(Resource *resource, uint32_t streamid, struct ::wl_resource *output, uint32_t pointer) override
{
Q_EMIT q->outputScreencastRequested(createStream(resource, streamid), OutputInterface::get(output), ScreencastV1Interface::CursorMode(pointer));
}
void zkde_screencast_unstable_v1_stream_window(Resource *resource, uint32_t streamid, const QString &uuid, uint32_t pointer) override
{
Q_EMIT q->windowScreencastRequested(createStream(resource, streamid), uuid, ScreencastV1Interface::CursorMode(pointer));
}
void zkde_screencast_unstable_v1_stream_virtual_output(Resource *resource,
uint32_t streamid,
const QString &name,
int32_t width,
int32_t height,
wl_fixed_t scale,
uint32_t pointer) override
{
Q_EMIT q->virtualOutputScreencastRequested(createStream(resource, streamid),
name,
{width, height},
wl_fixed_to_double(scale),
ScreencastV1Interface::CursorMode(pointer));
}
void zkde_screencast_unstable_v1_stream_region(QtWaylandServer::zkde_screencast_unstable_v1::Resource *resource,
uint32_t stream,
int32_t x,
int32_t y,
uint32_t width,
uint32_t height,
wl_fixed_t scale,
uint32_t pointer) override
{
Q_EMIT q->regionScreencastRequested(createStream(resource, stream),
{x, y, int(width), int(height)},
wl_fixed_to_double(scale),
ScreencastV1Interface::CursorMode(pointer));
}
void zkde_screencast_unstable_v1_destroy(Resource *resource) override
{
wl_resource_destroy(resource->handle);
}
ScreencastV1Interface *const q;
};
ScreencastV1Interface::ScreencastV1Interface(Display *display, QObject *parent)
: QObject(parent)
, d(new ScreencastV1InterfacePrivate(display, this))
{
}
ScreencastV1Interface::~ScreencastV1Interface() = default;
} // namespace KWaylandServer