diff --git a/screen/qt5/screen.cpp b/screen/qt5/screen.cpp index 6771c38..8db3f7a 100644 --- a/screen/qt5/screen.cpp +++ b/screen/qt5/screen.cpp @@ -4,12 +4,84 @@ #include #include +#include #include #include #include +#include #include +static QString displayOutputKey(const KScreen::OutputPtr &output) +{ + if (!output) { + return QString(); + } + + QString key = output->hashMd5(); + if (key.isEmpty()) { + key = output->name(); + } + if (key.isEmpty()) { + key = QString::number(output->id()); + } + return key.replace(QLatin1Char('/'), QLatin1Char('_')); +} + +static void saveDisplayConfiguration(const KScreen::ConfigPtr &config) +{ + if (!config) { + return; + } + + QSettings settings(QSettings::UserScope, QStringLiteral("cutefishos"), QStringLiteral("display")); + settings.setValue(QStringLiteral("Version"), 1); + settings.beginGroup(QStringLiteral("Outputs")); + const KScreen::OutputList outputs = config->outputs(); + for (auto it = outputs.cbegin(); it != outputs.cend(); ++it) { + const KScreen::OutputPtr output = it.value(); + if (!output || !output->isConnected()) { + continue; + } + + settings.beginGroup(displayOutputKey(output)); + settings.setValue(QStringLiteral("Name"), output->name()); + settings.setValue(QStringLiteral("Enabled"), output->isEnabled()); + settings.setValue(QStringLiteral("Priority"), output->priority()); + settings.setValue(QStringLiteral("PositionX"), output->pos().x()); + settings.setValue(QStringLiteral("PositionY"), output->pos().y()); + settings.setValue(QStringLiteral("Scale"), output->scale()); + settings.setValue(QStringLiteral("Rotation"), static_cast(output->rotation())); + + if (const KScreen::ModePtr mode = output->currentMode()) { + settings.setValue(QStringLiteral("ModeId"), mode->id()); + settings.setValue(QStringLiteral("ModeWidth"), mode->size().width()); + settings.setValue(QStringLiteral("ModeHeight"), mode->size().height()); + settings.setValue(QStringLiteral("ModeRefreshRate"), mode->refreshRate()); + } + settings.endGroup(); + } + settings.endGroup(); + settings.sync(); + + KScreen::OutputPtr primary = config->primaryOutput(); + if (!primary) { + for (const KScreen::OutputPtr &output : config->connectedOutputs()) { + if (output && output->isEnabled()) { + primary = output; + break; + } + } + } + if (primary) { + QSettings themeSettings(QSettings::UserScope, + QStringLiteral("cutefishos"), + QStringLiteral("theme")); + themeSettings.setValue(QStringLiteral("PixelRatio"), primary->scale()); + themeSettings.sync(); + } +} + KScreenScreen::KScreenScreen(QObject *parent) : QObject(parent) , m_outputModel(new KScreenOutputModel(this)) @@ -76,6 +148,10 @@ void KScreenScreen::save() } m_applying = true; + // Cutefish owns the persistent display configuration. KWin is only the + // live display server to which this snapshot is applied. + saveDisplayConfiguration(m_config); + KScreen::SetConfigOperation operation(m_config, this); const bool applied = operation.exec() && !operation.hasError(); if (!applied) {