From da31464dd2a956e7e875b0b22e3034d64fb5ab42 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Sun, 13 Sep 2026 15:24:42 +0100 Subject: [PATCH] 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 --- plugins/channelrx/chanalyzer/chanalyzerbaseband.cpp | 6 +++++- plugins/channelrx/demodais/aisdemod.cpp | 6 +++++- plugins/channelrx/localsink/localsink.cpp | 6 +++++- plugins/feature/antennatools/antennatools.cpp | 6 +++++- plugins/feature/aprs/aprs.cpp | 6 +++++- plugins/feature/jogdialcontroller/jogdialcontroller.cpp | 6 +++++- plugins/feature/pertester/pertester.cpp | 6 +++++- plugins/feature/startracker/startracker.cpp | 6 +++++- plugins/feature/vorlocalizer/vorlocalizer.cpp | 6 +++++- 9 files changed, 45 insertions(+), 9 deletions(-) diff --git a/plugins/channelrx/chanalyzer/chanalyzerbaseband.cpp b/plugins/channelrx/chanalyzer/chanalyzerbaseband.cpp index 8169228b6..56ee66ffe 100644 --- a/plugins/channelrx/chanalyzer/chanalyzerbaseband.cpp +++ b/plugins/channelrx/chanalyzer/chanalyzerbaseband.cpp @@ -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 diff --git a/plugins/channelrx/demodais/aisdemod.cpp b/plugins/channelrx/demodais/aisdemod.cpp index 7553d43d9..3c745e8e1 100644 --- a/plugins/channelrx/demodais/aisdemod.cpp +++ b/plugins/channelrx/demodais/aisdemod.cpp @@ -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 diff --git a/plugins/channelrx/localsink/localsink.cpp b/plugins/channelrx/localsink/localsink.cpp index 419525ad1..c96fc6575 100644 --- a/plugins/channelrx/localsink/localsink.cpp +++ b/plugins/channelrx/localsink/localsink.cpp @@ -395,7 +395,11 @@ void LocalSink::applySettings(const LocalSinkSettings& settings, const QList& 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, diff --git a/plugins/feature/jogdialcontroller/jogdialcontroller.cpp b/plugins/feature/jogdialcontroller/jogdialcontroller.cpp index f78dfa7c9..c5a9ea574 100644 --- a/plugins/feature/jogdialcontroller/jogdialcontroller.cpp +++ b/plugins/feature/jogdialcontroller/jogdialcontroller.cpp @@ -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() diff --git a/plugins/feature/pertester/pertester.cpp b/plugins/feature/pertester/pertester.cpp index b54e6737c..1155bba05 100644 --- a/plugins/feature/pertester/pertester.cpp +++ b/plugins/feature/pertester/pertester.cpp @@ -206,7 +206,11 @@ void PERTester::applySettings(const PERTesterSettings& settings, const QList