File indexing completed on 2024-04-28 05:27:37

0001 /*
0002     SPDX-FileCopyrightText: 2019 Roman Gilg <subdiff@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 #pragma once
0007 
0008 #include <kscreen/output.h>
0009 #include <kscreen/types.h>
0010 
0011 #include <QList>
0012 #include <QObject>
0013 #include <QVariantMap>
0014 
0015 class KDirWatch;
0016 
0017 class Control : public QObject
0018 {
0019     Q_OBJECT
0020 public:
0021     explicit Control(QObject *parent = nullptr);
0022 
0023     ~Control() override = default;
0024 
0025     virtual bool writeFile();
0026     virtual void activateWatcher();
0027 
0028 Q_SIGNALS:
0029     void changed();
0030 
0031 protected:
0032     virtual QString dirPath() const;
0033     virtual QString filePath() const = 0;
0034     QString filePathFromHash(const QString &hash) const;
0035     void readFile();
0036     QVariantMap &info();
0037     const QVariantMap &constInfo() const;
0038     KDirWatch *watcher() const;
0039 
0040 private:
0041     static QString s_dirName;
0042     QVariantMap m_info;
0043     KDirWatch *m_watcher = nullptr;
0044 };
0045 
0046 class ControlOutput;
0047 
0048 class ControlConfig : public Control
0049 {
0050     Q_OBJECT
0051 public:
0052     explicit ControlConfig(KScreen::ConfigPtr config, QObject *parent = nullptr);
0053 
0054     qreal getScale(const KScreen::OutputPtr &output) const;
0055     void setScale(const KScreen::OutputPtr &output, qreal value);
0056 
0057     KScreen::OutputPtr getReplicationSource(const KScreen::OutputPtr &output) const;
0058     void setReplicationSource(const KScreen::OutputPtr &output, const KScreen::OutputPtr &source);
0059 
0060     uint32_t getOverscan(const KScreen::OutputPtr &output) const;
0061     void setOverscan(const KScreen::OutputPtr &output, const uint32_t value);
0062 
0063     KScreen::Output::VrrPolicy getVrrPolicy(const KScreen::OutputPtr &output) const;
0064     void setVrrPolicy(const KScreen::OutputPtr &output, const KScreen::Output::VrrPolicy value);
0065 
0066     KScreen::Output::RgbRange getRgbRange(const KScreen::OutputPtr &output) const;
0067     void setRgbRange(const KScreen::OutputPtr &output, const KScreen::Output::RgbRange value);
0068 
0069     QString dirPath() const override;
0070     QString filePath() const override;
0071 
0072     bool writeFile() override;
0073     void activateWatcher() override;
0074 
0075 private:
0076     QVariantList getOutputs() const;
0077     void setOutputs(QVariantList outputsInfo);
0078     bool infoIsOutput(const QVariantMap &info, const QString &outputId, const QString &outputName) const;
0079     ControlOutput *getOutputControl(const QString &outputId, const QString &outputName) const;
0080 
0081     template<typename T, typename F>
0082     T get(const KScreen::OutputPtr &output, F globalRetentionFunc, T defaultValue) const;
0083     template<typename T, typename F, typename V>
0084     void set(const KScreen::OutputPtr &output, const QString &name, F globalRetentionFunc, V value);
0085 
0086     KScreen::ConfigPtr m_config;
0087     QStringList m_duplicateOutputIds;
0088     QList<ControlOutput *> m_outputsControls;
0089 };
0090 
0091 class ControlOutput : public Control
0092 {
0093     Q_OBJECT
0094 public:
0095     explicit ControlOutput(KScreen::OutputPtr output, QObject *parent = nullptr);
0096 
0097     QString id() const;
0098     QString name() const;
0099 
0100     // TODO: scale auto value
0101 
0102     qreal getScale() const;
0103     void setScale(qreal value);
0104 
0105     uint32_t overscan() const;
0106     void setOverscan(uint32_t value);
0107 
0108     KScreen::Output::VrrPolicy vrrPolicy() const;
0109     void setVrrPolicy(KScreen::Output::VrrPolicy value);
0110 
0111     KScreen::Output::RgbRange rgbRange() const;
0112     void setRgbRange(KScreen::Output::RgbRange value);
0113 
0114     QString dirPath() const override;
0115     QString filePath() const override;
0116 
0117 private:
0118     KScreen::OutputPtr m_output;
0119 };