From f0dd24e8bd7b6a7ec2fbfc335999724009865c22 Mon Sep 17 00:00:00 2001 From: Devin Lin Date: Tue, 25 Nov 2025 11:17:54 -0500 Subject: [PATCH] initialstart/prepare: Gracefully handle kscreen late start and null checks Handle situations where the GetConfigOperation never succeeds (really early start of initialstart) with callbacks so users can still set the scale. Also guard more aggressively against nullptr --- initialstart/modules/prepare/prepareutil.cpp | 34 ++++++++++++++++---- initialstart/modules/prepare/prepareutil.h | 3 ++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/initialstart/modules/prepare/prepareutil.cpp b/initialstart/modules/prepare/prepareutil.cpp index ff4c03d5..ec3c8a14 100644 --- a/initialstart/modules/prepare/prepareutil.cpp +++ b/initialstart/modules/prepare/prepareutil.cpp @@ -16,18 +16,30 @@ PrepareUtil::PrepareUtil(QObject *parent) : QObject{parent} , m_colorsSettings{new ColorsSettings(this)} { - connect(new KScreen::GetConfigOperation(), &KScreen::GetConfigOperation::finished, this, [this](auto *op) { + initKScreen([]() { }); + + // set property initially + m_usingDarkTheme = m_colorsSettings->colorScheme() == "BreezeDark"; +} + +void PrepareUtil::initKScreen(std::function callback) +{ + connect(new KScreen::GetConfigOperation(), &KScreen::GetConfigOperation::finished, this, [this, callback](auto *op) { m_config = qobject_cast(op)->config(); if (!m_config) { 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 + // 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()) { @@ -37,10 +49,9 @@ PrepareUtil::PrepareUtil(QObject *parent) m_scaling = scaling; Q_EMIT scalingChanged(); - }); - // set property initially - m_usingDarkTheme = m_colorsSettings->colorScheme() == "BreezeDark"; + callback(); + }); } int PrepareUtil::scaling() const @@ -51,13 +62,24 @@ int PrepareUtil::scaling() const 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); } diff --git a/initialstart/modules/prepare/prepareutil.h b/initialstart/modules/prepare/prepareutil.h index 15260573..f3c9768e 100644 --- a/initialstart/modules/prepare/prepareutil.h +++ b/initialstart/modules/prepare/prepareutil.h @@ -33,6 +33,9 @@ Q_SIGNALS: void usingDarkThemeChanged(); private: + void initKScreen(std::function callback); + void setScalingInternal(int scaling); + int m_scaling; bool m_usingDarkTheme;