Add background package

This rewrite has better comments and returns better error messages.
This commit is contained in:
Andinus 2020-03-24 18:35:27 +05:30
parent 842bc90659
commit bf040f6d1c
Signed by: andinus
GPG Key ID: B67D55D482A799FD
3 changed files with 139 additions and 0 deletions

48
background/download.go Normal file
View File

@ -0,0 +1,48 @@
package background
import (
"fmt"
"io"
"net/http"
"os"
)
// Download takes path and url as input and downloads the data to a
// file, returning an error if there is one.
func Download(file string, url string) error {
o, err := os.Create(file)
if err != nil {
err = fmt.Errorf("%s%s\n%s",
"download.go: failed to create file: ", file,
err.Error())
return err
}
defer o.Close()
res, err := http.Get(url)
if err != nil {
err = fmt.Errorf("%s%s\n%s",
"download.go: failed to get response from ", url,
err.Error())
return err
}
defer res.Body.Close()
// Return an error on unexpected response code.
if res.StatusCode != http.StatusOK {
err = fmt.Errorf("Unexpected Response: %s",
res.Status)
return err
}
// This will not copy everything to memory but will save to
// disk as it progresses, ideal for big files or low memory
// environments.
_, err = io.Copy(o, res.Body)
if err != nil {
err = fmt.Errorf("%s\n%s",
"download.go: failed to copy body to file",
err.Error())
}
return err
}

25
background/set_darwin.go Normal file
View File

@ -0,0 +1,25 @@
// +build darwin
package background
import (
"fmt"
"os/exec"
"strconv"
)
// SetFromFile takes a string as an input, it must be absolute path to
// the background. Checks are not made to check if the path exists or
// it is actually an image, that must be verified before passing it to
// SetFromFile. SetFromFile will exit returning in error if there is
// any.
func SetFromFile(path string) error {
err := exec.Command("osascript", "-e",
`tell application "System Events" to tell every desktop to set picture to `+strconv.Quote(path)).Run()
if err != nil {
err = fmt.Errorf("%s\n%s",
"set_darwin.go: failed to set background",
err.Error())
}
return err
}

66
background/set_unix.go Normal file
View File

@ -0,0 +1,66 @@
// +build linux netbsd openbsd freebsd dragonfly
package background
import (
"fmt"
"os"
"os/exec"
)
// SetFromFile takes a string as an input, it must be absolute path to
// the background. Checks are not made to check if the path exists or
// it is actually an image, that must be verified before passing it to
// SetFromFile. SetFromFile will exit returning in error if there is
// any.
func SetFromFile(path string) error {
var err error
switch os.Getenv("XDG_CURRENT_DESKTOP") {
case "GNOME", "Unity", "Pantheon":
// GNOME, Unity & Pantheon support setting background
// from gsettings & have the same key.
// gsettings takes path in format of a uri
path = fmt.Sprintf("%s%s", "file://", path)
err = exec.Command("gsettings",
"set org.gnome.desktop.background picture-uri", path).Run()
if err != nil {
err = fmt.Errorf("%s\n%s",
"set_unix.go: failed to set background with gsettings",
err.Error())
}
return err
case "LXDE":
// Background on LXDE can be set with pcmanfm (default
// file manager).
err = exec.Command("pcmanfm", "-w", path).Run()
if err != nil {
err = fmt.Errorf("%s\n%s",
"set_unix.go: failed to set background with pcmanfm",
err.Error())
}
return err
default:
// If WM/DE doesn't have a case then feh is used to
// set the background. This is tested to work on WMs
// similar to i3wm.
feh, err := exec.LookPath("feh")
if err != nil {
err = fmt.Errorf("%s\n%s",
"set_unix.go: feh not found in $PATH",
err.Error())
return err
}
err = exec.Command(feh, "--bg-fill", path).Run()
if err != nil {
err = fmt.Errorf("%s\n%s",
"set_unix.go: failed to set background with feh",
err.Error())
}
return err
}
}