Set transform in AbstractWaylandOutput

Summary:
Move the Wayland output device and output transform calls from DRM backend
to AbstractWaylandOutput. This leaves still some loose ends that need to be
tied up later. On failed commit we want to fall back to last working state
and orientation getter in general needs some more refactoring.

Test Plan: Compiles.

Reviewers: #kwin

Subscribers: kwin

Tags: #kwin

Maniphest Tasks: T11670

Differential Revision: https://phabricator.kde.org/D25504
This commit is contained in:
Roman Gilg 2019-11-24 11:42:30 +01:00
parent a853e3370a
commit 523967b3ac
3 changed files with 49 additions and 46 deletions

View file

@ -113,6 +113,44 @@ void AbstractWaylandOutput::setScale(qreal scale)
}
}
using DeviceInterface = KWayland::Server::OutputDeviceInterface;
KWayland::Server::OutputInterface::Transform toOutputTransform(DeviceInterface::Transform transform)
{
using Transform = DeviceInterface::Transform;
using OutputTransform = KWayland::Server::OutputInterface::Transform;
switch (transform) {
case Transform::Rotated90:
return OutputTransform::Rotated90;
case Transform::Rotated180:
return OutputTransform::Rotated180;
case Transform::Rotated270:
return OutputTransform::Rotated270;
case Transform::Flipped:
return OutputTransform::Flipped;
case Transform::Flipped90:
return OutputTransform::Flipped90;
case Transform::Flipped180:
return OutputTransform::Flipped180;
case Transform::Flipped270:
return OutputTransform::Flipped270;
default:
return OutputTransform::Normal;
}
}
void AbstractWaylandOutput::setTransform(DeviceInterface::Transform transform)
{
m_waylandOutputDevice->setTransform(transform);
if (isEnabled()) {
m_waylandOutput->setTransform(toOutputTransform(transform));
m_xdgOutput->setLogicalSize(pixelSize() / scale());
m_xdgOutput->done();
}
}
void AbstractWaylandOutput::applyChanges(const KWayland::Server::OutputChangeSet *changeSet)
{
qCDebug(KWIN_CORE) << "Apply changes to the Wayland output.";
@ -128,6 +166,7 @@ void AbstractWaylandOutput::applyChanges(const KWayland::Server::OutputChangeSet
if (changeSet->transformChanged()) {
qCDebug(KWIN_CORE) << "Server setting transform: " << (int)(changeSet->transform());
transform(changeSet->transform());
setTransform(changeSet->transform());
emitModeChanged = true;
}
if (changeSet->positionChanged()) {
@ -146,8 +185,6 @@ void AbstractWaylandOutput::applyChanges(const KWayland::Server::OutputChangeSet
}
}
using DeviceInterface = KWayland::Server::OutputDeviceInterface;
bool AbstractWaylandOutput::isEnabled() const
{
return m_waylandOutputDevice->enabled() == DeviceInterface::Enablement::Enabled;
@ -262,7 +299,10 @@ void AbstractWaylandOutput::initInterfaces(const QString &model, const QString &
QSize AbstractWaylandOutput::orientateSize(const QSize &size) const
{
if (m_orientation == Qt::PortraitOrientation || m_orientation == Qt::InvertedPortraitOrientation) {
using Transform = DeviceInterface::Transform;
const Transform transform = m_waylandOutputDevice->transform();
if (transform == Transform::Rotated90 || transform == Transform::Rotated270 ||
transform == Transform::Flipped90 || transform == Transform::Flipped270) {
return size.transposed();
}
return size;

View file

@ -70,9 +70,6 @@ public:
*/
QRect geometry() const override;
QSize physicalSize() const override;
Qt::ScreenOrientation orientation() const override {
return m_orientation;
}
/**
* Current refresh rate in 1/ms.
@ -119,9 +116,6 @@ protected:
QPoint globalPos() const;
void setOrientation(Qt::ScreenOrientation set) {
m_orientation = set;
}
bool internal() const {
return m_internal;
}
@ -147,6 +141,7 @@ protected:
void setWaylandMode(const QSize &size, int refreshRate);
void setTransform(KWayland::Server::OutputDeviceInterface::Transform transform);
QSize orientateSize(const QSize &size) const;
private:
@ -159,7 +154,6 @@ private:
KWayland::Server::OutputInterface::DpmsMode m_dpms = KWayland::Server::OutputInterface::DpmsMode::On;
Qt::ScreenOrientation m_orientation = Qt::PrimaryOrientation;
bool m_internal = false;
bool m_supportsDpms = false;
};

View file

@ -640,83 +640,49 @@ bool DrmOutput::dpmsLegacyApply()
// TODO: Rotation is currently broken in the DRM backend for 90° and 270°. Disable all rotation for
// now to not break user setups until it is possible again.
#if 0
#if 1
void DrmOutput::transform(KWayland::Server::OutputDeviceInterface::Transform transform)
{
waylandOutputDevice()->setTransform(transform);
using KWayland::Server::OutputDeviceInterface;
using KWayland::Server::OutputInterface;
auto wlOutput = waylandOutput();
switch (transform) {
case OutputDeviceInterface::Transform::Normal:
if (m_primaryPlane) {
m_primaryPlane->setTransformation(DrmPlane::Transformation::Rotate0);
}
if (wlOutput) {
wlOutput->setTransform(OutputInterface::Transform::Normal);
}
setOrientation(Qt::PrimaryOrientation);
break;
case OutputDeviceInterface::Transform::Rotated90:
if (m_primaryPlane) {
m_primaryPlane->setTransformation(DrmPlane::Transformation::Rotate90);
}
if (wlOutput) {
wlOutput->setTransform(OutputInterface::Transform::Rotated90);
}
setOrientation(Qt::PortraitOrientation);
break;
case OutputDeviceInterface::Transform::Rotated180:
if (m_primaryPlane) {
m_primaryPlane->setTransformation(DrmPlane::Transformation::Rotate180);
}
if (wlOutput) {
wlOutput->setTransform(OutputInterface::Transform::Rotated180);
}
setOrientation(Qt::InvertedLandscapeOrientation);
break;
case OutputDeviceInterface::Transform::Rotated270:
if (m_primaryPlane) {
m_primaryPlane->setTransformation(DrmPlane::Transformation::Rotate270);
}
if (wlOutput) {
wlOutput->setTransform(OutputInterface::Transform::Rotated270);
}
setOrientation(Qt::InvertedPortraitOrientation);
break;
case OutputDeviceInterface::Transform::Flipped:
// TODO: what is this exactly?
if (wlOutput) {
wlOutput->setTransform(OutputInterface::Transform::Flipped);
}
break;
case OutputDeviceInterface::Transform::Flipped90:
// TODO: what is this exactly?
if (wlOutput) {
wlOutput->setTransform(OutputInterface::Transform::Flipped90);
}
break;
case OutputDeviceInterface::Transform::Flipped180:
// TODO: what is this exactly?
if (wlOutput) {
wlOutput->setTransform(OutputInterface::Transform::Flipped180);
}
break;
case OutputDeviceInterface::Transform::Flipped270:
// TODO: what is this exactly?
if (wlOutput) {
wlOutput->setTransform(OutputInterface::Transform::Flipped270);
}
break;
}
m_modesetRequested = true;
// the cursor might need to get rotated
updateCursor();
showCursor();
// TODO: are these calls not enough in updateMode already?
setWaylandMode();
}
#else
void DrmOutput::transform(KWayland::Server::OutputDeviceInterface::Transform transform)
@ -872,7 +838,10 @@ bool DrmOutput::presentAtomically(DrmBuffer *buffer)
// go back to previous state
if (m_lastWorkingState.valid) {
m_mode = m_lastWorkingState.mode;
setOrientation(m_lastWorkingState.orientation);
// TODO: Add API back to set orientation from backend
// setOrientation(m_lastWorkingState.orientation);
setGlobalPos(m_lastWorkingState.globalPos);
if (m_primaryPlane) {
m_primaryPlane->setTransformation(m_lastWorkingState.planeTransformations);