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 }