kscreen: Retry fetching config if kscreen gives nullptr

Apparently GetConfigOperation can retrieve a nullptr config, in which
case we just need to retry until kscreen gives us something.
This commit is contained in:
Devin Lin 2025-12-05 00:04:02 -05:00
parent 1bdd4bf1ee
commit 088c0d985b
6 changed files with 26 additions and 7 deletions

View file

@ -58,15 +58,17 @@ void PanelSettingsDBusObjectManager::registerObjects()
return;
}
m_initialized = true;
// Fetch kscreen config
connect(new KScreen::GetConfigOperation(), &KScreen::GetConfigOperation::finished, this, [this](auto *op) {
m_kscreenConfig = qobject_cast<KScreen::GetConfigOperation *>(op)->config();
if (!m_kscreenConfig) {
qDebug() << "PanelSettingsDBusObjectManager: Failed to get kscreen config, attempting again";
registerObjects();
return;
}
m_initialized = true;
KScreen::ConfigMonitor::instance()->addConfig(m_kscreenConfig);
// Listen to all new screens and create a new output

View file

@ -53,10 +53,20 @@ RotationUtil::Rotation mapRotation(KScreen::Output::Rotation rotation)
RotationUtil::RotationUtil(QObject *parent)
: QObject{parent}
, m_sensor{new QOrientationSensor(this)}
{
retrieveKScreen();
connect(m_sensor, &QOrientationSensor::readingChanged, this, &RotationUtil::updateShowRotationButton);
m_sensor->start();
}
void RotationUtil::retrieveKScreen()
{
connect(new KScreen::GetConfigOperation(), &KScreen::GetConfigOperation::finished, this, [this](auto *op) {
m_config = qobject_cast<KScreen::GetConfigOperation *>(op)->config();
if (!m_config) {
qDebug() << "RotationUtil: Failed to get kscreen config, attempting again";
retrieveKScreen();
return;
}
KScreen::ConfigMonitor::instance()->addConfig(m_config);
@ -71,9 +81,6 @@ RotationUtil::RotationUtil(QObject *parent)
connect(output.data(), &KScreen::Output::autoRotatePolicyChanged, this, &RotationUtil::updateShowRotationButton);
});
});
connect(m_sensor, &QOrientationSensor::readingChanged, this, &RotationUtil::updateShowRotationButton);
m_sensor->start();
}
void RotationUtil::rotateToSuggestedRotation()

View file

@ -47,6 +47,8 @@ private Q_SLOTS:
void updateShowRotationButton();
private:
void retrieveKScreen();
bool m_showRotationButton{false};
KScreen::Output::Rotation m_rotateTo;
Rotation m_deviceRotation;

View file

@ -26,10 +26,12 @@ 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;

View file

@ -20,11 +20,15 @@ KScreenOSDUtil::KScreenOSDUtil(QObject *parent)
}
setOutputs(m_config->outputs().size());
});
}
void KScreenOSDUtil::retrieveKScreen()
{
connect(new KScreen::GetConfigOperation(), &KScreen::GetConfigOperation::finished, this, [this](auto *op) {
m_config = qobject_cast<KScreen::GetConfigOperation *>(op)->config();
if (!m_config) {
qDebug() << "kscreenosdutil: Unable to obtain kscreen config";
qDebug() << "kscreenosdutil: Unable to obtain kscreen config, attempting again";
retrieveKScreen();
return;
}
KScreen::ConfigMonitor::instance()->addConfig(m_config);

View file

@ -23,6 +23,8 @@ Q_SIGNALS:
void outputsChanged();
private:
void retrieveKScreen();
KScreen::ConfigPtr m_config{nullptr};
int m_outputs{0};