Compare commits
	
		
			4 Commits
		
	
	
		
			568dc2b8d4
			...
			9b4acc1dca
		
	
	| Author | SHA1 | Date | 
|---|---|---|
| 
							
							
								
								 | 
						9b4acc1dca | |
| 
							
							
								
								 | 
						c46ab056f5 | |
| 
							
							
								
								 | 
						a4b75bb90d | |
| 
							
							
								
								 | 
						0c50f6fa72 | 
							
								
								
									
										33
									
								
								config.go
								
								
								
								
							
							
						
						
									
										33
									
								
								config.go
								
								
								
								
							| 
						 | 
					@ -27,27 +27,42 @@ func makeDefaultConfig() Config {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (config *Config) load() {
 | 
					func (config *Config) load() error {
 | 
				
			||||||
	j := jsonc.New()
 | 
						j := jsonc.New()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	homeDir, err := os.UserHomeDir()
 | 
						homeDir, err := os.UserHomeDir()
 | 
				
			||||||
	if err != nil {
 | 
						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"
 | 
						configDir := homeDir + "/.config/gopaper/"
 | 
				
			||||||
	configRaw, err := os.ReadFile(configPath)
 | 
						configRaw, err := os.ReadFile(configDir)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if !os.IsExist(err) {
 | 
							if !os.IsExist(err) {
 | 
				
			||||||
			defaultConfig := makeDefaultConfig()
 | 
								defaultConfig := makeDefaultConfig()
 | 
				
			||||||
			defaultConfigJSON, err := json.MarshalIndent(defaultConfig, "", "")
 | 
								defaultConfigJSON, err := json.MarshalIndent(defaultConfig, "", "")
 | 
				
			||||||
			if err != nil {
 | 
								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")
 | 
				
			||||||
 | 
									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()
 | 
								defer file.Close()
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				log.Fatal("could not create config file!", err)
 | 
									log.Println("could not create config file!")
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			file.Write(defaultConfigJSON)
 | 
								file.Write(defaultConfigJSON)
 | 
				
			||||||
			*config = defaultConfig
 | 
								*config = defaultConfig
 | 
				
			||||||
| 
						 | 
					@ -57,7 +72,8 @@ func (config *Config) load() {
 | 
				
			||||||
		configRaw = j.Strip(configRaw)
 | 
							configRaw = j.Strip(configRaw)
 | 
				
			||||||
		err = json.Unmarshal(configRaw, &config)
 | 
							err = json.Unmarshal(configRaw, &config)
 | 
				
			||||||
		if err != nil {
 | 
							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 + "/"
 | 
						config.ImagesDir = homeDir + "/" + config.ImagesDir + "/"
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										25
									
								
								main.go
								
								
								
								
							
							
						
						
									
										25
									
								
								main.go
								
								
								
								
							| 
						 | 
					@ -1,22 +1,32 @@
 | 
				
			||||||
package main
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"log"
 | 
				
			||||||
	// "log"
 | 
					 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var config Config
 | 
					var config Config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					const sockfile = "/tmp/gopaper.sock"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	config.load()
 | 
					func main() {
 | 
				
			||||||
	fmt.Printf("%+v\n", config)
 | 
						//TODO:kill existing processes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						log.SetFlags(log.LstdFlags | log.Lshortfile)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := config.load()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Println("failed to load config", err)
 | 
				
			||||||
 | 
							cleanExit(1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						log.Printf("%+v\n", config)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var waitGroup sync.WaitGroup
 | 
						var waitGroup sync.WaitGroup
 | 
				
			||||||
	waitGroup.Add(1)
 | 
						waitGroup.Add(1)
 | 
				
			||||||
	slideshowDir := make(chan string)
 | 
						slideshowDir := make(chan string)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	go server(slideshowDir)
 | 
						go server(slideshowDir)
 | 
				
			||||||
	go slideshow(slideshowDir)
 | 
						go slideshow(slideshowDir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,3 +41,8 @@ func main() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	waitGroup.Wait()
 | 
						waitGroup.Wait()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func cleanExit(code int) {
 | 
				
			||||||
 | 
						os.Remove(sockfile)
 | 
				
			||||||
 | 
						os.Exit(code)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,7 +11,8 @@ import (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func server(slideshowDir chan string) {
 | 
					func server(slideshowDir chan string) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sockfile := "/tmp/bg-go.sock"
 | 
						defer os.Remove(sockfile)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//Create a Unix domain socket and listen for incoming connections.
 | 
						//Create a Unix domain socket and listen for incoming connections.
 | 
				
			||||||
	socket, err := net.Listen("unix", sockfile)
 | 
						socket, err := net.Listen("unix", sockfile)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -27,7 +28,6 @@ func server(slideshowDir chan string) {
 | 
				
			||||||
		os.Remove(sockfile)
 | 
							os.Remove(sockfile)
 | 
				
			||||||
		os.Exit(1)
 | 
							os.Exit(1)
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
	defer os.Remove(sockfile)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
		//Accept incoming
 | 
							//Accept incoming
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										20
									
								
								slideshow.go
								
								
								
								
							
							
						
						
									
										20
									
								
								slideshow.go
								
								
								
								
							| 
						 | 
					@ -3,6 +3,7 @@ package main
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"log"
 | 
						"log"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/xyproto/wallutils"
 | 
						"github.com/xyproto/wallutils"
 | 
				
			||||||
| 
						 | 
					@ -10,7 +11,7 @@ import (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func slideshow(ch <-chan string) {
 | 
					func slideshow(ch <-chan string) {
 | 
				
			||||||
	dir := <-ch
 | 
						dir := <-ch
 | 
				
			||||||
	ticker := time.NewTicker(time.Duration(config.Duration) * time.Second)
 | 
						ticker := time.NewTicker(time.Duration(config.Duration) * time.Minute)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	go func() {
 | 
						go func() {
 | 
				
			||||||
		for {
 | 
							for {
 | 
				
			||||||
| 
						 | 
					@ -35,5 +36,20 @@ func setRandomWallpaper(dir string) error {
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							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 = "span"
 | 
				
			||||||
 | 
						case "hyprland":
 | 
				
			||||||
 | 
							mode = "fit"
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							mode = ""
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return wallutils.SetWallpaperCustom(img, mode, false)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue