Apply only the settings keys given, rather than copying the whole settings

These keyed applySettings copied the whole settings struct on every message. A GUI sends
messages with no keys while its window is being laid out, carrying its own copy of the
settings, and one arriving after an API patch but before the GUI has seen it wrote the old
values back, so the patched value was lost and the API read back what it had replaced. The AIS
demodulator lost the inputFrequencyOffset set at creation this way.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Jon Beniston
2026-09-13 15:24:42 +01:00
co-authored by Claude Opus 5
parent 345ccdf6e9
commit da31464dd2
9 changed files with 45 additions and 9 deletions
@@ -161,7 +161,11 @@ void ChannelAnalyzerBaseband::applySettings(const ChannelAnalyzerSettings& setti
}
m_sink.applySettings(settings, settingsKeys, force);
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
int ChannelAnalyzerBaseband::getChannelSampleRate() const
+5 -1
View File
@@ -324,7 +324,11 @@ void AISDemod::applySettings(const AISDemodSettings& settings, const QStringList
}
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
QByteArray AISDemod::serialize() const
+5 -1
View File
@@ -395,7 +395,11 @@ void LocalSink::applySettings(const LocalSinkSettings& settings, const QList<QSt
sendChannelSettings(pipes, settingsKeys, settings, force);
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
void LocalSink::validateFilterChainHash(LocalSinkSettings& settings)
@@ -111,7 +111,11 @@ void AntennaTools::applySettings(const AntennaToolsSettings& settings, const QLi
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
int AntennaTools::webapiSettingsGet(
+5 -1
View File
@@ -237,7 +237,11 @@ void APRS::applySettings(const APRSSettings& settings, const QList<QString>& set
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
int APRS::webapiRun(bool run,
@@ -184,7 +184,11 @@ void JogdialController::applySettings(const JogdialControllerSettings& settings,
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
void JogdialController::updateChannels()
+5 -1
View File
@@ -206,7 +206,11 @@ void PERTester::applySettings(const PERTesterSettings& settings, const QList<QSt
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
int PERTester::webapiRun(bool run,
+5 -1
View File
@@ -267,7 +267,11 @@ void StarTracker::applySettings(const StarTrackerSettings& settings, const QList
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
int StarTracker::webapiRun(bool run,
@@ -357,7 +357,11 @@ void VORLocalizer::applySettings(const VORLocalizerSettings& settings, const QLi
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
void VORLocalizer::updateChannels()