KWin
Loading...
Searching...
No Matches
outputconfigurationstore.h
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2023 Xaver Hugl <xaver.hugl@gmail.com>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#pragma once
10
11#include "core/output.h"
12
13#include <QList>
14#include <QPoint>
15#include <QSize>
16#include <memory>
17#include <optional>
18#include <tuple>
19#include <unordered_map>
20
21class QOrientationReading;
22
23namespace KWin
24{
25
26class OutputConfiguration;
27
29{
30public:
33
34 enum class ConfigType {
37 };
38 std::optional<std::tuple<OutputConfiguration, QList<Output *>, ConfigType>> queryConfig(const QList<Output *> &outputs, bool isLidClosed, QOrientationReading *orientation, bool isTabletMode);
39
40 void storeConfig(const QList<Output *> &allOutputs, bool isLidClosed, const OutputConfiguration &config, const QList<Output *> &outputOrder);
41
42 bool isAutoRotateActive(const QList<Output *> &outputs, bool isTabletMode) const;
43
44private:
45 void applyOrientationReading(OutputConfiguration &config, const QList<Output *> &outputs, QOrientationReading *orientation, bool isTabletMode);
46 std::optional<std::pair<OutputConfiguration, QList<Output *>>> generateLidClosedConfig(const QList<Output *> &outputs);
47 std::pair<OutputConfiguration, QList<Output *>> generateConfig(const QList<Output *> &outputs, bool isLidClosed);
48 std::shared_ptr<OutputMode> chooseMode(Output *output) const;
49 double chooseScale(Output *output, OutputMode *mode) const;
50 double targetDpi(Output *output) const;
51 void load();
52 void save();
53
54 struct ModeData
55 {
56 QSize size;
57 uint32_t refreshRate;
58 };
59 struct OutputState
60 {
61 // identification data
62 std::optional<QString> edidIdentifier;
63 std::optional<QString> connectorName;
64 // empty if invalid
65 QString edidHash;
66 QString mstPath;
67 // actual state
68 std::optional<ModeData> mode;
69 std::optional<double> scale;
70 std::optional<OutputTransform> transform;
71 std::optional<OutputTransform> manualTransform;
72 std::optional<uint32_t> overscan;
73 std::optional<Output::RgbRange> rgbRange;
74 std::optional<VrrPolicy> vrrPolicy;
75 std::optional<bool> highDynamicRange;
76 std::optional<uint32_t> sdrBrightness;
77 std::optional<bool> wideColorGamut;
78 std::optional<Output::AutoRotationPolicy> autoRotation;
79 std::optional<QString> iccProfilePath;
80 std::optional<double> maxPeakBrightnessOverride;
81 std::optional<double> maxAverageBrightnessOverride;
82 std::optional<double> minBrightnessOverride;
83 std::optional<double> sdrGamutWideness;
84 };
85 struct SetupState
86 {
87 size_t outputIndex;
88 QPoint position;
89 bool enabled;
90 int priority;
91 };
92 struct Setup
93 {
94 bool lidClosed = false;
95 QList<SetupState> outputs;
96 };
97
98 std::pair<OutputConfiguration, QList<Output *>> setupToConfig(Setup *setup, const std::unordered_map<Output *, size_t> &outputMap) const;
99 std::optional<std::pair<Setup *, std::unordered_map<Output *, size_t>>> findSetup(const QList<Output *> &outputs, bool lidClosed);
100 std::optional<size_t> findOutput(Output *output, const QList<Output *> &allOutputs) const;
101
102 QList<OutputState> m_outputs;
103 QList<Setup> m_setups;
104};
105}
void storeConfig(const QList< Output * > &allOutputs, bool isLidClosed, const OutputConfiguration &config, const QList< Output * > &outputOrder)
std::optional< std::tuple< OutputConfiguration, QList< Output * >, ConfigType > > queryConfig(const QList< Output * > &outputs, bool isLidClosed, QOrientationReading *orientation, bool isTabletMode)
bool isAutoRotateActive(const QList< Output * > &outputs, bool isTabletMode) const