diff --git a/abstract_output.h b/abstract_output.h --- a/abstract_output.h +++ b/abstract_output.h @@ -161,13 +161,6 @@ */ virtual QSize physicalSize() const; - /** - * Returns the orientation of this output. - * - * Default implementation returns Qt::PrimaryOrientation. - */ - virtual Qt::ScreenOrientation orientation() const; - /** * Returns the size of the gamma lookup table. * diff --git a/abstract_output.cpp b/abstract_output.cpp --- a/abstract_output.cpp +++ b/abstract_output.cpp @@ -103,11 +103,6 @@ return QSize(); } -Qt::ScreenOrientation AbstractOutput::orientation() const -{ - return Qt::PrimaryOrientation; -} - int AbstractOutput::gammaRampSize() const { return 0; diff --git a/abstract_wayland_output.h b/abstract_wayland_output.h --- a/abstract_wayland_output.h +++ b/abstract_wayland_output.h @@ -144,6 +144,17 @@ void setTransform(KWayland::Server::OutputDeviceInterface::Transform transform); QSize orientateSize(const QSize &size) const; + /** + * Returns the orientation of this output. + * + * - Flipped along the vertical axis is landscape + inv. portrait. + * - Rotated 90° and flipped along the horizontal axis is portrait + inv. landscape + * - Rotated 180° and flipped along the vertical axis is inv. landscape + inv. portrait + * - Rotated 270° and flipped along the horizontal axis is inv. portrait + inv. landscape + + * portrait + */ + Qt::ScreenOrientations orientation() const; + private: void createWaylandOutput(); void createXdgOutput(); diff --git a/abstract_wayland_output.cpp b/abstract_wayland_output.cpp --- a/abstract_wayland_output.cpp +++ b/abstract_wayland_output.cpp @@ -308,4 +308,29 @@ return size; } +Qt::ScreenOrientations AbstractWaylandOutput::orientation() const +{ + const DeviceInterface::Transform transform = m_waylandOutputDevice->transform(); + + switch (transform) { + case DeviceInterface::Transform::Rotated90: + return Qt::PortraitOrientation; + case DeviceInterface::Transform::Rotated180: + return Qt::InvertedLandscapeOrientation; + case DeviceInterface::Transform::Rotated270: + return Qt::InvertedPortraitOrientation; + case DeviceInterface::Transform::Flipped: + return Qt::LandscapeOrientation | Qt::InvertedPortraitOrientation; + case DeviceInterface::Transform::Flipped90: + return Qt::PortraitOrientation | Qt::InvertedLandscapeOrientation; + case DeviceInterface::Transform::Flipped180: + return Qt::InvertedLandscapeOrientation | Qt::InvertedPortraitOrientation; + case DeviceInterface::Transform::Flipped270: + return Qt::PortraitOrientation | Qt::InvertedLandscapeOrientation | + Qt::InvertedPortraitOrientation; + default: + return Qt::LandscapeOrientation; + } +} + } diff --git a/outputscreens.h b/outputscreens.h --- a/outputscreens.h +++ b/outputscreens.h @@ -45,7 +45,6 @@ QSize size(int screen) const override; qreal scale(int screen) const override; float refreshRate(int screen) const override; - Qt::ScreenOrientation orientation(int screen) const override; void updateCount() override; int number(const QPoint &pos) const override; diff --git a/outputscreens.cpp b/outputscreens.cpp --- a/outputscreens.cpp +++ b/outputscreens.cpp @@ -95,14 +95,6 @@ return 60.0; } -Qt::ScreenOrientation OutputScreens::orientation(int screen) const -{ - if (AbstractOutput *output = findOutput(screen)) { - return output->orientation(); - } - return Qt::PrimaryOrientation; -} - void OutputScreens::updateCount() { setCount(m_platform->enabledOutputs().size()); diff --git a/plugins/platforms/drm/drm_output.h b/plugins/platforms/drm/drm_output.h --- a/plugins/platforms/drm/drm_output.h +++ b/plugins/platforms/drm/drm_output.h @@ -150,7 +150,7 @@ bool m_modesetRequested = true; struct { - Qt::ScreenOrientation orientation; + Qt::ScreenOrientations orientation; drmModeModeInfo mode; DrmPlane::Transformations planeTransformations; QPoint globalPos; 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 @@ -128,7 +128,8 @@ return ret; } -int orientationToRotation(Qt::ScreenOrientation orientation) +// TODO: Respect OR combinations of values +int orientationToRotation(Qt::ScreenOrientations orientation) { switch (orientation) { case Qt::PrimaryOrientation: @@ -182,6 +183,8 @@ const QMatrix4x4 hotspotMatrix = matrixDisplay(m_backend->softwareCursor().size()); QPoint p = globalPos - AbstractWaylandOutput::globalPos(); + + // TODO: Respect OR combinations of values switch (orientation()) { case Qt::PrimaryOrientation: case Qt::LandscapeOrientation: