File indexing completed on 2025-03-16 05:04:46
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 }