Summary: In order to separate high-level properties of individual outputs from hardware-specific ones and access these, introduce a new generic class Output. Also make the DrmOutput class directly a child class of this generic class. The long-term goal is to get rid of the Screens global object on Wayland and instead directly work with Output objects on compositing level. This should enable us long-term to do direct scanout to hardware planes, what I predict needs this generic output representation at one point. Test Plan: Manually. Reviewers: #kwin Subscribers: kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D11781remotes/origin/zzag/port-minimizeanimation-to-javascript
parent
8cf5041e69
commit
fe63e21f80
14 changed files with 449 additions and 239 deletions
@ -0,0 +1,130 @@ |
||||
/********************************************************************
|
||||
KWin - the KDE window manager |
||||
This file is part of the KDE project. |
||||
|
||||
Copyright 2018 Roman Gilg <subdiff@gmail.com> |
||||
|
||||
This program is free software; you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation; either version 2 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*********************************************************************/ |
||||
#include "abstract_output.h" |
||||
#include "wayland_server.h" |
||||
|
||||
// KWayland
|
||||
#include <KWayland/Server/output_interface.h> |
||||
#include <KWayland/Server/outputchangeset.h> |
||||
#include <KWayland/Server/outputdevice_interface.h> |
||||
#include <KWayland/Server/xdgoutput_interface.h> |
||||
// KF5
|
||||
#include <KLocalizedString> |
||||
|
||||
#include <cmath> |
||||
|
||||
namespace KWin |
||||
{ |
||||
|
||||
AbstractOutput::AbstractOutput(QObject *parent) |
||||
: QObject(parent) |
||||
{ |
||||
} |
||||
|
||||
AbstractOutput::~AbstractOutput() |
||||
{ |
||||
delete m_waylandOutputDevice.data(); |
||||
delete m_xdgOutput.data(); |
||||
delete m_waylandOutput.data(); |
||||
} |
||||
|
||||
QString AbstractOutput::name() const |
||||
{ |
||||
if (!m_waylandOutput) { |
||||
return i18n("unknown"); |
||||
} |
||||
return QStringLiteral("%1 %2").arg(m_waylandOutput->manufacturer()).arg(m_waylandOutput->model()); |
||||
} |
||||
|
||||
QRect AbstractOutput::geometry() const |
||||
{ |
||||
return QRect(m_globalPos, pixelSize() / scale()); |
||||
} |
||||
|
||||
QSize AbstractOutput::physicalSize() const |
||||
{ |
||||
if (m_orientation == Qt::PortraitOrientation || m_orientation == Qt::InvertedPortraitOrientation) { |
||||
return m_physicalSize.transposed(); |
||||
} |
||||
return m_physicalSize; |
||||
} |
||||
|
||||
void AbstractOutput::setGlobalPos(const QPoint &pos) |
||||
{ |
||||
m_globalPos = pos; |
||||
if (m_waylandOutput) { |
||||
m_waylandOutput->setGlobalPosition(pos); |
||||
} |
||||
if (m_waylandOutputDevice) { |
||||
m_waylandOutputDevice->setGlobalPosition(pos); |
||||
} |
||||
if (m_xdgOutput) { |
||||
m_xdgOutput->setLogicalPosition(pos); |
||||
m_xdgOutput->done(); |
||||
} |
||||
} |
||||
|
||||
void AbstractOutput::setScale(qreal scale) |
||||
{ |
||||
m_scale = scale; |
||||
if (m_waylandOutput) { |
||||
// this is the scale that clients will ideally use for their buffers
|
||||
// this has to be an int which is fine
|
||||
|
||||
// I don't know whether we want to round or ceil
|
||||
// or maybe even set this to 3 when we're scaling to 1.5
|
||||
// don't treat this like it's chosen deliberately
|
||||
m_waylandOutput->setScale(std::ceil(scale)); |
||||
} |
||||
if (m_waylandOutputDevice) { |
||||
m_waylandOutputDevice->setScaleF(scale); |
||||
} |
||||
if (m_xdgOutput) { |
||||
m_xdgOutput->setLogicalSize(pixelSize() / m_scale); |
||||
m_xdgOutput->done(); |
||||
} |
||||
} |
||||
|
||||
void AbstractOutput::setChanges(KWayland::Server::OutputChangeSet *changes) |
||||
{ |
||||
m_changeset = changes; |
||||
qCDebug(KWIN_CORE) << "set changes in AbstractOutput"; |
||||
commitChanges(); |
||||
} |
||||
|
||||
void AbstractOutput::setWaylandOutput(KWayland::Server::OutputInterface *set) |
||||
{ |
||||
m_waylandOutput = set; |
||||
} |
||||
|
||||
void AbstractOutput::createXdgOutput() |
||||
{ |
||||
if (!m_waylandOutput || m_xdgOutput) { |
||||
return; |
||||
} |
||||
m_xdgOutput = waylandServer()->xdgOutputManager()->createXdgOutput(m_waylandOutput, m_waylandOutput); |
||||
} |
||||
|
||||
void AbstractOutput::setWaylandOutputDevice(KWayland::Server::OutputDeviceInterface *set) |
||||
{ |
||||
m_waylandOutputDevice = set; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,146 @@ |
||||
/********************************************************************
|
||||
KWin - the KDE window manager |
||||
This file is part of the KDE project. |
||||
|
||||
Copyright 2018 Roman Gilg <subdiff@gmail.com> |
||||
|
||||
This program is free software; you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation; either version 2 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*********************************************************************/ |
||||
#ifndef KWIN_OUTPUT_H |
||||
#define KWIN_OUTPUT_H |
||||
|
||||
#include <utils.h> |
||||
#include <kwin_export.h> |
||||
|
||||
#include <QObject> |
||||
#include <QPoint> |
||||
#include <QPointer> |
||||
#include <QRect> |
||||
#include <QSize> |
||||
#include <QVector> |
||||
|
||||
namespace KWayland |
||||
{ |
||||
namespace Server |
||||
{ |
||||
class OutputInterface; |
||||
class OutputDeviceInterface; |
||||
class OutputChangeSet; |
||||
class OutputManagementInterface; |
||||
class XdgOutputInterface; |
||||
} |
||||
} |
||||
|
||||
namespace KWin |
||||
{ |
||||
|
||||
/**
|
||||
* Generic output representation in a Wayland session |
||||
**/ |
||||
class KWIN_EXPORT AbstractOutput : public QObject |
||||
{ |
||||
Q_OBJECT |
||||
public: |
||||
explicit AbstractOutput(QObject *parent = nullptr); |
||||
virtual ~AbstractOutput(); |
||||
|
||||
QString name() const; |
||||
bool isEnabled() const { |
||||
return !m_waylandOutput.isNull(); |
||||
} |
||||
|
||||
virtual QSize pixelSize() const = 0; |
||||
qreal scale() const { |
||||
return m_scale; |
||||
} |
||||
/*
|
||||
* The geometry of this output in global compositor co-ordinates (i.e scaled) |
||||
*/ |
||||
QRect geometry() const; |
||||
QSize physicalSize() const; |
||||
Qt::ScreenOrientation orientation() const { |
||||
return m_orientation; |
||||
} |
||||
|
||||
bool isInternal() const { |
||||
return m_internal; |
||||
} |
||||
|
||||
void setGlobalPos(const QPoint &pos); |
||||
void setScale(qreal scale); |
||||
|
||||
/**
|
||||
* This sets the changes and tests them against the specific output |
||||
*/ |
||||
void setChanges(KWayland::Server::OutputChangeSet *changeset); |
||||
virtual bool commitChanges() { return false; } |
||||
|
||||
QPointer<KWayland::Server::OutputInterface> waylandOutput() const { |
||||
return m_waylandOutput; |
||||
} |
||||
|
||||
protected: |
||||
QPointer<KWayland::Server::OutputChangeSet> changes() const { |
||||
return m_changeset; |
||||
} |
||||
|
||||
void setWaylandOutput(KWayland::Server::OutputInterface *set); |
||||
|
||||
QPointer<KWayland::Server::XdgOutputInterface> xdgOutput() const { |
||||
return m_xdgOutput; |
||||
} |
||||
void createXdgOutput(); |
||||
|
||||
QPointer<KWayland::Server::OutputDeviceInterface> waylandOutputDevice() const { |
||||
return m_waylandOutputDevice; |
||||
} |
||||
void setWaylandOutputDevice(KWayland::Server::OutputDeviceInterface *set); |
||||
|
||||
QPoint globalPos() const { |
||||
return m_globalPos; |
||||
} |
||||
|
||||
QSize rawPhysicalSize() const { |
||||
return m_physicalSize; |
||||
} |
||||
void setRawPhysicalSize(const QSize &set) { |
||||
m_physicalSize = set; |
||||
} |
||||
|
||||
void setOrientation(Qt::ScreenOrientation set) { |
||||
m_orientation = set; |
||||
} |
||||
bool internal() const { |
||||
return m_internal; |
||||
} |
||||
void setInternal(bool set) { |
||||
m_internal = set; |
||||
} |
||||
|
||||
private: |
||||
QPointer<KWayland::Server::OutputChangeSet> m_changeset; |
||||
QPointer<KWayland::Server::OutputInterface> m_waylandOutput; |
||||
QPointer<KWayland::Server::XdgOutputInterface> m_xdgOutput; |
||||
QPointer<KWayland::Server::OutputDeviceInterface> m_waylandOutputDevice; |
||||
|
||||
QPoint m_globalPos; |
||||
qreal m_scale = 1; |
||||
QSize m_physicalSize; |
||||
Qt::ScreenOrientation m_orientation = Qt::PrimaryOrientation; |
||||
bool m_internal = false; |
||||
}; |
||||
|
||||
} |
||||
|
||||
#endif // KWIN_OUTPUT_H
|
||||
Loading…
Reference in new issue