diff --git a/core/internal/matugen/matugen.go b/core/internal/matugen/matugen.go index e8c89738..fc43d5b8 100644 --- a/core/internal/matugen/matugen.go +++ b/core/internal/matugen/matugen.go @@ -234,61 +234,61 @@ output_path = '%s' if !opts.ShouldSkipTemplate("gtk") { switch opts.Mode { case "light": - appendConfig(opts, cfgFile, "skip", "gtk3-light.toml") + appendConfig(opts, cfgFile, nil, "gtk3-light.toml") default: - appendConfig(opts, cfgFile, "skip", "gtk3-dark.toml") + appendConfig(opts, cfgFile, nil, "gtk3-dark.toml") } } if !opts.ShouldSkipTemplate("niri") { - appendConfig(opts, cfgFile, "niri", "niri.toml") + appendConfig(opts, cfgFile, []string{"niri"}, "niri.toml") } if !opts.ShouldSkipTemplate("qt5ct") { - appendConfig(opts, cfgFile, "qt5ct", "qt5ct.toml") + appendConfig(opts, cfgFile, []string{"qt5ct"}, "qt5ct.toml") } if !opts.ShouldSkipTemplate("qt6ct") { - appendConfig(opts, cfgFile, "qt6ct", "qt6ct.toml") + appendConfig(opts, cfgFile, []string{"qt6ct"}, "qt6ct.toml") } if !opts.ShouldSkipTemplate("firefox") { - appendConfig(opts, cfgFile, "firefox", "firefox.toml") + appendConfig(opts, cfgFile, []string{"firefox"}, "firefox.toml") } if !opts.ShouldSkipTemplate("pywalfox") { - appendConfig(opts, cfgFile, "pywalfox", "pywalfox.toml") + appendConfig(opts, cfgFile, []string{"pywalfox"}, "pywalfox.toml") } if !opts.ShouldSkipTemplate("zenbrowser") { - appendConfig(opts, cfgFile, "zen", "zenbrowser.toml") + appendConfig(opts, cfgFile, []string{"zen", "zen-browser"}, "zenbrowser.toml") } if !opts.ShouldSkipTemplate("vesktop") { - appendConfig(opts, cfgFile, "vesktop", "vesktop.toml") + appendConfig(opts, cfgFile, []string{"vesktop"}, "vesktop.toml") } if !opts.ShouldSkipTemplate("equibop") { - appendConfig(opts, cfgFile, "equibop", "equibop.toml") + appendConfig(opts, cfgFile, []string{"equibop"}, "equibop.toml") } if !opts.ShouldSkipTemplate("ghostty") { - appendTerminalConfig(opts, cfgFile, tmpDir, "ghostty", "ghostty.toml") + appendTerminalConfig(opts, cfgFile, tmpDir, []string{"ghostty"}, "ghostty.toml") } if !opts.ShouldSkipTemplate("kitty") { - appendTerminalConfig(opts, cfgFile, tmpDir, "kitty", "kitty.toml") + appendTerminalConfig(opts, cfgFile, tmpDir, []string{"kitty"}, "kitty.toml") } if !opts.ShouldSkipTemplate("foot") { - appendTerminalConfig(opts, cfgFile, tmpDir, "foot", "foot.toml") + appendTerminalConfig(opts, cfgFile, tmpDir, []string{"foot"}, "foot.toml") } if !opts.ShouldSkipTemplate("alacritty") { - appendTerminalConfig(opts, cfgFile, tmpDir, "alacritty", "alacritty.toml") + appendTerminalConfig(opts, cfgFile, tmpDir, []string{"alacritty"}, "alacritty.toml") } if !opts.ShouldSkipTemplate("wezterm") { - appendTerminalConfig(opts, cfgFile, tmpDir, "wezterm", "wezterm.toml") + appendTerminalConfig(opts, cfgFile, tmpDir, []string{"wezterm"}, "wezterm.toml") } if !opts.ShouldSkipTemplate("nvim") { - appendTerminalConfig(opts, cfgFile, tmpDir, "nvim", "neovim.toml") + appendTerminalConfig(opts, cfgFile, tmpDir, []string{"nvim"}, "neovim.toml") } if !opts.ShouldSkipTemplate("dgop") { - appendConfig(opts, cfgFile, "dgop", "dgop.toml") + appendConfig(opts, cfgFile, []string{"dgop"}, "dgop.toml") } if !opts.ShouldSkipTemplate("kcolorscheme") { - appendConfig(opts, cfgFile, "skip", "kcolorscheme.toml") + appendConfig(opts, cfgFile, nil, "kcolorscheme.toml") } if !opts.ShouldSkipTemplate("vscode") { @@ -326,12 +326,12 @@ output_path = '%s' return nil } -func appendConfig(opts *Options, cfgFile *os.File, checkCmd, fileName string) { +func appendConfig(opts *Options, cfgFile *os.File, checkCmd []string, fileName string) { configPath := filepath.Join(opts.ShellDir, "matugen", "configs", fileName) if _, err := os.Stat(configPath); err != nil { return } - if checkCmd != "skip" && !utils.CommandExists(checkCmd) { + if !utils.AnyCommandExists(checkCmd...) { return } data, err := os.ReadFile(configPath) @@ -342,12 +342,12 @@ func appendConfig(opts *Options, cfgFile *os.File, checkCmd, fileName string) { cfgFile.WriteString("\n") } -func appendTerminalConfig(opts *Options, cfgFile *os.File, tmpDir, checkCmd, fileName string) { +func appendTerminalConfig(opts *Options, cfgFile *os.File, tmpDir string, checkCmd []string, fileName string) { configPath := filepath.Join(opts.ShellDir, "matugen", "configs", fileName) if _, err := os.Stat(configPath); err != nil { return } - if checkCmd != "skip" && !utils.CommandExists(checkCmd) { + if !utils.AnyCommandExists(checkCmd...) { return } data, err := os.ReadFile(configPath) diff --git a/core/internal/utils/exec.go b/core/internal/utils/exec.go index 83501b42..085bde9f 100644 --- a/core/internal/utils/exec.go +++ b/core/internal/utils/exec.go @@ -6,3 +6,12 @@ func CommandExists(cmd string) bool { _, err := exec.LookPath(cmd) return err == nil } + +func AnyCommandExists(cmds ...string) bool { + for _, cmd := range cmds { + if CommandExists(cmd) { + return true + } + } + return false +} diff --git a/quickshell/Common/SessionData.qml b/quickshell/Common/SessionData.qml index a8cf6a85..e42d3344 100644 --- a/quickshell/Common/SessionData.qml +++ b/quickshell/Common/SessionData.qml @@ -15,6 +15,7 @@ Singleton { readonly property bool isGreeterMode: Quickshell.env("DMS_RUN_GREETER") === "1" || Quickshell.env("DMS_RUN_GREETER") === "true" property bool hasTriedDefaultSession: false + property bool _parseError: false readonly property string _stateUrl: StandardPaths.writableLocation(StandardPaths.GenericStateLocation) readonly property string _stateDir: Paths.strip(_stateUrl) @@ -108,96 +109,98 @@ Singleton { } function parseSettings(content) { + _parseError = false; try { - if (content && content.trim()) { - var settings = JSON.parse(content); - isLightMode = settings.isLightMode !== undefined ? settings.isLightMode : false; + if (!content || !content.trim()) + return; + var settings = JSON.parse(content); + isLightMode = settings.isLightMode !== undefined ? settings.isLightMode : false; - if (settings.wallpaperPath && settings.wallpaperPath.startsWith("we:")) { - console.warn("WallpaperEngine wallpaper detected, resetting wallpaper"); - wallpaperPath = ""; - Quickshell.execDetached(["notify-send", "-u", "critical", "-a", "DMS", "-i", "dialog-warning", "WallpaperEngine Support Moved", "WallpaperEngine support has been moved to a plugin. Please enable the Linux Wallpaper Engine plugin in Settings → Plugins to continue using WallpaperEngine."]); - } else { - wallpaperPath = settings.wallpaperPath !== undefined ? settings.wallpaperPath : ""; - } - perMonitorWallpaper = settings.perMonitorWallpaper !== undefined ? settings.perMonitorWallpaper : false; - monitorWallpapers = settings.monitorWallpapers !== undefined ? settings.monitorWallpapers : {}; - perModeWallpaper = settings.perModeWallpaper !== undefined ? settings.perModeWallpaper : false; - wallpaperPathLight = settings.wallpaperPathLight !== undefined ? settings.wallpaperPathLight : ""; - wallpaperPathDark = settings.wallpaperPathDark !== undefined ? settings.wallpaperPathDark : ""; - monitorWallpapersLight = settings.monitorWallpapersLight !== undefined ? settings.monitorWallpapersLight : {}; - monitorWallpapersDark = settings.monitorWallpapersDark !== undefined ? settings.monitorWallpapersDark : {}; - brightnessExponentialDevices = settings.brightnessExponentialDevices !== undefined ? settings.brightnessExponentialDevices : (settings.brightnessLogarithmicDevices || {}); - brightnessUserSetValues = settings.brightnessUserSetValues !== undefined ? settings.brightnessUserSetValues : {}; - brightnessExponentValues = settings.brightnessExponentValues !== undefined ? settings.brightnessExponentValues : {}; - doNotDisturb = settings.doNotDisturb !== undefined ? settings.doNotDisturb : false; - nightModeEnabled = settings.nightModeEnabled !== undefined ? settings.nightModeEnabled : false; - nightModeTemperature = settings.nightModeTemperature !== undefined ? settings.nightModeTemperature : 4500; - nightModeHighTemperature = settings.nightModeHighTemperature !== undefined ? settings.nightModeHighTemperature : 6500; - nightModeAutoEnabled = settings.nightModeAutoEnabled !== undefined ? settings.nightModeAutoEnabled : false; - nightModeAutoMode = settings.nightModeAutoMode !== undefined ? settings.nightModeAutoMode : "time"; - if (settings.nightModeStartTime !== undefined) { - const parts = settings.nightModeStartTime.split(":"); - nightModeStartHour = parseInt(parts[0]) || 18; - nightModeStartMinute = parseInt(parts[1]) || 0; - } else { - nightModeStartHour = settings.nightModeStartHour !== undefined ? settings.nightModeStartHour : 18; - nightModeStartMinute = settings.nightModeStartMinute !== undefined ? settings.nightModeStartMinute : 0; - } - if (settings.nightModeEndTime !== undefined) { - const parts = settings.nightModeEndTime.split(":"); - nightModeEndHour = parseInt(parts[0]) || 6; - nightModeEndMinute = parseInt(parts[1]) || 0; - } else { - nightModeEndHour = settings.nightModeEndHour !== undefined ? settings.nightModeEndHour : 6; - nightModeEndMinute = settings.nightModeEndMinute !== undefined ? settings.nightModeEndMinute : 0; - } - latitude = settings.latitude !== undefined ? settings.latitude : 0.0; - longitude = settings.longitude !== undefined ? settings.longitude : 0.0; - nightModeUseIPLocation = settings.nightModeUseIPLocation !== undefined ? settings.nightModeUseIPLocation : false; - nightModeLocationProvider = settings.nightModeLocationProvider !== undefined ? settings.nightModeLocationProvider : ""; - pinnedApps = settings.pinnedApps !== undefined ? settings.pinnedApps : []; - hiddenTrayIds = settings.hiddenTrayIds !== undefined ? settings.hiddenTrayIds : []; - selectedGpuIndex = settings.selectedGpuIndex !== undefined ? settings.selectedGpuIndex : 0; - nvidiaGpuTempEnabled = settings.nvidiaGpuTempEnabled !== undefined ? settings.nvidiaGpuTempEnabled : false; - nonNvidiaGpuTempEnabled = settings.nonNvidiaGpuTempEnabled !== undefined ? settings.nonNvidiaGpuTempEnabled : false; - enabledGpuPciIds = settings.enabledGpuPciIds !== undefined ? settings.enabledGpuPciIds : []; - wifiDeviceOverride = settings.wifiDeviceOverride !== undefined ? settings.wifiDeviceOverride : ""; - weatherHourlyDetailed = settings.weatherHourlyDetailed !== undefined ? settings.weatherHourlyDetailed : true; - wallpaperCyclingEnabled = settings.wallpaperCyclingEnabled !== undefined ? settings.wallpaperCyclingEnabled : false; - wallpaperCyclingMode = settings.wallpaperCyclingMode !== undefined ? settings.wallpaperCyclingMode : "interval"; - wallpaperCyclingInterval = settings.wallpaperCyclingInterval !== undefined ? settings.wallpaperCyclingInterval : 300; - wallpaperCyclingTime = settings.wallpaperCyclingTime !== undefined ? settings.wallpaperCyclingTime : "06:00"; - monitorCyclingSettings = settings.monitorCyclingSettings !== undefined ? settings.monitorCyclingSettings : {}; - lastBrightnessDevice = settings.lastBrightnessDevice !== undefined ? settings.lastBrightnessDevice : ""; - launchPrefix = settings.launchPrefix !== undefined ? settings.launchPrefix : ""; - wallpaperTransition = settings.wallpaperTransition !== undefined ? settings.wallpaperTransition : "fade"; - includedTransitions = settings.includedTransitions !== undefined ? settings.includedTransitions : availableWallpaperTransitions.filter(t => t !== "none"); - recentColors = settings.recentColors !== undefined ? settings.recentColors : []; - showThirdPartyPlugins = settings.showThirdPartyPlugins !== undefined ? settings.showThirdPartyPlugins : false; - - if (settings.configVersion === undefined) { - migrateFromUndefinedToV1(settings); - saveSettings(); - } else if (settings.configVersion === sessionConfigVersion) { - cleanupUnusedKeys(); - } - - if (!isGreeterMode) { - if (typeof Theme !== "undefined") { - Theme.generateSystemThemesFromCurrentTheme(); - } - } - - if (typeof WallpaperCyclingService !== "undefined") { - WallpaperCyclingService.updateCyclingState(); - } + if (settings.wallpaperPath && settings.wallpaperPath.startsWith("we:")) { + console.warn("WallpaperEngine wallpaper detected, resetting wallpaper"); + wallpaperPath = ""; + Quickshell.execDetached(["notify-send", "-u", "critical", "-a", "DMS", "-i", "dialog-warning", "WallpaperEngine Support Moved", "WallpaperEngine support has been moved to a plugin. Please enable the Linux Wallpaper Engine plugin in Settings → Plugins to continue using WallpaperEngine."]); + } else { + wallpaperPath = settings.wallpaperPath !== undefined ? settings.wallpaperPath : ""; } - } catch (e) {} + perMonitorWallpaper = settings.perMonitorWallpaper !== undefined ? settings.perMonitorWallpaper : false; + monitorWallpapers = settings.monitorWallpapers !== undefined ? settings.monitorWallpapers : {}; + perModeWallpaper = settings.perModeWallpaper !== undefined ? settings.perModeWallpaper : false; + wallpaperPathLight = settings.wallpaperPathLight !== undefined ? settings.wallpaperPathLight : ""; + wallpaperPathDark = settings.wallpaperPathDark !== undefined ? settings.wallpaperPathDark : ""; + monitorWallpapersLight = settings.monitorWallpapersLight !== undefined ? settings.monitorWallpapersLight : {}; + monitorWallpapersDark = settings.monitorWallpapersDark !== undefined ? settings.monitorWallpapersDark : {}; + brightnessExponentialDevices = settings.brightnessExponentialDevices !== undefined ? settings.brightnessExponentialDevices : (settings.brightnessLogarithmicDevices || {}); + brightnessUserSetValues = settings.brightnessUserSetValues !== undefined ? settings.brightnessUserSetValues : {}; + brightnessExponentValues = settings.brightnessExponentValues !== undefined ? settings.brightnessExponentValues : {}; + doNotDisturb = settings.doNotDisturb !== undefined ? settings.doNotDisturb : false; + nightModeEnabled = settings.nightModeEnabled !== undefined ? settings.nightModeEnabled : false; + nightModeTemperature = settings.nightModeTemperature !== undefined ? settings.nightModeTemperature : 4500; + nightModeHighTemperature = settings.nightModeHighTemperature !== undefined ? settings.nightModeHighTemperature : 6500; + nightModeAutoEnabled = settings.nightModeAutoEnabled !== undefined ? settings.nightModeAutoEnabled : false; + nightModeAutoMode = settings.nightModeAutoMode !== undefined ? settings.nightModeAutoMode : "time"; + if (settings.nightModeStartTime !== undefined) { + const parts = settings.nightModeStartTime.split(":"); + nightModeStartHour = parseInt(parts[0]) || 18; + nightModeStartMinute = parseInt(parts[1]) || 0; + } else { + nightModeStartHour = settings.nightModeStartHour !== undefined ? settings.nightModeStartHour : 18; + nightModeStartMinute = settings.nightModeStartMinute !== undefined ? settings.nightModeStartMinute : 0; + } + if (settings.nightModeEndTime !== undefined) { + const parts = settings.nightModeEndTime.split(":"); + nightModeEndHour = parseInt(parts[0]) || 6; + nightModeEndMinute = parseInt(parts[1]) || 0; + } else { + nightModeEndHour = settings.nightModeEndHour !== undefined ? settings.nightModeEndHour : 6; + nightModeEndMinute = settings.nightModeEndMinute !== undefined ? settings.nightModeEndMinute : 0; + } + latitude = settings.latitude !== undefined ? settings.latitude : 0.0; + longitude = settings.longitude !== undefined ? settings.longitude : 0.0; + nightModeUseIPLocation = settings.nightModeUseIPLocation !== undefined ? settings.nightModeUseIPLocation : false; + nightModeLocationProvider = settings.nightModeLocationProvider !== undefined ? settings.nightModeLocationProvider : ""; + pinnedApps = settings.pinnedApps !== undefined ? settings.pinnedApps : []; + hiddenTrayIds = settings.hiddenTrayIds !== undefined ? settings.hiddenTrayIds : []; + selectedGpuIndex = settings.selectedGpuIndex !== undefined ? settings.selectedGpuIndex : 0; + nvidiaGpuTempEnabled = settings.nvidiaGpuTempEnabled !== undefined ? settings.nvidiaGpuTempEnabled : false; + nonNvidiaGpuTempEnabled = settings.nonNvidiaGpuTempEnabled !== undefined ? settings.nonNvidiaGpuTempEnabled : false; + enabledGpuPciIds = settings.enabledGpuPciIds !== undefined ? settings.enabledGpuPciIds : []; + wifiDeviceOverride = settings.wifiDeviceOverride !== undefined ? settings.wifiDeviceOverride : ""; + weatherHourlyDetailed = settings.weatherHourlyDetailed !== undefined ? settings.weatherHourlyDetailed : true; + wallpaperCyclingEnabled = settings.wallpaperCyclingEnabled !== undefined ? settings.wallpaperCyclingEnabled : false; + wallpaperCyclingMode = settings.wallpaperCyclingMode !== undefined ? settings.wallpaperCyclingMode : "interval"; + wallpaperCyclingInterval = settings.wallpaperCyclingInterval !== undefined ? settings.wallpaperCyclingInterval : 300; + wallpaperCyclingTime = settings.wallpaperCyclingTime !== undefined ? settings.wallpaperCyclingTime : "06:00"; + monitorCyclingSettings = settings.monitorCyclingSettings !== undefined ? settings.monitorCyclingSettings : {}; + lastBrightnessDevice = settings.lastBrightnessDevice !== undefined ? settings.lastBrightnessDevice : ""; + launchPrefix = settings.launchPrefix !== undefined ? settings.launchPrefix : ""; + wallpaperTransition = settings.wallpaperTransition !== undefined ? settings.wallpaperTransition : "fade"; + includedTransitions = settings.includedTransitions !== undefined ? settings.includedTransitions : availableWallpaperTransitions.filter(t => t !== "none"); + recentColors = settings.recentColors !== undefined ? settings.recentColors : []; + showThirdPartyPlugins = settings.showThirdPartyPlugins !== undefined ? settings.showThirdPartyPlugins : false; + + if (settings.configVersion === undefined) { + migrateFromUndefinedToV1(settings); + saveSettings(); + } else if (settings.configVersion === sessionConfigVersion) { + cleanupUnusedKeys(); + } + + if (!isGreeterMode && typeof Theme !== "undefined") { + Theme.generateSystemThemesFromCurrentTheme(); + } + + if (typeof WallpaperCyclingService !== "undefined") { + WallpaperCyclingService.updateCyclingState(); + } + } catch (e) { + _parseError = true; + console.error("SessionData: Failed to parse session.json - file will not be overwritten. Error:", e.message); + } } function saveSettings() { - if (isGreeterMode) + if (isGreeterMode || _parseError) return; settingsFile.setText(JSON.stringify({ "isLightMode": isLightMode, diff --git a/quickshell/Common/SettingsData.qml b/quickshell/Common/SettingsData.qml index ea79da04..82d8597c 100644 --- a/quickshell/Common/SettingsData.qml +++ b/quickshell/Common/SettingsData.qml @@ -55,6 +55,8 @@ Singleton { property bool _loading: false property bool _pluginSettingsLoading: false + property bool _parseError: false + property bool _pluginParseError: false property bool hasTriedDefaultSettings: false property var pluginSettings: ({}) @@ -772,6 +774,7 @@ Singleton { function loadSettings() { _loading = true; + _parseError = false; try { const txt = settingsFile.text(); let obj = (txt && txt.trim()) ? JSON.parse(txt) : null; @@ -790,7 +793,8 @@ Singleton { applyStoredIconTheme(); Processes.detectQtTools(); } catch (e) { - console.warn("SettingsData: Failed to load settings:", e.message); + _parseError = true; + console.error("SettingsData: Failed to parse settings.json - file will not be overwritten. Error:", e.message); applyStoredTheme(); applyStoredIconTheme(); } finally { @@ -807,6 +811,7 @@ Singleton { function parsePluginSettings(content) { _pluginSettingsLoading = true; + _pluginParseError = false; try { if (content && content.trim()) { pluginSettings = JSON.parse(content); @@ -814,7 +819,8 @@ Singleton { pluginSettings = {}; } } catch (e) { - console.warn("SettingsData: Failed to parse plugin settings:", e.message); + _pluginParseError = true; + console.error("SettingsData: Failed to parse plugin_settings.json - file will not be overwritten. Error:", e.message); pluginSettings = {}; } finally { _pluginSettingsLoading = false; @@ -822,13 +828,13 @@ Singleton { } function saveSettings() { - if (_loading) + if (_loading || _parseError) return; settingsFile.setText(JSON.stringify(Store.toJson(root), null, 2)); } function savePluginSettings() { - if (_pluginSettingsLoading) + if (_pluginSettingsLoading || _pluginParseError) return; pluginSettingsFile.setText(JSON.stringify(pluginSettings, null, 2)); } @@ -1785,18 +1791,23 @@ Singleton { atomicWrites: true watchChanges: !isGreeterMode onLoaded: { - if (!isGreeterMode) { - try { - const txt = settingsFile.text(); - const obj = (txt && txt.trim()) ? JSON.parse(txt) : null; - Store.parse(root, obj); - applyStoredTheme(); - applyStoredIconTheme(); - } catch (e) { - console.warn("SettingsData: Failed to reload settings:", e.message); - } - hasTriedDefaultSettings = false; + if (isGreeterMode) + return; + _loading = true; + try { + const txt = settingsFile.text(); + const obj = (txt && txt.trim()) ? JSON.parse(txt) : null; + _parseError = false; + Store.parse(root, obj); + applyStoredTheme(); + applyStoredIconTheme(); + } catch (e) { + _parseError = true; + console.error("SettingsData: Failed to reload settings.json - file will not be overwritten. Error:", e.message); + } finally { + _loading = false; } + hasTriedDefaultSettings = false; } onLoadFailed: error => { if (!isGreeterMode && !hasTriedDefaultSettings) {