1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
// SPDX-FileCopyrightText: 2023 by Devin Lin <devin@kde.org>
// SPDX-License-Identifier: GPL-2.0-or-later
#include "prepareutil.h"
#include <kscreen/configmonitor.h>
#include <kscreen/getconfigoperation.h>
#include <kscreen/output.h>
#include <kscreen/setconfigoperation.h>
#include <QDBusPendingCallWatcher>
#include <QDBusPendingReply>
#include <QProcess>
PrepareUtil::PrepareUtil(QObject *parent)
: QObject{parent}
, m_colorsSettings{new ColorsSettings(this)}
{
initKScreen([]() { });
// set property initially
m_usingDarkTheme = m_colorsSettings->colorScheme() == "BreezeDark";
}
void PrepareUtil::initKScreen(std::function<void()> callback)
{
connect(new KScreen::GetConfigOperation(), &KScreen::GetConfigOperation::finished, this, [this, callback](auto *op) {
m_config = qobject_cast<KScreen::GetConfigOperation *>(op)->config();
if (!m_config) {
qDebug() << "PrepareUtil: Failed to get kscreen config, attempting again";
initKScreen(callback);
return;
}
KScreen::ConfigMonitor::instance()->addConfig(m_config);
int scaling = 100;
// To determine the scaling value:
// Try to take the primary display's scaling, otherwise use the scaling of any of the displays
for (KScreen::OutputPtr output : m_config->outputs()) {
if (!output) {
continue;
}
scaling = output->scale() * 100;
m_output = output->id();
if (output->isPrimary()) {
break;
}
}
m_scaling = scaling;
Q_EMIT scalingChanged();
callback();
});
}
int PrepareUtil::scaling() const
{
return m_scaling;
}
void PrepareUtil::setScaling(int scaling)
{
if (!m_config) {
initKScreen([this, scaling]() {
setScalingInternal(scaling);
});
return;
}
setScalingInternal(scaling);
}
void PrepareUtil::setScalingInternal(int scaling)
{
const auto outputs = m_config->outputs();
qreal scalingNum = ((double)scaling) / 100;
for (KScreen::OutputPtr output : outputs) {
if (!output) {
continue;
}
if (output->id() == m_output) {
output->setScale(scalingNum);
}
}
auto setop = new KScreen::SetConfigOperation(m_config, this);
setop->exec();
m_scaling = scaling;
Q_EMIT scalingChanged();
}
QStringList PrepareUtil::scalingOptions()
{
return {"50%", "75%", "100%", "125%", "150%", "175%", "200%", "225%", "250%", "275%", "300%"};
}
bool PrepareUtil::usingDarkTheme() const
{
return m_usingDarkTheme;
}
void PrepareUtil::setUsingDarkTheme(bool usingDarkTheme)
{
// use plasma-apply-colorscheme since it has logic for notifying the shell of changes
if (usingDarkTheme) {
QProcess::execute("plasma-apply-colorscheme", {QStringLiteral("BreezeDark")});
} else {
QProcess::execute("plasma-apply-colorscheme", {QStringLiteral("BreezeLight")});
}
m_usingDarkTheme = usingDarkTheme;
Q_EMIT usingDarkThemeChanged();
}
|