switch directory via unix socket

This commit is contained in:
andrzej 2024-10-29 00:29:20 +01:00
parent 8cc58b7084
commit ab5b679896
9 changed files with 152 additions and 48 deletions

View File

@ -33,7 +33,7 @@ func getRandomFile(dir string) (path string, filename string, error error) {
return dir + "/" + randomImg.Name(), randomImg.Name(), nil
}
func fileExists(filename string) (bool, error) {
func fileExistsInCache(filename string) (bool, error) {
files, err := os.ReadDir("images")
if err != nil {
return false, err

BIN
go-img Executable file

Binary file not shown.

5
go.mod
View File

@ -2,4 +2,7 @@ module go-img
go 1.23.2
require github.com/disintegration/gift v1.2.1
require (
github.com/disintegration/gift v1.2.1
golang.org/x/image v0.21.0
)

2
go.sum
View File

@ -1,2 +1,4 @@
github.com/disintegration/gift v1.2.1 h1:Y005a1X4Z7Uc+0gLpSAsKhWi4qLtsdEcMIbbdvdZ6pc=
github.com/disintegration/gift v1.2.1/go.mod h1:Jh2i7f7Q2BM7Ezno3PhfezbR1xpUg9dUg3/RlKGr4HI=
golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s=
golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78=

View File

@ -6,8 +6,23 @@ import (
"os/exec"
)
func hyprpaperSet(path string) {
err := hyprpaperPreload(path)
if err != nil {
log.Fatal("preload failed!", err)
}
err = hyprpaperWallpaper(path)
if err != nil {
log.Fatal("set wallpaper failed!", err)
}
err = hyprpaperUnloadAll()
if err != nil {
log.Fatal("unload all failed!", err)
}
}
func hyprpaperPreload(path string) error {
log.Println("path: ", path)
out, err := exec.Command("hyprctl", "hyprpaper", "preload", path).Output()
if err != nil {
return err
@ -16,7 +31,7 @@ func hyprpaperPreload(path string) error {
}
func hyprpaperWallpaper(path string) error {
out, err := exec.Command("hyprctl", "hyprpaper", "wallpaper", ","+path).Output()
out, err := exec.Command("hyprctl", "hyprpaper", "wallpaper", ",contain:"+path).Output()
if err != nil {
return err
}

View File

@ -4,11 +4,15 @@ import (
"image"
"log"
"os"
"path/filepath"
"strings"
"github.com/disintegration/gift"
_ "image/jpeg"
"image/png"
_ "golang.org/x/image/webp"
)
type ImageFilters struct {
@ -17,31 +21,58 @@ type ImageFilters struct {
Gamma float64
}
func loadImage(filename string) image.Image {
f, err := os.Open(filename)
log.Println("filename: ", filename)
func pickRandomImage(dir string) (string, error) {
dir = config.Root + "/" + dir
wd, err := os.Getwd()
if err != nil {
log.Fatalf("os.Open failed: %v", err)
return "", err
}
randomImg, filename, _ := getRandomFile(dir)
filenameNoExt := strings.TrimSuffix(filename, filepath.Ext(filename))
//check to see if rendered copy already exists
fileExists, err := fileExistsInCache(filenameNoExt)
if err != nil {
return "", err
}
curr := wd + "/images/" + filenameNoExt
if !fileExists {
img, err := loadImage(randomImg)
if err != nil {
return "", err
}
dst := processImage(img, config)
saveImage(curr, dst)
} else {
log.Println("file already exists in cache. skipping image processing")
}
return curr, nil
}
func loadImage(filename string) (image.Image, error) {
f, err := os.Open(filename)
if err != nil {
return nil, err
}
defer f.Close()
img, _, err := image.Decode(f)
if err != nil {
log.Fatalf("image.Decode failed: %v", err)
return nil, err
}
return img
return img, nil
}
func saveImage(filename string, img image.Image) {
log.Println("new filename: ", filename)
func saveImage(filename string, img image.Image) error {
f, err := os.Create(filename)
if err != nil {
log.Fatalf("os.Create failed: %v", err)
return err
}
defer f.Close()
err = png.Encode(f, img)
if err != nil {
log.Fatalf("png.Encode failed: %v", err)
return err
}
return nil
}
func processImage(img image.Image, config Config) image.Image {

48
main.go
View File

@ -4,51 +4,31 @@ import (
"fmt"
"log"
"os"
"path/filepath"
"strings"
"sync"
)
var config Config
func main() {
var err error
var config Config
config.load()
fmt.Printf("%+v\n", config)
//get working directory
wd, err := os.Getwd()
if err != nil {
log.Fatal("couldn't find working directory", err)
args := []string{""}
if len(os.Args) > 0 {
args = os.Args[1:]
}
dir := config.Root + "/chsck"
randomImg, filename, _ := getRandomFile(dir)
filenameNoExt := strings.TrimSuffix(filename, filepath.Ext(filename))
//check to see if rendered copy already exists
fileExists, err := fileExists(filenameNoExt)
curr, err := pickRandomImage(args[0])
if err != nil {
log.Fatal("failure checking if file exists!", err)
}
curr := wd + "/images/" + filenameNoExt
log.Println("curr: ", curr)
if !fileExists {
img := loadImage(randomImg)
dst := processImage(img, config)
saveImage(curr, dst)
} else {
log.Println("file exists! skipping image processing")
log.Fatal("failed to pick image!", err)
}
err = hyprpaperPreload(curr)
if err != nil {
log.Fatal("preload failed!", err)
}
err = hyprpaperWallpaper(curr)
if err != nil {
log.Fatal("set wallpaper failed!", err)
}
err = hyprpaperUnloadAll()
if err != nil {
log.Fatal("unload all failed!", err)
}
hyprpaperSet(curr)
var waitGroup sync.WaitGroup
waitGroup.Add(1)
go server(&waitGroup)
waitGroup.Wait()
}

68
server.go Normal file
View File

@ -0,0 +1,68 @@
package main
import (
"log"
"net"
"os"
"os/signal"
"strings"
"sync"
"syscall"
)
func server(waitGroup *sync.WaitGroup) {
sockfile := "/tmp/bg-go.sock"
//Create a Unix domain socket and listen for incoming connections.
socket, err := net.Listen("unix", sockfile)
if err != nil {
panic(err)
}
//cleanup sockfile
//TODO: this only works when the program is killed from outside. Make it work via defer() too?
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
os.Remove(sockfile)
os.Exit(1)
}()
for {
//Accept incoming
conn, err := socket.Accept()
if err != nil {
log.Fatal(err)
}
//create store for incoming bytes
//handle connection in separate goroutine
go func(conn net.Conn) {
defer conn.Close()
//create buffer for incoming data
buf := make([]byte, 4096)
//read data from connection
n, err := conn.Read(buf)
if err != nil {
log.Fatal(err)
}
str := strings.TrimSpace(string(buf[:n]))
newbg, err := pickRandomImage(str)
if err != nil {
panic(err)
}
hyprpaperSet(newbg)
// // Echo the data back to the connection
// _, err = conn.Write(buf[:n])
// if err != nil {
// log.Fatal(err)
// }
}(conn)
}
}

5
slideshow.go Normal file
View File

@ -0,0 +1,5 @@
package main
func slideshow(dir string) {
}