package main import ( "flag" "fmt" "log" "os" "os/exec" "time" "github.com/vitali-fedulov/images3" ) var display string var imagesStore string var delay int func main() { flag.StringVar(&display, "d", "", "Display") flag.StringVar(&imagesStore, "s", "", "Images directory") flag.IntVar(&delay, "t", 60, "Delay between checks") flag.Parse() directory, _ := os.MkdirTemp("", "smart-screensaver") images := []string{} i := 0 for { image := fmt.Sprintf("%s/%d.jpg", directory, i) _, err := exec.Command("import", "-display", display, "-window", "root", image).Output() i++ if err == nil { images = append(images, image) } log.Println("Checking...") if len(images) == 2 { img1, _ := images3.Open(images[0]) img2, _ := images3.Open(images[1]) icon1 := images3.Icon(img1, images[0]) icon2 := images3.Icon(img2, images[1]) if images3.Similar(icon1, icon2) { log.Println("Starting screensaver...") cmd := exec.Command("feh", "-F", "-r", "--on-last-slide", "resume", "-z", "-D", "2", imagesStore) cmd.Env = []string{fmt.Sprintf("DISPLAY=%s", display)} _, err := cmd.Output() if err != nil { log.Println(err.Error()) } } os.Remove(images[0]) images = []string{images[1]} } time.Sleep(time.Duration(delay) * time.Second) } }