From 106f62e4f107926c2cd22f2e400e12f144825d55 Mon Sep 17 00:00:00 2001 From: William Carroll Date: Thu, 16 Jan 2020 19:16:56 +0000 Subject: 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! --- configs/shared/.emacs.d/wpc/scrot.el | 66 ++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 configs/shared/.emacs.d/wpc/scrot.el (limited to 'configs/shared/.emacs.d/wpc/scrot.el') 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 + +;;; 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 -- cgit 1.4.1