Fix #1706: Make doom-big-font-mode affect all frames

This commit is contained in:
Henrik Lissner 2020-01-13 01:08:49 -05:00
parent b320075c5b
commit e7de8118ce
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -20,56 +20,48 @@ acceptable values for this variable.")
;; ;;
;;; Library ;;; Library
(defun doom--font-name (fontname frame) (defun doom--font-name (fontname)
(when (query-fontset fontname) (when (query-fontset fontname)
(when-let (ascii (assq 'ascii (aref (fontset-info fontname frame) 2))) (when-let (ascii (assq 'ascii (aref (fontset-info fontname) 2)))
(setq fontname (nth 2 ascii)))) (setq fontname (nth 2 ascii))))
(or (x-decompose-font-name fontname) (or (x-decompose-font-name fontname)
(error "Cannot decompose font name"))) (error "Cannot decompose font name")))
(defun doom--frame-list (&optional frame) (defvar doom--font-scale nil)
"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))))
;;;###autoload ;;;###autoload
(defun doom-adjust-font-size (increment &optional frame) (defun doom-adjust-font-size (increment)
"Increase size of font in FRAME by INCREMENT. "Increase size of font in FRAME by INCREMENT.
FRAME parameter defaults to current frame." FRAME parameter defaults to current frame."
(if (null increment) (if (null increment)
(let ((frames (doom--frame-list frame))) (progn
(dolist (frame frames) (set-frame-font doom-font 'keep-size t)
(when (frame-parameter frame 'font-scale) (setf (alist-get 'font default-frame-alist)
(set-frame-parameter frame 'font-scale nil))) (cond ((stringp doom-font) doom-font)
(set-frame-font doom-font 'keep-size frames) ((fontp doom-font) (font-xlfd-name doom-font))
(and frames t)) ((signal 'wrong-type-argument (list '(fontp stringp)
(let (success) doom-font)))))
(dolist (frame (doom--frame-list frame)) t)
(let* ((font (frame-parameter frame 'font)) (let* ((font (frame-parameter nil 'font))
(font (doom--font-name font frame)) (font (doom--font-name font))
(increment (* increment doom-font-increment)) (increment (* increment doom-font-increment))
(zoom-factor (or (frame-parameter frame 'font-scale) 0))) (zoom-factor (or doom--font-scale 0))
(let ((new-size (+ (string-to-number (aref font xlfd-regexp-pixelsize-subnum)) success)
increment))) (let ((new-size (+ (string-to-number (aref font xlfd-regexp-pixelsize-subnum))
(unless (> new-size 0) increment)))
(error "Font is too small at %d" new-size)) (unless (> new-size 0)
(aset font xlfd-regexp-pixelsize-subnum (number-to-string new-size))) (error "Font is too small at %d" new-size))
;; Set point size & width to "*", so frame width will adjust to new font size (aset font xlfd-regexp-pixelsize-subnum (number-to-string new-size)))
(aset font xlfd-regexp-pointsize-subnum "*") ;; Set point size & width to "*", so frame width will adjust to new font size
(aset font xlfd-regexp-avgwidth-subnum "*") (aset font xlfd-regexp-pointsize-subnum "*")
(setq font (x-compose-font-name font)) (aset font xlfd-regexp-avgwidth-subnum "*")
(unless (x-list-fonts font) (setq font (x-compose-font-name font))
(error "Cannot change font size")) (unless (x-list-fonts font)
(set-frame-parameter frame 'font font) (error "Cannot change font size"))
(set-frame-parameter frame 'font-scale (+ zoom-factor increment)) (set-frame-font font 'keep-size t)
(setq success t))) (setf (alist-get 'font default-frame-alist) font)
(when success (setq doom--font-scale (+ zoom-factor increment))
;; Unlike `set-frame-font', `set-frame-parameter' won't trigger this ;; Unlike `set-frame-font', `set-frame-parameter' won't trigger this
(run-hooks 'after-setting-font-hook) (run-hooks 'after-setting-font-hook))))
t))))
;; ;;
@ -127,8 +119,13 @@ This uses `doom/increase-font-size' under the hood, and enlargens the font by
(unless doom-font (unless doom-font
(user-error "`doom-font' must be set to a valid font")) (user-error "`doom-font' must be set to a valid font"))
(if doom-big-font (if doom-big-font
(set-frame-font (if doom-big-font-mode doom-big-font doom-font) (let ((font (if doom-big-font-mode doom-big-font doom-font)))
'keep-size (doom--frame-list)) (set-frame-font font 'keep-size t)
(setf (alist-get 'font default-frame-alist)
(cond ((stringp doom-font) font)
((fontp font) (font-xlfd-name font))
((signal 'wrong-type-argument (list '(fontp stringp)
font))))))
(doom-adjust-font-size (doom-adjust-font-size
(and doom-big-font-mode (and doom-big-font-mode
(integerp doom-big-font-increment) (integerp doom-big-font-increment)