Group :: Graphical desktop/KDE
RPM: plasma5-kscreen
Main Changelog Spec Patches Sources Download Gear Bugs and FR Repocop
Patch: alt-enable-per-screen-scaling.patch
Download
Download
--- a/kcm/src/scalingconfig.cpp
+++ b/kcm/src/scalingconfig.cpp
@@ -30,9 +30,9 @@
//slider can only handle ints so goes 10-30
#define SLIDER_RATIO 10.0
-ScalingConfig::ScalingConfig(const KScreen::OutputList &outputList, QWidget* parent):
+ScalingConfig::ScalingConfig(const KScreen::OutputPtr &output, QWidget* parent):
QDialog(parent),
- m_outputList(outputList)
+ m_output(output)
{
ui.setupUi(this);
@@ -50,6 +50,8 @@ ScalingConfig::ScalingConfig(const KScre
ui.previewWidget->setScale(1);
ui.scaleLabel->setText(QString::number(1));
+
+ this->setWindowTitle(this->windowTitle() + QLatin1String(" : ") + m_output->name());
load();
}
@@ -61,35 +63,58 @@ ScalingConfig::~ScalingConfig()
void ScalingConfig::load()
{
//we load UI from a config, as rdb value might not be updated yet
+ qreal screenDpi = 1.0;
+ QString screenFactor = QString::number(screenDpi);
auto config = KSharedConfig::openConfig(QStringLiteral("kdeglobals"));
- const qreal dpi = config->group("KScreen").readEntry("ScaleFactor", 1.0);
-
- m_initialScalingFactor = dpi;
- ui.scaleSlider->setValue(dpi * SLIDER_RATIO);
+ QString readScreenFactors = config->group("KScreen").readEntry(
+ "ScreenScaleFactors", "");
+ QString searchName = m_output->name() + QLatin1Char('=');
+ if (readScreenFactors.contains(searchName)) {
+ foreach (const QString &str, readScreenFactors.split(QLatin1Char(';'), QString::SkipEmptyParts)) {
+ if (str.startsWith(searchName)) {
+ screenFactor = str.mid(str.indexOf(QLatin1Char('=')) + 1);
+ break;
+ }
+ }
+ bool convertionResult = false;
+ screenDpi = screenFactor.toDouble(&convertionResult);
+ if (!convertionResult) {
+ screenDpi = 1.0;
+ }
+ }
+ ui.scaleSlider->setValue(screenDpi * SLIDER_RATIO);
}
void ScalingConfig::accept()
{
- if (qFuzzyCompare(scaleFactor(), m_initialScalingFactor)) {
- QDialog::accept();
- return;
- }
const qreal scalingFactor = scaleFactor();
//save to config
- auto config = KSharedConfig::openConfig(QStringLiteral("kdeglobals"));
- config->group("KScreen").writeEntry("ScaleFactor", scalingFactor);
//write env var to be used by startkde.sh to populate the QT_SCREEN_SCALE_FACTORS env var
//we use QT_SCREEN_SCALE_FACTORS as opposed to QT_SCALE_FACTOR as we need to use one that will *NOT* scale fonts according to the scale
//scaling the fonts makes sense if you don't also set a font DPI, but we *need* to set a font DPI for both PlasmaShell which does it's own thing, and for KDE4/GTK2 applications
-
+ auto config = KSharedConfig::openConfig(QStringLiteral("kdeglobals"));
+ QString readScreenFactors = config->group("KScreen").readEntry("ScreenScaleFactors", "");
QString screenFactors;
- foreach (const KScreen::OutputPtr &output, m_outputList) {
- screenFactors.append(output->name() + QLatin1Char('=') + QString::number(scalingFactor) + QLatin1Char(';'));
+ QString searchName = m_output->name() + QLatin1Char('=');
+ if (readScreenFactors.contains(searchName)) {
+ foreach (const QString &str, readScreenFactors.split(QLatin1Char(';'), QString::SkipEmptyParts)) {
+ if (!str.startsWith(searchName)) {
+ screenFactors += str + QLatin1Char(';');
+ }
+ }
+ screenFactors += searchName + QString::number(scalingFactor) + QLatin1Char(';');
+ } else {
+ screenFactors = readScreenFactors + searchName + QString::number(scalingFactor) + QLatin1Char(';');
}
config->group("KScreen").writeEntry("ScreenScaleFactors", screenFactors);
+ if (!m_output->isPrimary()) {
+ QDialog::accept();
+ return;
+ }
+ config->group("KScreen").writeEntry("ScaleFactor", scalingFactor);
KConfig fontConfig(QStringLiteral("kcmfonts"));
auto fontConfigGroup = fontConfig.group("General");
--- a/kcm/src/scalingconfig.h
+++ b/kcm/src/scalingconfig.h
@@ -30,7 +30,7 @@ class ScalingConfig : public QDialog
{
Q_OBJECT
public:
- explicit ScalingConfig(const KScreen::OutputList &outputList, QWidget* parent = nullptr);
+ explicit ScalingConfig(const KScreen::OutputPtr &output, QWidget* parent = nullptr);
~ScalingConfig() override;
protected:
@@ -41,7 +41,7 @@ private:
int scaleDPI() const;
Ui::Scaling ui;
qreal m_initialScalingFactor = 1.0;
- KScreen::OutputList m_outputList;
+ KScreen::OutputPtr m_output;
};
#endif // SCALINGCONFIG_H
--- a/kcm/src/widget.cpp
+++ b/kcm/src/widget.cpp
@@ -73,9 +73,11 @@ Widget::Widget(QWidget *parent)
connect(ui->scaleAllOutputsButton, &QPushButton::released,
[this] {
- QPointer<ScalingConfig> dialog = new ScalingConfig(mConfig->outputs(), this);
- dialog->exec();
- delete dialog;
+ if (mSelectedOutput) {
+ QPointer<ScalingConfig> dialog = new ScalingConfig(mSelectedOutput, this);
+ dialog->exec();
+ delete dialog;
+ }
});
mOutputTimer = new QTimer(this);
@@ -216,6 +218,7 @@ void Widget::addOutputToPrimaryCombo(con
void Widget::slotFocusedOutputChanged(QMLOutput *output)
{
mControlPanel->activateOutput(output->outputPtr());
+ mSelectedOutput = output->outputPtr();
}
void Widget::slotOutputEnabledChanged()
@@ -302,6 +305,7 @@ void Widget::slotUnifyOutputs()
ui->primaryCombo->setEnabled(false);
mControlPanel->setUnifiedOutput(base->outputPtr());
+ mSelectedOutput = base->outputPtr();
ui->unifyButton->setText(i18n("Break Unified Outputs"));
}
--- a/kcm/src/widget.h
+++ b/kcm/src/widget.h
@@ -93,6 +93,7 @@ class Widget : public QWidget
QMLScreen *mScreen = nullptr;
KScreen::ConfigPtr mConfig = nullptr;
KScreen::ConfigPtr mPrevConfig = nullptr;
+ KScreen::OutputPtr mSelectedOutput = nullptr;
ControlPanel *mControlPanel = nullptr;