File indexing completed on 2024-04-28 16:45:05
0001 /* 0002 SPDX-FileCopyrightText: 2012 Alejandro Fiestas Olivares <afiestas@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "console.h" 0008 0009 #include <QDebug> 0010 #include <QDir> 0011 #include <QJsonDocument> 0012 #include <QJsonObject> 0013 #include <QStandardPaths> 0014 #include <QTextStream> 0015 0016 #include <kscreen/config.h> 0017 #include <kscreen/configmonitor.h> 0018 #include <kscreen/edid.h> 0019 #include <kscreen/getconfigoperation.h> 0020 #include <kscreen/mode.h> 0021 #include <kscreen/screen.h> 0022 #include <kscreen/types.h> 0023 0024 static QTextStream cout(stdout); 0025 0026 namespace KScreen 0027 { 0028 namespace ConfigSerializer 0029 { 0030 // Exported private symbol in configserializer_p.h in KScreen 0031 extern QJsonObject serializeConfig(const KScreen::ConfigPtr &config); 0032 } 0033 } 0034 0035 using namespace KScreen; 0036 0037 Console::Console(const ConfigPtr &config) 0038 : QObject() 0039 , m_config(config) 0040 { 0041 } 0042 0043 Console::~Console() 0044 { 0045 } 0046 0047 void Console::printConfig() 0048 { 0049 if (!m_config) { 0050 qDebug() << "Config is invalid, probably backend couldn't load"; 0051 return; 0052 } 0053 if (!m_config->screen()) { 0054 qDebug() << "No screen in the configuration, broken backend"; 0055 return; 0056 } 0057 0058 connect(m_config.data(), &Config::prioritiesChanged, [&]() { 0059 qDebug() << "Priorities changed:" << m_config.data()->outputs(); 0060 }); 0061 0062 qDebug() << "Screen:"; 0063 qDebug() << "\tmaxSize:" << m_config->screen()->maxSize(); 0064 qDebug() << "\tminSize:" << m_config->screen()->minSize(); 0065 qDebug() << "\tcurrentSize:" << m_config->screen()->currentSize(); 0066 0067 const OutputList outputs = m_config->outputs(); 0068 for (const OutputPtr &output : outputs) { 0069 qDebug() << "\n-----------------------------------------------------\n"; 0070 qDebug() << "Id: " << output->id(); 0071 qDebug() << "Name: " << output->name(); 0072 qDebug() << "Type: " << output->typeName(); 0073 qDebug() << "Connected: " << output->isConnected(); 0074 if (!output->isConnected()) { 0075 continue; 0076 } 0077 qDebug() << "Enabled: " << output->isEnabled(); 0078 qDebug() << "Priority: " << output->priority(); 0079 qDebug() << "Rotation: " << output->rotation(); 0080 qDebug() << "Pos: " << output->pos(); 0081 qDebug() << "MMSize: " << output->sizeMm(); 0082 qDebug() << "FollowPreferredMode: " << output->followPreferredMode(); 0083 if (output->currentMode()) { 0084 qDebug() << "Size: " << output->size(); 0085 } 0086 qDebug() << "Scale: " << output->scale(); 0087 if (output->clones().isEmpty()) { 0088 qDebug() << "Clones: " 0089 << "None"; 0090 } else { 0091 qDebug() << "Clones: " << output->clones().count(); 0092 } 0093 qDebug() << "Mode: " << output->currentModeId(); 0094 qDebug() << "Preferred Mode: " << output->preferredModeId(); 0095 qDebug() << "Preferred modes: " << output->preferredModes(); 0096 qDebug() << "Modes: "; 0097 0098 const ModeList modes = output->modes(); 0099 for (const ModePtr &mode : modes) { 0100 qDebug() << "\t" << mode->id() << " " << mode->name() << " " << mode->size() << " " << mode->refreshRate(); 0101 } 0102 0103 Edid *edid = output->edid(); 0104 qDebug() << "EDID Info: "; 0105 if (edid && edid->isValid()) { 0106 qDebug() << "\tDevice ID: " << edid->deviceId(); 0107 qDebug() << "\tName: " << edid->name(); 0108 qDebug() << "\tVendor: " << edid->vendor(); 0109 qDebug() << "\tSerial: " << edid->serial(); 0110 qDebug() << "\tEISA ID: " << edid->eisaId(); 0111 qDebug() << "\tHash: " << edid->hash(); 0112 qDebug() << "\tWidth: " << edid->width(); 0113 qDebug() << "\tHeight: " << edid->height(); 0114 qDebug() << "\tGamma: " << edid->gamma(); 0115 qDebug() << "\tRed: " << edid->red(); 0116 qDebug() << "\tGreen: " << edid->green(); 0117 qDebug() << "\tBlue: " << edid->blue(); 0118 qDebug() << "\tWhite: " << edid->white(); 0119 } else { 0120 qDebug() << "\tUnavailable"; 0121 } 0122 } 0123 } 0124 0125 void Console::printJSONConfig() 0126 { 0127 QJsonDocument doc(KScreen::ConfigSerializer::serializeConfig(m_config)); 0128 cout << doc.toJson(QJsonDocument::Indented); 0129 } 0130 0131 void Console::printSerializations() 0132 { 0133 QString path = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/kscreen/"); 0134 qDebug() << "Configs in: " << path; 0135 0136 QDir dir(path); 0137 const QStringList files = dir.entryList(QDir::Files); 0138 qDebug() << "Number of files: " << files.count() << Qt::endl; 0139 0140 QJsonDocument parser; 0141 for (const QString &fileName : files) { 0142 QJsonParseError error; 0143 qDebug() << fileName; 0144 QFile file(path + QLatin1Char('/') + fileName); 0145 file.open(QFile::ReadOnly); 0146 QJsonDocument parser = QJsonDocument::fromJson(file.readAll(), &error); 0147 if (error.error != QJsonParseError::NoError) { 0148 qDebug() << " can't parse file:"; 0149 qDebug() << " " << error.errorString(); 0150 } else { 0151 qDebug().noquote() << parser.toJson(QJsonDocument::Indented); 0152 } 0153 } 0154 } 0155 0156 void Console::monitor() 0157 { 0158 ConfigMonitor::instance()->addConfig(m_config); 0159 } 0160 0161 void Console::monitorAndPrint() 0162 { 0163 monitor(); 0164 connect(ConfigMonitor::instance(), &ConfigMonitor::configurationChanged, this, &Console::printConfig); 0165 }