diff --git a/config.go b/config.go index bd4004d..fb009d7 100644 --- a/config.go +++ b/config.go @@ -27,27 +27,42 @@ func makeDefaultConfig() Config { } } -func (config *Config) load() { +func (config *Config) load() error { j := jsonc.New() homeDir, err := os.UserHomeDir() if err != nil { - log.Fatal("could not get home directory!", err) + log.Println("could not get home directory!") + return err } - configPath := homeDir + "/.config/gopaper/config.jsonc" - configRaw, err := os.ReadFile(configPath) + configDir := homeDir + "/.config/gopaper/" + configRaw, err := os.ReadFile(configDir) if err != nil { if !os.IsExist(err) { defaultConfig := makeDefaultConfig() defaultConfigJSON, err := json.MarshalIndent(defaultConfig, "", "") if err != nil { - log.Fatal("could not encode default config!", err) + log.Println("could not encode default config!") + return err } - file, err := os.Create(configPath) + //TODO: make parent directories if they don't exist + err = os.Mkdir(homeDir+"/.config", 755) + if err != nil && !os.IsExist(err) { + log.Println("could not create .config directory", err) + return err + } + err = os.Mkdir(configDir, 755) + if err != nil && !os.IsExist(err) { + log.Println("could not create .config/gopaper directory") + return err + } + + file, err := os.Create(configDir + "config.jsonc") defer file.Close() if err != nil { - log.Fatal("could not create config file!", err) + log.Println("could not create config file!") + return err } file.Write(defaultConfigJSON) *config = defaultConfig @@ -57,7 +72,8 @@ func (config *Config) load() { configRaw = j.Strip(configRaw) err = json.Unmarshal(configRaw, &config) if err != nil { - log.Fatal("Couldn't unmarshal config!\n", err) + log.Println("Couldn't unmarshal config!") + return err } } @@ -71,4 +87,5 @@ func (config *Config) load() { } config.ImagesDir = homeDir + "/" + config.ImagesDir + "/" + return nil } diff --git a/gopaper b/gopaper new file mode 100755 index 0000000..5399caa Binary files /dev/null and b/gopaper differ diff --git a/main.go b/main.go index 7029e01..ca1c41a 100644 --- a/main.go +++ b/main.go @@ -8,14 +8,18 @@ import ( var config Config +const sockfile = "/tmp/gopaper.sock" + func main() { + //TODO:kill existing processes - config.load() + log.SetFlags(log.LstdFlags | log.Lshortfile) - //TODO: only log to file if flagged + err := config.load() logfile, err := openLogfile() if err != nil { - log.Printf("error opening logfile %v: %v", config.Cache, err) + log.Println("failed to load config", err) + cleanExit(1) } log.SetOutput(logfile) log.SetFlags(log.LstdFlags | log.Lshortfile | log.Lmicroseconds) @@ -24,8 +28,17 @@ func main() { var waitGroup sync.WaitGroup waitGroup.Add(1) slideshowDir := make(chan string) - go server(slideshowDir) - go slideshow(slideshowDir) + + func() { + defer func() { + if r := recover(); r != nil { + log.Println("Panic recovered at top level. Closing gracefully.", r) + cleanExit(1) + } + }() + go server(slideshowDir) + go slideshow(slideshowDir) + }() var dir string args := os.Args[1:] diff --git a/server.go b/server.go index 4f9941b..e5247db 100644 --- a/server.go +++ b/server.go @@ -11,7 +11,8 @@ import ( func server(slideshowDir chan string) { - sockfile := "/tmp/bg-go.sock" + defer os.Remove(sockfile) + //Create a Unix domain socket and listen for incoming connections. socket, err := net.Listen("unix", sockfile) if err != nil { @@ -27,7 +28,6 @@ func server(slideshowDir chan string) { os.Remove(sockfile) os.Exit(1) }() - defer os.Remove(sockfile) for { //Accept incoming diff --git a/slideshow.go b/slideshow.go index 894b986..4a65764 100644 --- a/slideshow.go +++ b/slideshow.go @@ -3,6 +3,7 @@ package main import ( "fmt" "log" + "os" "time" "github.com/xyproto/wallutils" @@ -10,7 +11,7 @@ import ( func slideshow(ch <-chan string) { dir := <-ch - ticker := time.NewTicker(time.Duration(config.Duration) * time.Second) + ticker := time.NewTicker(time.Duration(config.Duration) * time.Minute) go func() { for { @@ -35,5 +36,20 @@ func setRandomWallpaper(dir string) error { if err != nil { return err } - return wallutils.SetWallpaperCustom(img, "fit", false) + + desktopEnv, bool := os.LookupEnv("DESKTOP_SESSION") + if !bool { + panic("cannot determine desktop environment") + } + var mode string + switch desktopEnv { + case "cinnamon": + mode = "zoom" + case "hyprland": + mode = "fit" + default: + mode = "" + } + + return wallutils.SetWallpaperCustom(img, mode, false) }