kwin/src/outputconfigurationstore.h
Xaver Hugl e2878e912a core: move vrr and tearing control out of RenderLoop
This way the vrr setting is in Output like all the other settings, and the
RenderLoop can handle tearing not working better too
2024-01-08 17:41:13 +01:00

104 lines
3.4 KiB
C++

/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2023 Xaver Hugl <xaver.hugl@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#pragma once
#include "core/output.h"
#include <QList>
#include <QPoint>
#include <QSize>
#include <memory>
#include <optional>
#include <tuple>
#include <unordered_map>
class QOrientationReading;
namespace KWin
{
class OutputConfiguration;
class OutputConfigurationStore
{
public:
OutputConfigurationStore();
~OutputConfigurationStore();
enum class ConfigType {
Preexisting,
Generated,
};
std::optional<std::tuple<OutputConfiguration, QList<Output *>, ConfigType>> queryConfig(const QList<Output *> &outputs, bool isLidClosed, QOrientationReading *orientation, bool isTabletMode);
void storeConfig(const QList<Output *> &allOutputs, bool isLidClosed, const OutputConfiguration &config, const QList<Output *> &outputOrder);
bool isAutoRotateActive(const QList<Output *> &outputs, bool isTabletMode) const;
private:
void applyOrientationReading(OutputConfiguration &config, const QList<Output *> &outputs, QOrientationReading *orientation, bool isTabletMode);
std::optional<std::pair<OutputConfiguration, QList<Output *>>> generateLidClosedConfig(const QList<Output *> &outputs);
std::pair<OutputConfiguration, QList<Output *>> generateConfig(const QList<Output *> &outputs, bool isLidClosed);
std::shared_ptr<OutputMode> chooseMode(Output *output) const;
double chooseScale(Output *output, OutputMode *mode) const;
double targetDpi(Output *output) const;
void load();
void save();
struct ModeData
{
QSize size;
uint32_t refreshRate;
};
struct OutputState
{
// identification data
std::optional<QString> edidIdentifier;
std::optional<QString> connectorName;
// empty if invalid
QString mstPath;
// actual state
std::optional<ModeData> mode;
std::optional<double> scale;
std::optional<OutputTransform> transform;
std::optional<OutputTransform> manualTransform;
std::optional<uint32_t> overscan;
std::optional<Output::RgbRange> rgbRange;
std::optional<VrrPolicy> vrrPolicy;
std::optional<bool> highDynamicRange;
std::optional<uint32_t> sdrBrightness;
std::optional<bool> wideColorGamut;
std::optional<Output::AutoRotationPolicy> autoRotation;
std::optional<QString> iccProfilePath;
std::optional<double> maxPeakBrightnessOverride;
std::optional<double> maxAverageBrightnessOverride;
std::optional<double> minBrightnessOverride;
std::optional<double> sdrGamutWideness;
};
struct SetupState
{
size_t outputIndex;
QPoint position;
bool enabled;
int priority;
};
struct Setup
{
bool lidClosed = false;
QList<SetupState> outputs;
};
std::pair<OutputConfiguration, QList<Output *>> setupToConfig(Setup *setup, const std::unordered_map<Output *, size_t> &outputMap) const;
std::optional<std::pair<Setup *, std::unordered_map<Output *, size_t>>> findSetup(const QList<Output *> &outputs, bool lidClosed);
std::optional<size_t> findOutput(Output *output, const QList<Output *> &allOutputs) const;
QList<OutputState> m_outputs;
QList<Setup> m_setups;
};
}