diff --git a/core/autoload/fonts.el b/core/autoload/fonts.el new file mode 100644 index 000000000..6b1272eaa --- /dev/null +++ b/core/autoload/fonts.el @@ -0,0 +1,100 @@ +;;; core/autoload/fonts.el -*- lexical-binding: t; -*- + +(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.") + +(defvar doom-big-font-increment 14 + "How many steps to increase the font size (with `doom-font' as the base) when +`doom-big-font-mode' is enabled.") + +(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) + (when-let* ((ascii (assq 'ascii (aref (fontset-info fontname frame) 2)))) + (setq fontname (nth 2 ascii)))) + (or (x-decompose-font-name fontname) + (error "Cannot decompose font name"))) + +;;;###autoload +(defun doom-adjust-font-size (increment &optional frame) + "Increase size of font in FRAME by INCREMENT. +Interactively, INCREMENT is given by the prefix argument. +Optional FRAME parameter defaults to current frame." + (interactive "p") + (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) + (error "Font is to 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")) + (modify-frame-parameters frame `((font . ,font))))) + + +;; +;;; Commands + +;;;###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") + (set-frame-font doom-font t) + (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))) + (set-frame-font doom-font t (list frame)) + (when doom-big-font-mode + (doom-adjust-font-size doom-big-font-increment frame)))) diff --git a/core/autoload/hydras.el b/core/autoload/hydras.el index 407289148..68f6b4360 100644 --- a/core/autoload/hydras.el +++ b/core/autoload/hydras.el @@ -5,9 +5,9 @@ " Text zoom: _j_:zoom in, _k_:zoom out, _0_:reset " - ("j" text-scale-increase "in") - ("k" text-scale-decrease "out") - ("0" (text-scale-set 0) "reset")) + ("j" doom/increase-font-size "in") + ("k" doom/decrease-font-size "out") + ("0" doom/reset-font-size "reset")) ;;;###autoload (autoload 'doom-window-nav-hydra/body "core/autoload/hydras" nil t) (defhydra doom-window-nav-hydra (:hint nil) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index dad427c58..a631c7b6b 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -183,30 +183,3 @@ Inspired from http://demonastery.org/2013/04/emacs-evil-narrow-region/" (setq doom--buffer-narrowed-origin nil)) (t (widen)))) - - -;; -;; Modes - -;;;###autoload -(define-minor-mode doom-big-font-mode - "A global mode that resizes the font, for streams, screen-sharing and -presentations. - -Uses `doom-big-font' when enabled." - :init-value nil - :lighter " BIG" - :global t - (unless doom-big-font - (user-error "`doom-big-font' must be set to a valid font")) - (unless doom-font - (user-error "`doom-font' must be set to a valid font")) - (let ((doom-font (if doom-big-font-mode - doom-big-font - doom-font))) - (setf (alist-get 'font default-frame-alist) - (cond ((null doom-font)) - ((stringp doom-font) doom-font) - ((fontp doom-font) (font-xlfd-name doom-font)) - ((signal 'wrong-type-argument (list '(fontp stringp) doom-font))))) - (set-frame-font doom-font t t))) diff --git a/core/core-ui.el b/core/core-ui.el index 1b3dfb25c..818b8487a 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -20,10 +20,6 @@ Examples: (setq doom-font (font-spec :family \"Fira Mono\" :size 12)) (setq doom-font \"Terminus (TTF):pixelsize=12:antialias=off\")") -(defvar doom-big-font nil - "The font to use when `doom-big-font-mode' is enabled. Expects either a -`font-spec' or a XFT font string. See `doom-font' for examples.") - (defvar doom-variable-pitch-font nil "The font to use for variable-pitch text. diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 21d65879c..7f133b4c9 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -22,9 +22,9 @@ "" #'text-scale-increase "" #'text-scale-decrease "" (λ! (text-scale-set 0)) - "M-+" (λ! (text-scale-set 0)) - "M-=" #'text-scale-increase - "M--" #'text-scale-decrease + "M-+" #'doom/reset-font-size + "M-=" #'doom/increase-font-size + "M--" #'doom/decrease-font-size ;; Editor related bindings [remap newline] #'newline-and-indent "C-j" #'+default/newline diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 4cc12af84..524823b29 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -162,9 +162,9 @@ "s-v" #'yank "s-s" #'save-buffer ;; Buffer-local font scaling - "s-+" (λ! (text-scale-set 0)) - "s-=" #'text-scale-increase - "s--" #'text-scale-decrease + "s-+" #'doom/reset-font-size + "s-=" #'doom/increase-font-size + "s--" #'doom/decrease-font-size ;; Conventional text-editing keys & motions "s-a" #'mark-whole-buffer :g "s-/" (λ! (save-excursion (comment-line 1))) diff --git a/modules/ui/modeline/autoload.el b/modules/ui/modeline/autoload.el index 3c7478a65..dbc37836a 100644 --- a/modules/ui/modeline/autoload.el +++ b/modules/ui/modeline/autoload.el @@ -11,18 +11,22 @@ (defvar +modeline--old-bar-height nil) -;;;###autoload -(defun +modeline|resize-for-big-font () - "Adjust the modeline's height when `doom-big-font-mode' is enabled. This was -made to be added to `doom-big-font-mode-hook'." +(defun +modeline|resize-for-font () + "Adjust the modeline's height when the font size is changed by +`doom/increase-font-size' or `doom/decrease-font-size'. + +Meant for `doom-change-font-size-hook'." (unless +modeline--old-bar-height (setq +modeline--old-bar-height doom-modeline-height)) - (let ((default-height +modeline--old-bar-height)) - (if doom-big-font-mode - (let* ((font-size (font-get doom-font :size)) - (big-size (font-get doom-big-font :size)) - (ratio (/ (float big-size) font-size))) - (setq doom-modeline-height (ceiling (* default-height ratio 0.75)))) + (let ((default-height +modeline--old-bar-height) + (scale (or (frame-parameter nil 'font-scale) 0))) + (if (> scale 0) + (let* ((font-size (string-to-number + (aref (doom--font-name (frame-parameter nil 'font) + (selected-frame)) + xlfd-regexp-pixelsize-subnum))) + (scale (frame-parameter nil 'font-scale))) + (setq doom-modeline-height (+ default-height (* scale doom-font-increment)))) (setq doom-modeline-height default-height)) ;; already has a variable watcher in Emacs 26+ (unless EMACS26+ (doom-modeline-refresh-bars)))) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 3153784d8..77e6638d2 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -34,7 +34,7 @@ (add-hook 'doom-modeline-mode-hook #'size-indication-mode) ; filesize in modeline (add-hook 'doom-modeline-mode-hook #'column-number-mode) ; cursor column in modeline - (add-hook 'doom-big-font-mode-hook #'+modeline|resize-for-big-font) + (add-hook 'doom-change-font-size-hook #'+modeline|resize-for-font) (add-hook 'doom-load-theme-hook #'doom-modeline-refresh-bars) (add-hook '+doom-dashboard-mode-hook #'doom-modeline-set-project-modeline)