package main import ( "fmt" "log" "os/exec" "time" ) func slideshow(ch <-chan string) { dir := <-ch ticker := time.NewTicker(time.Duration(config.Duration) * time.Minute) //set a flat background color based on config defaults fillReady := make(chan bool) go func() { fillCmd := exec.Command("swaybg", "-c", "#232136") err := fillCmd.Start() if err != nil { fmt.Println("could not set background color", err) } fmt.Println("bg color set!") fillReady <- true fillCmd.Wait() }() var cmd *exec.Cmd go func() { for { <-fillReady newCmd := setRandomWallpaper(dir) if cmd != nil { err := cmd.Process.Kill() if err != nil { log.Fatal("could not kill process", err) } } cmd = newCmd select { case dir = <-ch: log.Println("directory set!") continue case <-ticker.C: continue } } }() } func setRandomWallpaper(dir string) *exec.Cmd { img, err := pickRandomImage(dir) if err != nil { panic(err) } cmd := exec.Command("swaybg", "-i", img, "--mode", "fit") fmt.Printf("setting wallpaper: %v\n", img) err = cmd.Start() if err != nil { log.Fatal("failed to set wallpaper!", err) } go cmd.Wait() return cmd }