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 }