diff --git a/common/control.h b/common/control.h --- a/common/control.h +++ b/common/control.h @@ -38,7 +38,7 @@ ~Control() override = default; - bool writeFile(); + virtual bool writeFile(); protected: virtual QString dirPath() const; @@ -55,6 +55,8 @@ QVariantMap m_info; }; +class ControlOutput; + class ControlConfig : public Control { Q_OBJECT @@ -69,21 +71,28 @@ QString dirPath() const override; QString filePath() const override; + bool writeFile() override; + private: QVariantList getOutputs() const; void setOutputs(QVariantList outputsInfo); bool infoIsOutput(const QVariantMap &info, const QString &outputId, const QString &outputName) const; + ControlOutput* getOutputControl(const QString &outputId, const QString &outputName) const; KScreen::ConfigPtr m_config; QStringList m_duplicateOutputIds; + QVector m_outputsControls; }; class ControlOutput : public Control { Q_OBJECT public: explicit ControlOutput(KScreen::OutputPtr output, QObject *parent = nullptr); + QString id() const; + QString name() const; + // TODO: scale auto value QString dirPath() const override; diff --git a/common/control.cpp b/common/control.cpp --- a/common/control.cpp +++ b/common/control.cpp @@ -115,7 +115,6 @@ // As global outputs are indexed by a hash of their edid, which is not unique, // to be able to tell apart multiple identical outputs, these need special treatment - { QStringList allIds; const auto outputs = config->outputs(); allIds.reserve(outputs.count()); @@ -126,6 +125,9 @@ } allIds << outputId; } + + for (auto output : outputs) { + m_outputsControls << new ControlOutput(output, this); } // TODO: this is same in Output::readInOutputs of the daemon. Combine? @@ -147,6 +149,19 @@ return filePathFromHash(m_config->connectedOutputsHash()); } +bool ControlConfig::writeFile() +{ + bool success = true; + for (auto *outputControl : m_outputsControls) { + if (getOutputRetention(outputControl->id(), outputControl->name()) + == OutputRetention::Individual) { + continue; + } + success &= outputControl->writeFile(); + } + return success && Control::writeFile(); +} + bool ControlConfig::infoIsOutput(const QVariantMap &info, const QString &outputId, const QString &outputName) const { const QString outputIdInfo = info[QStringLiteral("id")].toString(); @@ -236,14 +251,34 @@ auto &infoMap = info(); infoMap[QStringLiteral("outputs")] = outputsInfo; } +ControlOutput* ControlConfig::getOutputControl(const QString &outputId, + const QString &outputName) const +{ + for (auto *control : m_outputsControls) { + if (control->id() == outputId && control->name() == outputName) { + return control; + } + } + return nullptr; +} ControlOutput::ControlOutput(KScreen::OutputPtr output, QObject *parent) : Control(parent) , m_output(output) { readFile(); } +QString ControlOutput::id() const +{ + return m_output->hashMd5(); +} + +QString ControlOutput::name() const +{ + return m_output->name(); +} + QString ControlOutput::dirPath() const { return Control::dirPath() % QStringLiteral("outputs/");