File indexing completed on 2024-04-28 16:49:41

0001 /*
0002  *  SPDX-FileCopyrightText: 2014 Sebastian Kügler <sebas@kde.org>
0003  *
0004  *  SPDX-License-Identifier: LGPL-2.1-or-later
0005  */
0006 
0007 #include "qscreenoutput.h"
0008 
0009 #include <edid.h>
0010 #include <mode.h>
0011 #include <output.h>
0012 
0013 #include <QGuiApplication>
0014 
0015 using namespace KScreen;
0016 
0017 QScreenOutput::QScreenOutput(const QScreen *qscreen, QObject *parent)
0018     : QObject(parent)
0019     , m_qscreen(qscreen)
0020     , m_id(-1)
0021 {
0022 }
0023 
0024 QScreenOutput::~QScreenOutput()
0025 {
0026 }
0027 
0028 int QScreenOutput::id() const
0029 {
0030     return m_id;
0031 }
0032 
0033 void QScreenOutput::setId(const int newId)
0034 {
0035     m_id = newId;
0036 }
0037 
0038 const QScreen *QScreenOutput::qscreen() const
0039 {
0040     return m_qscreen;
0041 }
0042 
0043 OutputPtr QScreenOutput::toKScreenOutput() const
0044 {
0045     OutputPtr output(new Output);
0046     output->setId(m_id);
0047     output->setName(m_qscreen->name());
0048     updateKScreenOutput(output);
0049     return output;
0050 }
0051 
0052 void QScreenOutput::updateKScreenOutput(OutputPtr &output) const
0053 {
0054     // Initialize primary output
0055     output->setEnabled(true);
0056     output->setConnected(true);
0057 
0058     // Rotation - translate QScreen::primaryOrientation() to Output::rotation()
0059     if (m_qscreen->primaryOrientation() == Qt::PortraitOrientation) {
0060         // 90 degrees
0061         output->setRotation(Output::Right);
0062     } else if (m_qscreen->primaryOrientation() == Qt::InvertedLandscapeOrientation) {
0063         // 180 degrees
0064         output->setRotation(Output::Inverted);
0065     } else if (m_qscreen->primaryOrientation() == Qt::InvertedPortraitOrientation) {
0066         // 270 degrees
0067         output->setRotation(Output::Left);
0068     }
0069 
0070     // Physical size, geometry, etc.
0071     QSize mm;
0072     qreal physicalWidth;
0073     physicalWidth = m_qscreen->size().width() / (m_qscreen->physicalDotsPerInchX() / 25.4);
0074     mm.setWidth(qRound(physicalWidth));
0075     qreal physicalHeight;
0076     physicalHeight = m_qscreen->size().height() / (m_qscreen->physicalDotsPerInchY() / 25.4);
0077     mm.setHeight(qRound(physicalHeight));
0078     output->setSizeMm(mm);
0079     output->setPos(m_qscreen->availableGeometry().topLeft());
0080     output->setSize(m_qscreen->availableGeometry().size());
0081 
0082     // Modes: we create a single default mode and go with that
0083     ModePtr mode(new Mode);
0084     const QString modeid = QStringLiteral("defaultmode");
0085     mode->setId(modeid);
0086     mode->setRefreshRate(m_qscreen->refreshRate());
0087     mode->setSize(m_qscreen->size());
0088 
0089     const QString modename = QString::number(m_qscreen->size().width()) + QLatin1String("x") + QString::number(m_qscreen->size().height()) + QLatin1String("@")
0090         + QString::number(m_qscreen->refreshRate());
0091     mode->setName(modename);
0092 
0093     ModeList modes;
0094     modes[modeid] = mode;
0095     output->setModes(modes);
0096     output->setCurrentModeId(modeid);
0097 }