2019-05-12 21:54:16 -04:00
|
|
|
;;; core/autoload/fonts.el -*- lexical-binding: t; -*-
|
|
|
|
|
2019-05-22 17:05:05 -04:00
|
|
|
;;;###autoload
|
2019-05-12 21:54:16 -04:00
|
|
|
(defvar doom-font-increment 2
|
|
|
|
"How many steps to increase the font size each time `doom/increase-font-size'
|
|
|
|
or `doom/decrease-font-size' are invoked.")
|
|
|
|
|
2019-05-22 17:05:05 -04:00
|
|
|
;;;###autoload
|
|
|
|
(defvar doom-big-font nil
|
|
|
|
"The font to use for `doom-big-font-mode'. If nil, `doom-font' will be used,
|
|
|
|
scaled up by `doom-big-font-increment'. See `doom-font' for details on
|
|
|
|
acceptable values for this variable.")
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defvar doom-big-font-increment 8
|
2019-05-12 21:54:16 -04:00
|
|
|
"How many steps to increase the font size (with `doom-font' as the base) when
|
2019-05-22 17:05:05 -04:00
|
|
|
`doom-big-font-mode' is enabled and `doom-big-font' is nil.")
|
2019-05-12 21:54:16 -04:00
|
|
|
|
2019-05-22 17:05:05 -04:00
|
|
|
;;;###autoload
|
2019-05-12 21:54:16 -04:00
|
|
|
(defvar doom-change-font-size-hook nil
|
|
|
|
"A hook run after adjusting the font size with `doom/increase-font-size',
|
|
|
|
`doom/decrease-font-size', or `doom/reset-font-size'.")
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
;;; Library
|
|
|
|
|
|
|
|
(defun doom--font-name (fontname frame)
|
|
|
|
(when (query-fontset fontname)
|
2019-06-25 21:38:16 +02:00
|
|
|
(when-let (ascii (assq 'ascii (aref (fontset-info fontname frame) 2)))
|
2019-05-12 21:54:16 -04:00
|
|
|
(setq fontname (nth 2 ascii))))
|
|
|
|
(or (x-decompose-font-name fontname)
|
|
|
|
(error "Cannot decompose font name")))
|
|
|
|
|
2019-06-17 16:01:37 +02:00
|
|
|
(defun doom--frame-list (&optional frame)
|
|
|
|
"Return a list consisting of FRAME and all of FRAME's child frames."
|
|
|
|
(let ((frame (or frame (selected-frame))))
|
|
|
|
(cons (selected-frame)
|
|
|
|
(cl-loop for fr in (frame-list)
|
|
|
|
if (eq (frame-parameter fr 'parent-frame) frame)
|
|
|
|
collect fr))))
|
|
|
|
|
2019-05-12 21:54:16 -04:00
|
|
|
;;;###autoload
|
|
|
|
(defun doom-adjust-font-size (increment &optional frame)
|
|
|
|
"Increase size of font in FRAME by INCREMENT.
|
2019-07-14 20:44:16 +02:00
|
|
|
FRAME parameter defaults to current frame."
|
2019-05-12 21:54:16 -04:00
|
|
|
(let* ((frame (or frame (selected-frame)))
|
|
|
|
(font (frame-parameter frame 'font))
|
|
|
|
(font (doom--font-name font frame)))
|
|
|
|
(let ((new-size (+ (string-to-number (aref font xlfd-regexp-pixelsize-subnum))
|
|
|
|
increment)))
|
|
|
|
(unless (> new-size 0)
|
2019-07-30 13:26:46 -04:00
|
|
|
(error "Font is too small at %d" new-size))
|
2019-05-12 21:54:16 -04:00
|
|
|
(aset font xlfd-regexp-pixelsize-subnum (number-to-string new-size)))
|
|
|
|
;; Set point size & width to "*", so frame width will adjust to new font size
|
|
|
|
(aset font xlfd-regexp-pointsize-subnum "*")
|
|
|
|
(aset font xlfd-regexp-avgwidth-subnum "*")
|
|
|
|
(setq font (x-compose-font-name font))
|
|
|
|
(unless (x-list-fonts font)
|
|
|
|
(error "Cannot change font size"))
|
2019-06-17 16:01:37 +02:00
|
|
|
(dolist (fr (doom--frame-list frame))
|
|
|
|
(modify-frame-parameters fr `((font . ,font))))))
|
2019-05-12 21:54:16 -04:00
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
;;; Commands
|
|
|
|
|
2019-07-18 15:27:20 +02:00
|
|
|
;;;###autoload
|
|
|
|
(defun doom/reload-font ()
|
|
|
|
"Reload your fonts, if they're set.
|
|
|
|
See `doom-init-fonts-h'."
|
|
|
|
(interactive)
|
|
|
|
(when doom-font
|
|
|
|
(set-frame-font doom-font t))
|
2019-07-21 15:07:34 +02:00
|
|
|
(mapc #'doom-init-fonts-h (frame-list)))
|
2019-07-18 15:27:20 +02:00
|
|
|
|
2019-05-12 21:54:16 -04:00
|
|
|
;;;###autoload
|
|
|
|
(defun doom/increase-font-size (count)
|
|
|
|
"Enlargens the font size across the current frame."
|
|
|
|
(interactive "p")
|
|
|
|
(let ((zoom-factor (or (frame-parameter nil 'font-scale) 0))
|
|
|
|
(increment (* count doom-font-increment)))
|
|
|
|
(setq zoom-factor (+ zoom-factor increment))
|
|
|
|
(if (= zoom-factor 0)
|
|
|
|
(doom/reset-font-size)
|
|
|
|
(doom-adjust-font-size increment)
|
|
|
|
(modify-frame-parameters nil `((font-scale . ,zoom-factor)))
|
|
|
|
(run-hooks 'doom-change-font-size-hook))))
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom/decrease-font-size (count)
|
|
|
|
"Shrinks the font size across the current frame."
|
|
|
|
(interactive "p")
|
|
|
|
(doom/increase-font-size (- count)))
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom/reset-font-size ()
|
|
|
|
"Reset font size.
|
|
|
|
|
|
|
|
Assuming it has been adjusted via `doom/increase-font-size' and
|
|
|
|
`doom/decrease-font-size'."
|
|
|
|
(interactive)
|
|
|
|
(let ((zoom-factor (frame-parameter nil 'font-scale)))
|
|
|
|
(if (not zoom-factor)
|
|
|
|
(user-error "Font size hasn't been changed")
|
2019-06-17 16:01:37 +02:00
|
|
|
(set-frame-font doom-font t (doom--frame-list))
|
2019-05-12 21:54:16 -04:00
|
|
|
(modify-frame-parameters nil '((font-scale)))
|
|
|
|
(run-hooks 'doom-change-font-size-hook))))
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(define-minor-mode doom-big-font-mode
|
|
|
|
"A global mode that resizes the font, for streams, screen-sharing and
|
|
|
|
presentations.
|
|
|
|
|
|
|
|
This uses `doom/increase-font-size' under the hood, and enlargens the font by
|
|
|
|
`doom-big-font-increment'."
|
|
|
|
:init-value nil
|
|
|
|
:lighter " BIG"
|
|
|
|
:global t
|
|
|
|
(unless doom-font
|
|
|
|
(user-error "`doom-font' must be set to a valid font"))
|
|
|
|
(let ((frame (selected-frame)))
|
2019-05-22 17:05:05 -04:00
|
|
|
(if doom-big-font
|
|
|
|
(progn
|
|
|
|
(set-frame-font (if doom-big-font-mode doom-big-font doom-font)
|
|
|
|
t (list frame))
|
|
|
|
(run-hooks 'doom-change-font-size-hook))
|
2019-06-17 16:01:37 +02:00
|
|
|
(set-frame-font doom-font t (doom--frame-list frame))
|
2019-05-22 17:05:05 -04:00
|
|
|
(when doom-big-font-mode
|
|
|
|
(doom-adjust-font-size doom-big-font-increment frame)))))
|