diff --git a/config.go b/config.go index 6482b04..de16249 100644 --- a/config.go +++ b/config.go @@ -16,13 +16,12 @@ type config struct { EnableUpdates bool } -const configDir = ".config/noisetorch/" const configFile = "config.toml" func initializeConfigIfNot() { log.Println("Checking if config needs to be initialized") conf := config{Threshold: 95, DisplayMonitorSources: false, EnableUpdates: true} - configdir := filepath.Join(os.Getenv("HOME"), configDir) + configdir := configDir() ok, err := exists(configdir) if err != nil { log.Fatalf("Couldn't check if config directory exists: %v\n", err) @@ -45,7 +44,7 @@ func initializeConfigIfNot() { } func readConfig() *config { - f := filepath.Join(os.Getenv("HOME"), configDir, configFile) + f := filepath.Join(configDir(), configFile) config := config{} if _, err := toml.DecodeFile(f, &config); err != nil { log.Fatalf("Couldn't read config file: %v\n", err) @@ -55,7 +54,7 @@ func readConfig() *config { } func writeConfig(conf *config) { - f := filepath.Join(os.Getenv("HOME"), configDir, configFile) + f := filepath.Join(configDir(), configFile) var buffer bytes.Buffer if err := toml.NewEncoder(&buffer).Encode(&conf); err != nil { log.Fatalf("Couldn't write config file: %v\n", err) @@ -63,6 +62,10 @@ func writeConfig(conf *config) { ioutil.WriteFile(f, []byte(buffer.String()), 0644) } +func configDir() string { + return filepath.Join(xdgOrFallback("XDG_CONFIG_HOME", filepath.Join(os.Getenv("HOME"), ".config")), "noisetorch") +} + func exists(path string) (bool, error) { _, err := os.Stat(path) if err == nil { @@ -73,3 +76,17 @@ func exists(path string) (bool, error) { } return false, err } + +func xdgOrFallback(xdg string, fallback string) string { + dir := os.Getenv(xdg) + if dir != "" { + if ok, err := exists(dir); ok && err == nil { + log.Printf("Resolved $%s to '%s'\n", xdg, dir) + return dir + } + + } + + log.Printf("Couldn't resolve $%s falling back to '%s'\n", xdg, fallback) + return fallback +}