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