File indexing completed on 2024-04-28 05:30:26

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2023 Xaver Hugl <xaver.hugl@gmail.com>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 #pragma once
0010 
0011 #include "core/output.h"
0012 
0013 #include <QList>
0014 #include <QPoint>
0015 #include <QSize>
0016 #include <memory>
0017 #include <optional>
0018 #include <tuple>
0019 #include <unordered_map>
0020 
0021 class QOrientationReading;
0022 
0023 namespace KWin
0024 {
0025 
0026 class OutputConfiguration;
0027 
0028 class OutputConfigurationStore
0029 {
0030 public:
0031     OutputConfigurationStore();
0032     ~OutputConfigurationStore();
0033 
0034     enum class ConfigType {
0035         Preexisting,
0036         Generated,
0037     };
0038     std::optional<std::tuple<OutputConfiguration, QList<Output *>, ConfigType>> queryConfig(const QList<Output *> &outputs, bool isLidClosed, QOrientationReading *orientation, bool isTabletMode);
0039 
0040     void storeConfig(const QList<Output *> &allOutputs, bool isLidClosed, const OutputConfiguration &config, const QList<Output *> &outputOrder);
0041 
0042     bool isAutoRotateActive(const QList<Output *> &outputs, bool isTabletMode) const;
0043 
0044 private:
0045     void applyOrientationReading(OutputConfiguration &config, const QList<Output *> &outputs, QOrientationReading *orientation, bool isTabletMode);
0046     std::optional<std::pair<OutputConfiguration, QList<Output *>>> generateLidClosedConfig(const QList<Output *> &outputs);
0047     std::pair<OutputConfiguration, QList<Output *>> generateConfig(const QList<Output *> &outputs, bool isLidClosed);
0048     std::shared_ptr<OutputMode> chooseMode(Output *output) const;
0049     double chooseScale(Output *output, OutputMode *mode) const;
0050     double targetDpi(Output *output) const;
0051     void load();
0052     void save();
0053 
0054     struct ModeData
0055     {
0056         QSize size;
0057         uint32_t refreshRate;
0058     };
0059     struct OutputState
0060     {
0061         // identification data
0062         std::optional<QString> edidIdentifier;
0063         std::optional<QString> connectorName;
0064         // empty if invalid
0065         QString edidHash;
0066         QString mstPath;
0067         // actual state
0068         std::optional<ModeData> mode;
0069         std::optional<double> scale;
0070         std::optional<OutputTransform> transform;
0071         std::optional<OutputTransform> manualTransform;
0072         std::optional<uint32_t> overscan;
0073         std::optional<Output::RgbRange> rgbRange;
0074         std::optional<VrrPolicy> vrrPolicy;
0075         std::optional<bool> highDynamicRange;
0076         std::optional<uint32_t> sdrBrightness;
0077         std::optional<bool> wideColorGamut;
0078         std::optional<Output::AutoRotationPolicy> autoRotation;
0079         std::optional<QString> iccProfilePath;
0080         std::optional<double> maxPeakBrightnessOverride;
0081         std::optional<double> maxAverageBrightnessOverride;
0082         std::optional<double> minBrightnessOverride;
0083         std::optional<double> sdrGamutWideness;
0084     };
0085     struct SetupState
0086     {
0087         size_t outputIndex;
0088         QPoint position;
0089         bool enabled;
0090         int priority;
0091     };
0092     struct Setup
0093     {
0094         bool lidClosed = false;
0095         QList<SetupState> outputs;
0096     };
0097 
0098     std::pair<OutputConfiguration, QList<Output *>> setupToConfig(Setup *setup, const std::unordered_map<Output *, size_t> &outputMap) const;
0099     std::optional<std::pair<Setup *, std::unordered_map<Output *, size_t>>> findSetup(const QList<Output *> &outputs, bool lidClosed);
0100     std::optional<size_t> findOutput(Output *output, const QList<Output *> &allOutputs) const;
0101 
0102     QList<OutputState> m_outputs;
0103     QList<Setup> m_setups;
0104 };
0105 }