diff --git a/kcm/kcm.h b/kcm/kcm.h --- a/kcm/kcm.h +++ b/kcm/kcm.h @@ -33,8 +33,8 @@ Q_PROPERTY(OutputModel *outputModel READ outputModel NOTIFY outputModelChanged) - Q_PROPERTY(bool backendError READ backendError - NOTIFY backendErrorChanged) + Q_PROPERTY(bool backendReady READ backendReady + NOTIFY backendReadyChanged) Q_PROPERTY(bool screenNormalized READ screenNormalized NOTIFY screenNormalizedChanged) Q_PROPERTY(bool perOutputScaling READ perOutputScaling @@ -61,7 +61,7 @@ Q_INVOKABLE void identifyOutputs(); - bool backendError() const; + bool backendReady() const; Q_INVOKABLE QSize normalizeScreen() const; bool screenNormalized() const; @@ -80,7 +80,8 @@ void doSave(bool force); Q_SIGNALS: - void backendErrorChanged(); + void backendReadyChanged(); + void backendError(); void outputModelChanged(); void changed(); void screenNormalizedChanged(); @@ -95,7 +96,7 @@ void outputConnect(bool connected); private: - void setBackendError(bool error); + void setBackendReady(bool error); void setScreenNormalized(bool normalized); void fetchGlobalScale(); @@ -106,8 +107,10 @@ std::unique_ptr m_outputIdentifier; std::unique_ptr m_config; - bool m_backendError = false; + bool m_backendReady = false; bool m_screenNormalized = true; double m_globalScale = 1.; double m_initialGlobalScale = 1.; + + QTimer *m_loadCompressor; }; diff --git a/kcm/kcm.cpp b/kcm/kcm.cpp --- a/kcm/kcm.cpp +++ b/kcm/kcm.cpp @@ -65,18 +65,24 @@ QStringLiteral("subdiff@gmail.com")); setAboutData(about); setButtons(Apply); + + m_loadCompressor = new QTimer(this); + m_loadCompressor->setInterval(1000); + m_loadCompressor->setSingleShot(true); + connect (m_loadCompressor, &QTimer::timeout, this, &KCMKScreen::load); } void KCMKScreen::configReady(ConfigOperation *op) { qCDebug(KSCREEN_KCM) << "Reading in config now."; if (op->hasError()) { m_config.reset(); - setBackendError(true); + Q_EMIT backendError(); return; } m_config->setConfig(qobject_cast(op)->config()); + setBackendReady(true); Q_EMIT perOutputScalingChanged(); Q_EMIT primaryOutputSupportedChanged(); Q_EMIT outputReplicationSupportedChanged(); @@ -158,18 +164,18 @@ ); } -bool KCMKScreen::backendError() const +bool KCMKScreen::backendReady() const { - return m_backendError; + return m_backendReady; } -void KCMKScreen::setBackendError(bool error) +void KCMKScreen::setBackendReady(bool ready) { - if (m_backendError == error) { + if (m_backendReady == ready) { return; } - m_backendError = error; - Q_EMIT backendErrorChanged(); + m_backendReady = ready; + Q_EMIT backendReadyChanged(); } OutputModel* KCMKScreen::outputModel() const @@ -252,7 +258,7 @@ { qCDebug(KSCREEN_KCM) << "About to read in config."; - setBackendError(false); + setBackendReady(false); setNeedsSave(false); if (!screenNormalized()) { Q_EMIT screenNormalizedChanged(); @@ -265,8 +271,12 @@ this, &KCMKScreen::outputModelChanged); connect (m_config.get(), &ConfigHandler::outputConnect, this, [this](bool connected) { - load(); + Q_EMIT outputConnect(connected); + setBackendReady(false); + + // Reload settings delayed such that daemon can update output values. + m_loadCompressor->start(); }); connect (m_config.get(), &ConfigHandler::screenNormalizationUpdate, this, &KCMKScreen::setScreenNormalized); diff --git a/kcm/package/contents/ui/Output.qml b/kcm/package/contents/ui/Output.qml --- a/kcm/package/contents/ui/Output.qml +++ b/kcm/package/contents/ui/Output.qml @@ -41,11 +41,11 @@ visible: model.enabled && model.replicationSourceIndex === 0 onVisibleChanged: screen.resetTotalSize() - x: model.position.x / screen.relativeFactor + screen.xOffset - y: model.position.y / screen.relativeFactor + screen.yOffset + x: model.position ? model.position.x / screen.relativeFactor + screen.xOffset : 0 + y: model.position ? model.position.y / screen.relativeFactor + screen.yOffset : 0 - width: model.size.width / screen.relativeFactor - height: model.size.height / screen.relativeFactor + width: model.size ? model.size.width / screen.relativeFactor : 1 + height: model.size ? model.size.height / screen.relativeFactor : 1 SystemPalette { id: palette diff --git a/kcm/package/contents/ui/main.qml b/kcm/package/contents/ui/main.qml --- a/kcm/package/contents/ui/main.qml +++ b/kcm/package/contents/ui/main.qml @@ -104,7 +104,7 @@ } connectMsg.visible = true; } - onBackendErrorChanged: errBackendMsg.visible = kcm.backendError + onBackendError: errBackendMsg.visible = true; onChanged: { dangerousSaveMsg.visible = false; @@ -120,12 +120,13 @@ Layout.preferredWidth: Math.max(root.width * 0.8, units.gridUnit * 26) Layout.topMargin: Kirigami.Units.smallSpacing Layout.bottomMargin: Kirigami.Units.largeSpacing * 2 - enabled: kcm.outputModel && !kcm.backendError + + enabled: kcm.outputModel && kcm.backendReady outputs: kcm.outputModel } Panel { - enabled: kcm.outputModel && !kcm.backendError + enabled: kcm.outputModel && kcm.backendReady Layout.fillWidth: true } }