about summary refs log tree commit diff
path: root/emacs/.emacs.d/wpc/wallpaper.el
diff options
context:
space:
mode:
Diffstat (limited to 'emacs/.emacs.d/wpc/wallpaper.el')
-rw-r--r--emacs/.emacs.d/wpc/wallpaper.el92
1 files changed, 92 insertions, 0 deletions
diff --git a/emacs/.emacs.d/wpc/wallpaper.el b/emacs/.emacs.d/wpc/wallpaper.el
new file mode 100644
index 000000000000..9aa41cd364a4
--- /dev/null
+++ b/emacs/.emacs.d/wpc/wallpaper.el
@@ -0,0 +1,92 @@
+;;; wallpaper.el --- Control Linux desktop wallpaper -*- lexical-binding: t -*-
+;; Author: William Carroll <wpcarro@gmail.com>
+
+;;; Commentary:
+;; Functions for setting desktop wallpaper.
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Dependencies
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'prelude)
+(require 'fs)
+(require 'cycle)
+(require 'string)
+(require 'general)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Library
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defcustom wallpaper/keybindings? t
+  "If non-nil, install the keybindings.")
+
+(defcustom wallpaper/path-to-dir
+  (f-expand "~/.local/share/wallpaper")
+  "Path to the images that will be used as the wallpaper.")
+
+(defconst wallpaper/whitelist
+  (cycle/from-list
+   (fs/ls wallpaper/path-to-dir t))
+  "My preferred computer wallpapers.")
+
+(defun wallpaper/set (path)
+  "Set computer wallpaper to image at `PATH' using `feh` under-the-hood.
+`PATH' can be absolute or relative since `f-expand' is called in the function
+  body to ensure feh can resolve the path."
+  (prelude/start-process
+   :name "wallpaper/set"
+   :command (string/format "feh --bg-scale --no-feh-bg %s" (f-expand path))))
+
+(defun wallpaper/whitelist-set (wallpaper)
+  "Focuses the WALLPAPER in the `wallpaper/whitelist' cycle."
+  (cycle/focus (lambda (x) (equal x wallpaper)) wallpaper/whitelist)
+  (wallpaper/set (wallpaper/current)))
+
+(defun wallpaper/next ()
+  "Cycles to the next wallpaper."
+  (interactive)
+  (let ((wallpaper (cycle/next wallpaper/whitelist)))
+    (wallpaper/set wallpaper)
+    (message (string/format "Active wallpaper: %s" (f-filename wallpaper)))))
+
+(defun wallpaper/prev ()
+  "Cycles to the previous wallpaper."
+  (interactive)
+  (let ((wallpaper (cycle/prev wallpaper/whitelist)))
+    (wallpaper/set wallpaper)
+    (message (string/format "Active wallpaper: %s" (f-filename wallpaper)))))
+
+;; TODO: Define a macro that handles, next, prev, select, current for working
+;; with cycles, since this is a common pattern.
+
+(defun wallpaper/print-current ()
+  "Message the currently enabled wallpaper."
+  (interactive)
+  (message
+   (cycle/current wallpaper/whitelist)))
+
+(defun wallpaper/current ()
+  "Return the currently enabled wallpaper."
+  (cycle/current wallpaper/whitelist))
+
+(defun wallpaper/ivy-select ()
+  "Use `counsel' to select and set a wallpaper from the `wallpaper/whitelist'."
+  (interactive)
+  (wallpaper/whitelist-set
+   (ivy-read "Select wallpaper: " (cycle/to-list wallpaper/whitelist))))
+
+;; TODO: Create macro-based module system that will auto-namespace functions,
+;; constants, etc. with the filename like `wallpaper'.
+
+(when wallpaper/keybindings?
+  (general-define-key
+   :prefix "<SPC>"
+   :states '(normal)
+   "Fw" #'wallpaper/next
+   "Pw" #'wallpaper/prev))
+
+(provide 'wallpaper)
+;;; wallpaper.el ends here