about summary refs log tree commit diff
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-01-16T19·16+0000
committerWilliam Carroll <wpcarro@gmail.com>2020-01-17T10·56+0000
commit106f62e4f107926c2cd22f2e400e12f144825d55 (patch)
tree1f96b06b110d6e2ece8c1bb06bbcc6b9754ed413
parent6612268250dc192f92018258fc46304cd6d03abb (diff)
Support scrot.el
Write some Elisp to work with `scrot`, Linux's CLI utility for taking
screenshots. It's been too long this that was working as expected!

As a bonus, I learned that it's possible to copy images to Linux's clipboard and
not just their file paths. This makes for a really nice UX!
-rw-r--r--configs/shared/.emacs.d/wpc/scrot.el66
1 files changed, 66 insertions, 0 deletions
diff --git a/configs/shared/.emacs.d/wpc/scrot.el b/configs/shared/.emacs.d/wpc/scrot.el
new file mode 100644
index 000000000000..3911d262fc92
--- /dev/null
+++ b/configs/shared/.emacs.d/wpc/scrot.el
@@ -0,0 +1,66 @@
+;; Author: William Carroll <wpcarro@gmail.com>
+
+;;; Commentary:
+;; scrot is a Linux utility for taking screenshots.
+
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Dependencies
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'f)
+(require 'string)
+(require 'ts)
+(require 'clipboard)
+(require 'kbd)
+
+(prelude/assert
+ (prelude/executable-exists? "scrot"))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Library
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defconst scrot/screenshot-directory "~/Downloads"
+  "The default directory for screenshot outputs.")
+
+(defconst scrot/path-to-executable "/usr/bin/scrot"
+  "Path to the scrot executable.")
+
+(defconst scrot/output-format "screenshot_%H:%M:%S_%Y-%m-%d.png"
+  "The format string for the output screenshot file.
+See scrot's man page for more information.")
+
+(defun scrot/copy-image (path)
+  "Use xclip to copy the image at PATH to the clipboard.
+This currently only works for PNG files because that's what I'm outputting"
+  (call-process "xclip" nil nil nil
+                "-selection" "clipboard" "-t" "image/png" path)
+  (message (string/format "[scrot.el] Image copied to clipboard!")))
+
+(defmacro scrot/call (&rest args)
+  "Call scrot with ARGS."
+  `(call-process ,scrot/path-to-executable nil nil nil ,@args))
+
+(defun scrot/fullscreen ()
+  "Screenshot the entire screen."
+  (interactive)
+  (let ((screenshot-path (f-join scrot/screenshot-directory
+                                 (ts-format scrot/output-format (ts-now)))))
+    (scrot/call screenshot-path)
+    (scrot/copy-image screenshot-path)))
+
+(defun scrot/select ()
+  "Click-and-drag to screenshot a region.
+The output path is copied to the user's clipboard."
+  (interactive)
+  (let ((screenshot-path (f-join scrot/screenshot-directory
+                                 (ts-format scrot/output-format (ts-now)))))
+    (scrot/call "--select" screenshot-path)
+    (scrot/copy-image screenshot-path)))
+
+(exwm-input-set-key (kbd/raw 'x11 "s") #'scrot/select)
+
+(provide 'scrot)
+;;; scrot.el ends here