From 353b07380f892dc1ee508f3640dfeb78b650221d Mon Sep 17 00:00:00 2001 From: Lysec Date: Mon, 6 Apr 2026 13:35:26 +0200 Subject: [PATCH] fix(settings): detect nix-managed settings updates without restart --- Commons/Settings.qml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Commons/Settings.qml b/Commons/Settings.qml index d4deed9e8..588227c9e 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -18,6 +18,7 @@ Singleton { property bool directoriesCreated: false property bool shouldOpenSetupWizard: false property bool isFreshInstall: false + property string lastLoadedSettingsText: "" /* Shell directories. @@ -80,6 +81,20 @@ Singleton { } } + // Fallback polling for environments where watcher events are missed + // (e.g. atomic symlink/store-path swaps in declarative setups). + Timer { + id: settingsWatchdogTimer + running: false + repeat: true + interval: 5000 + onTriggered: { + if (root.isLoaded && settingsFileView.path !== undefined) { + settingsFileView.reload(); + } + } + } + FileView { id: settingsFileView path: directoriesCreated ? settingsFile : undefined @@ -95,10 +110,14 @@ Singleton { // Trigger initial load when path changes from empty to actual path onPathChanged: { if (path !== undefined) { + settingsWatchdogTimer.start(); reload(); + } else { + settingsWatchdogTimer.stop(); } } onLoaded: function () { + var currentText = settingsFileView.text(); if (!isLoaded) { Logger.i("Settings", "Settings loaded"); @@ -115,6 +134,7 @@ Singleton { // Finally, update our local settings version adapter.settingsVersion = settingsVersion; + root.lastLoadedSettingsText = currentText; // Emit the signal root.isLoaded = true; @@ -122,6 +142,10 @@ Singleton { upgradeSettings(); } else { + if (currentText === root.lastLoadedSettingsText) { + return; + } + root.lastLoadedSettingsText = currentText; Logger.d("Settings", "Settings reloaded from external file change"); root.settingsReloaded(); }