summary refs log tree commit diff stats
path: root/background/set_unix.go
diff options
context:
space:
mode:
Diffstat (limited to 'background/set_unix.go')
-rw-r--r--background/set_unix.go66
1 files changed, 66 insertions, 0 deletions
diff --git a/background/set_unix.go b/background/set_unix.go
new file mode 100644
index 0000000..e782a92
--- /dev/null
+++ b/background/set_unix.go
@@ -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
+	}
+}