diff --git a/abstract_wayland_output.h b/abstract_wayland_output.h --- a/abstract_wayland_output.h +++ b/abstract_wayland_output.h @@ -141,7 +141,7 @@ void setWaylandMode(const QSize &size, int refreshRate); - void setTransform(KWayland::Server::OutputDeviceInterface::Transform transform); + void setOrientation(Qt::ScreenOrientations orientation); QSize orientateSize(const QSize &size) const; /** @@ -159,6 +159,8 @@ void createWaylandOutput(); void createXdgOutput(); + void setTransform(KWayland::Server::OutputDeviceInterface::Transform transform); + QPointer m_waylandOutput; QPointer m_xdgOutput; QPointer m_waylandOutputDevice; diff --git a/abstract_wayland_output.cpp b/abstract_wayland_output.cpp --- a/abstract_wayland_output.cpp +++ b/abstract_wayland_output.cpp @@ -308,6 +308,47 @@ return size; } +DeviceInterface::Transform toTransform(Qt::ScreenOrientations orientation) +{ + if (orientation | Qt::LandscapeOrientation) { + if (orientation | Qt::InvertedPortraitOrientation) { + return DeviceInterface::Transform::Flipped; + } + return DeviceInterface::Transform::Normal; + } + + if (orientation | Qt::PortraitOrientation) { + if (orientation | Qt::InvertedLandscapeOrientation) { + if (orientation | Qt::InvertedPortraitOrientation) { + return DeviceInterface::Transform::Flipped270; + } + return DeviceInterface::Transform::Flipped90; + } + return DeviceInterface::Transform::Rotated90; + } + + if (orientation | Qt::InvertedLandscapeOrientation) { + return DeviceInterface::Transform::Rotated180; + } + + if (orientation | Qt::InvertedPortraitOrientation) { + return DeviceInterface::Transform::Rotated270; + } + + Q_ASSERT(orientation == Qt::PrimaryOrientation); + return DeviceInterface::Transform::Normal; +} + +void AbstractWaylandOutput::setOrientation(Qt::ScreenOrientations orientation) +{ + const auto transform = toTransform(orientation); + if (transform == m_waylandOutputDevice->transform()) { + return; + } + setTransform(transform); + emit modeChanged(); +} + Qt::ScreenOrientations AbstractWaylandOutput::orientation() const { const DeviceInterface::Transform transform = m_waylandOutputDevice->transform(); diff --git a/plugins/platforms/drm/drm_output.cpp b/plugins/platforms/drm/drm_output.cpp --- a/plugins/platforms/drm/drm_output.cpp +++ b/plugins/platforms/drm/drm_output.cpp @@ -841,10 +841,7 @@ // go back to previous state if (m_lastWorkingState.valid) { m_mode = m_lastWorkingState.mode; - - // TODO: Add API back to set orientation from backend -// setOrientation(m_lastWorkingState.orientation); - + setOrientation(m_lastWorkingState.orientation); setGlobalPos(m_lastWorkingState.globalPos); if (m_primaryPlane) { m_primaryPlane->setTransformation(m_lastWorkingState.planeTransformations);