;;; fancy-banner.el -*- lexical-binding: t; -*- ;;; Commentary: ;; ;; See https://github.com/tecosaur/emacs-config/blob/master/config.org ;; ;;; Code: ;;; (setq +doom-dashboard--width 120) (defvar fancy-splash-image-template (expand-file-name "misc/splash-images/blackhole-lines-template.svg" doom-private-dir) "Default template svg used for the splash image, with substitutions from ") (defvar fancy-splash-image-nil (expand-file-name "misc/splash-images/transparent-pixel.png" doom-private-dir) "An image to use at minimum size, usually a transparent pixel") (defvar fancy-splash-sizes `((:height 400 :min-height 50 :padding (0 . 2)) (:height 350 :min-height 42 :padding (1 . 4)) (:height 300 :min-height 35 :padding (1 . 3)) (:height 250 :min-height 30 :padding (1 . 2)) (:height 0 :min-height 0 :padding (0 . 0) :file ,fancy-splash-image-nil)) "list of plists with the following properties :height the height of the image :min-height minimum `frame-height' for image :padding `+doom-dashboard-banner-padding' to apply :template non-default template file :file file to use instead of template") (setq fancy-splash-sizes `((:height 400 :min-height 40 :padding (0 . 4) :template ,(expand-file-name "misc/splash-images/blackhole-lines-0.svg" doom-private-dir)) (:height 350 :min-height 32 :padding (1 . 4) :template ,(expand-file-name "misc/splash-images/blackhole-lines-0.svg" doom-private-dir)) (:height 300 :min-height 28 :padding (1 . 4) :template ,(expand-file-name "misc/splash-images/blackhole-lines-1.svg" doom-private-dir)) (:height 250 :min-height 26 :padding (1 . 3) :template ,(expand-file-name "misc/splash-images/blackhole-lines-2.svg" doom-private-dir)) (:height 200 :min-height 24 :padding (1 . 3) :template ,(expand-file-name "misc/splash-images/blackhole-lines-3.svg" doom-private-dir)) (:height 150 :min-height 22 :padding (1 . 2) :template ,(expand-file-name "misc/splash-images/blackhole-lines-4.svg" doom-private-dir)) (:height 100 :min-height 20 :padding (1 . 2) :template ,(expand-file-name "misc/splash-images/blackhole-lines-5.svg" doom-private-dir)) (:height 100 :min-height 14 :padding (1 . 2) :template ,(expand-file-name "misc/splash-images/emacs-e-template.svg" doom-private-dir)) (:height 0 :min-height 0 :padding (0 . 0) :file ,fancy-splash-image-nil))) (defvar fancy-splash-template-colours '(("$colour1" . keywords) ("$colour2" . type) ("$colour3" . base5) ("$colour4" . base8)) "list of colour-replacement alists of the form (\"$placeholder\" . 'theme-colour) which applied the template") (unless (file-exists-p (expand-file-name "theme-splashes" doom-cache-dir)) (make-directory (expand-file-name "theme-splashes" doom-cache-dir) t)) (defun fancy-splash-filename (theme-name height) (expand-file-name (concat (file-name-as-directory "theme-splashes") theme-name "-" (number-to-string height) ".svg") doom-cache-dir)) (defun fancy-splash-clear-cache () "Delete all cached fancy splash images" (interactive) (delete-directory (expand-file-name "theme-splashes" doom-cache-dir) t) (message "Cache cleared!")) (defun fancy-splash-generate-image (template height) "Read TEMPLATE and create an image if HEIGHT with colour substitutions as described by `fancy-splash-template-colours' for the current theme" (with-temp-buffer (insert-file-contents template) (re-search-forward "$height" nil t) (replace-match (number-to-string height) nil nil) (dolist (substitution fancy-splash-template-colours) (goto-char (point-min)) (while (re-search-forward (car substitution) nil t) (replace-match (doom-color (cdr substitution)) nil nil))) (write-region nil nil (fancy-splash-filename (symbol-name doom-theme) height) nil nil))) (defun fancy-splash-generate-images () "Perform `fancy-splash-generate-image' in bulk" (dolist (size fancy-splash-sizes) (unless (plist-get size :file) (fancy-splash-generate-image (or (plist-get size :file) (plist-get size :template) fancy-splash-image-template) (plist-get size :height))))) (defun ensure-theme-splash-images-exist (&optional height) (unless (file-exists-p (fancy-splash-filename (symbol-name doom-theme) (or height (plist-get (car fancy-splash-sizes) :height)))) (fancy-splash-generate-images))) (defun get-appropriate-splash () (let ((height (frame-height))) (cl-some (lambda (size) (when (>= height (plist-get size :min-height)) size)) fancy-splash-sizes))) (setq fancy-splash-last-size nil) (setq fancy-splash-last-theme nil) (defun set-appropriate-splash (&rest _) (let ((appropriate-image (get-appropriate-splash))) (unless (and (equal appropriate-image fancy-splash-last-size) (equal doom-theme fancy-splash-last-theme))) (unless (plist-get appropriate-image :file) (ensure-theme-splash-images-exist (plist-get appropriate-image :height))) (setq fancy-splash-image (or (plist-get appropriate-image :file) (fancy-splash-filename (symbol-name doom-theme) (plist-get appropriate-image :height)))) (setq +doom-dashboard-banner-padding (plist-get appropriate-image :padding)) (setq fancy-splash-last-size appropriate-image) (setq fancy-splash-last-theme doom-theme) (+doom-dashboard-reload))) (add-hook 'window-size-change-functions #'set-appropriate-splash) (add-hook 'doom-load-theme-hook #'set-appropriate-splash) (provide 'fancy-banner) ;; fancy-banner.el ends here