kwin/plugins/platforms/virtual/virtual_output.cpp
Méven Car 4f744d1bb6 Add TestOutputManagement::testOutputDeviceDisabled test
Allow VirtualBackend to supports Output changes.
2021-01-14 08:21:59 +00:00

80 lines
2.2 KiB
C++

/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2018 Roman Gilg <subdiff@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "virtual_output.h"
#include "virtual_backend.h"
#include "renderloop_p.h"
#include "softwarevsyncmonitor.h"
namespace KWin
{
VirtualOutput::VirtualOutput(VirtualBackend *parent)
: AbstractWaylandOutput(parent)
, m_backend(parent)
, m_renderLoop(new RenderLoop(this))
, m_vsyncMonitor(SoftwareVsyncMonitor::create(this))
{
connect(m_vsyncMonitor, &VsyncMonitor::vblankOccurred, this, &VirtualOutput::vblank);
static int identifier = -1;
m_identifier = ++identifier;
setName("Virtual-" + QString::number(identifier));
}
VirtualOutput::~VirtualOutput()
{
}
RenderLoop *VirtualOutput::renderLoop() const
{
return m_renderLoop;
}
SoftwareVsyncMonitor *VirtualOutput::vsyncMonitor() const
{
return m_vsyncMonitor;
}
void VirtualOutput::init(const QPoint &logicalPosition, const QSize &pixelSize)
{
const int refreshRate = 60000; // TODO: Make the refresh rate configurable.
m_renderLoop->setRefreshRate(refreshRate);
m_vsyncMonitor->setRefreshRate(refreshRate);
KWaylandServer::OutputDeviceInterface::Mode mode;
mode.id = 0;
mode.size = pixelSize;
mode.flags = KWaylandServer::OutputDeviceInterface::ModeFlag::Current;
mode.refreshRate = refreshRate;
initInterfaces(QByteArray("model_").append(QString::number(m_identifier)),
QByteArray("manufacturer_").append(QString::number(m_identifier)),
QByteArray("UUID_").append(QString::number(m_identifier)),
pixelSize, { mode }, QByteArray("EDID_").append(QString::number(m_identifier)));
setGeometry(QRect(logicalPosition, pixelSize));
}
void VirtualOutput::setGeometry(const QRect &geo)
{
// TODO: set mode to have updated pixelSize
setGlobalPos(geo.topLeft());
}
void VirtualOutput::vblank(std::chrono::nanoseconds timestamp)
{
RenderLoopPrivate *renderLoopPrivate = RenderLoopPrivate::get(m_renderLoop);
renderLoopPrivate->notifyFrameCompleted(timestamp);
}
void VirtualOutput::updateEnablement(bool enable)
{
m_backend->enableOutput(this, enable);
}
}