From 65e886cde2387c7d2ad3247c3b77e6b9fb9514e5 Mon Sep 17 00:00:00 2001 From: Xaver Hugl Date: Mon, 14 Nov 2022 15:20:31 +0100 Subject: [PATCH] backends/drm: support the panel orientation property --- src/backends/drm/drm_connector.cpp | 28 +++++++++++++++++++++++++++- src/backends/drm/drm_connector.h | 9 +++++++++ src/backends/drm/drm_output.cpp | 1 + src/core/output.cpp | 5 +++++ src/core/output.h | 2 ++ src/workspace.cpp | 2 +- 6 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/backends/drm/drm_connector.cpp b/src/backends/drm/drm_connector.cpp index 34d64d2122..edc1fbfd97 100644 --- a/src/backends/drm/drm_connector.cpp +++ b/src/backends/drm/drm_connector.cpp @@ -112,7 +112,8 @@ DrmConnector::DrmConnector(DrmGpu *gpu, uint32_t connectorId) PropertyDefinition(QByteArrayLiteral("link-status"), Requirement::Optional, {QByteArrayLiteral("Good"), QByteArrayLiteral("Bad")}), PropertyDefinition(QByteArrayLiteral("content type"), Requirement::Optional, - {QByteArrayLiteral("No Data"), QByteArrayLiteral("Graphics"), QByteArrayLiteral("Photo"), QByteArrayLiteral("Cinema"), QByteArrayLiteral("Game")})}, + {QByteArrayLiteral("No Data"), QByteArrayLiteral("Graphics"), QByteArrayLiteral("Photo"), QByteArrayLiteral("Cinema"), QByteArrayLiteral("Game")}), + PropertyDefinition(QByteArrayLiteral("panel orientation"), Requirement::Optional, {QByteArrayLiteral("Normal"), QByteArrayLiteral("Upside Down"), QByteArrayLiteral("Left Side Up"), QByteArrayLiteral("Right Side Up")})}, DRM_MODE_OBJECT_CONNECTOR) , m_pipeline(std::make_unique(this)) , m_conn(drmModeGetConnector(gpu->fd(), connectorId)) @@ -447,6 +448,15 @@ std::shared_ptr DrmConnector::generateMode(const QSize &size, return std::make_shared(this, mode); } +DrmConnector::PanelOrientation DrmConnector::panelOrientation() const +{ + if (const auto &property = getProp(PropertyIndex::PanelOrientation)) { + return property->enumForValue(property->current()); + } else { + return PanelOrientation::Normal; + } +} + QDebug &operator<<(QDebug &s, const KWin::DrmConnector *obj) { QDebugStateSaver saver(s); @@ -482,4 +492,20 @@ DrmConnector::DrmContentType DrmConnector::kwinToDrmContentType(ContentType type Q_UNREACHABLE(); } } + +Output::Transform DrmConnector::toKWinTransform(PanelOrientation orientation) +{ + switch (orientation) { + case PanelOrientation::Normal: + return KWin::Output::Transform::Normal; + case PanelOrientation::RightUp: + return KWin::Output::Transform::Rotated270; + case PanelOrientation::LeftUp: + return KWin::Output::Transform::Rotated90; + case PanelOrientation::UpsideDown: + return KWin::Output::Transform::Rotated180; + default: + Q_UNREACHABLE(); + } +} } diff --git a/src/backends/drm/drm_connector.h b/src/backends/drm/drm_connector.h index 54e8469104..803186c1f9 100644 --- a/src/backends/drm/drm_connector.h +++ b/src/backends/drm/drm_connector.h @@ -65,6 +65,7 @@ public: MaxBpc = 10, LinkStatus = 11, ContentType = 12, + PanelOrientation = 13, Count }; @@ -84,6 +85,12 @@ public: Cinema = 3, Game = 4 }; + enum class PanelOrientation : uint32_t { + Normal = 0, + UpsideDown = 1, + LeftUp = 2, + RightUp = 3 + }; bool init() override; bool updateProperties() override; @@ -110,8 +117,10 @@ public: bool hasRgbRange() const; Output::RgbRange rgbRange() const; LinkStatus linkStatus() const; + PanelOrientation panelOrientation() const; static DrmContentType kwinToDrmContentType(ContentType type); + static Output::Transform toKWinTransform(PanelOrientation orientation); private: QList> generateCommonModes(); diff --git a/src/backends/drm/drm_output.cpp b/src/backends/drm/drm_output.cpp index c2971bdf6f..67cb22536c 100644 --- a/src/backends/drm/drm_output.cpp +++ b/src/backends/drm/drm_output.cpp @@ -76,6 +76,7 @@ DrmOutput::DrmOutput(DrmPipeline *pipeline) .edid = edid->raw(), .subPixel = conn->subpixel(), .capabilities = capabilities, + .panelOrientation = DrmConnector::toKWinTransform(conn->panelOrientation()), .internal = conn->isInternal(), .nonDesktop = conn->isNonDesktop(), }); diff --git a/src/core/output.cpp b/src/core/output.cpp index b68156fc9f..abd25c91af 100644 --- a/src/core/output.cpp +++ b/src/core/output.cpp @@ -406,4 +406,9 @@ void Output::setContentType(ContentType contentType) m_contentType = contentType; } +Output::Transform Output::panelOrientation() const +{ + return m_information.panelOrientation; +} + } // namespace KWin diff --git a/src/core/output.h b/src/core/output.h index 48b4db28ce..3d2945625a 100644 --- a/src/core/output.h +++ b/src/core/output.h @@ -248,6 +248,7 @@ public: bool isPlaceholder() const; bool isNonDesktop() const; + Transform panelOrientation() const; virtual void setColorTransformation(const std::shared_ptr &transformation); @@ -317,6 +318,7 @@ protected: QByteArray edid; SubPixel subPixel = SubPixel::Unknown; Capabilities capabilities; + Transform panelOrientation = Transform::Normal; bool internal = false; bool placeholder = false; bool nonDesktop = false; diff --git a/src/workspace.cpp b/src/workspace.cpp index f60aa2575c..3142b467c7 100644 --- a/src/workspace.cpp +++ b/src/workspace.cpp @@ -675,7 +675,7 @@ void Workspace::updateOutputConfiguration() } else { props->enabled = true; props->pos = pos; - props->transform = Output::Transform::Normal; + props->transform = output->panelOrientation(); } pos.setX(pos.x() + output->geometry().width()); }