[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/fontaine 752a0af5df: Accept optional FRAME for font cha
From: |
ELPA Syncer |
Subject: |
[elpa] externals/fontaine 752a0af5df: Accept optional FRAME for font changes |
Date: |
Mon, 2 May 2022 00:57:55 -0400 (EDT) |
branch: externals/fontaine
commit 752a0af5df1722c10da141d28147c1528fc9eda9
Author: Protesilaos Stavrou <info@protesilaos.com>
Commit: Protesilaos Stavrou <info@protesilaos.com>
Accept optional FRAME for font changes
---
README.org | 17 +++++-
fontaine.el | 175 ++++++++++++++++++++++++++++++++++++++----------------------
2 files changed, 126 insertions(+), 66 deletions(-)
diff --git a/README.org b/README.org
index 843370d81f..956ef6e7b9 100644
--- a/README.org
+++ b/README.org
@@ -69,8 +69,8 @@ modify this GNU manual.”
#+vindex: fontaine-presets
Fontaine lets the user specify presets of font configurations and set
-them on demand. The user option ~fontaine-presets~ holds all such
-presets.
+them on demand on graphical Emacs frames. The user option
+~fontaine-presets~ holds all such presets.
Presets consist of a list of properties that govern the family, weight,
and height of the faces ~default~, ~fixed-pitch~, ~variable-pitch~,
@@ -112,6 +112,16 @@ such as:
(fontaine-set-preset 'regular)
#+end_src
+The default behaviour of ~fontaine-set-preset~ is to change fonts across
+all graphical frames. The user can, however, limit the changes to a
+given frame. For interactive use, this is done by invoking the command
+with a universal prefix argument (=C-u= by default), which changes fonts
+only in the current frame. When used in Lisp, the FRAME argument can be
+a frame object (satisfies ~framep~) or a non-nil value: the former
+applies the effects to the given object, while the latter means the
+current frame and thus is the same as interactively supplying the prefix
+argument.
+
#+findex: fontaine-set-face-font
#+vindex: fontaine-font-families
The command ~fontaine-set-face-font~ prompts with completion for a face
@@ -132,6 +142,9 @@ Changing the ~bold~ and ~italic~ faces only has a
noticeable effect if
the underlying theme does not hardcode a weight and slant but inherits
from those faces instead (e.g. the ~modus-themes~).
+The ~fontaine-set-face-font~ also accepts an optional FRAME argument,
+which is the same as what was described above for ~fontaine-set-preset~.
+
#+vindex: fontaine-latest-state-file
#+findex: fontaine-store-latest-preset
#+findex: fontaine-restore-latest-preset
diff --git a/fontaine.el b/fontaine.el
index 5e5aff698f..babbb7c9c7 100644
--- a/fontaine.el
+++ b/fontaine.el
@@ -26,8 +26,8 @@
;;; Commentary:
;;
;; Fontaine lets the user specify presets of font configurations and set
-;; them on demand. The user option `fontaine-presets' holds all such
-;; presets.
+;; them on demand on graphical Emacs frames. The user option
+;; `fontaine-presets' holds all such presets.
;;
;; Presets consist of a list of properties that govern the family, weight,
;; and height of the faces `default', `fixed-pitch', `variable-pitch',
@@ -64,6 +64,16 @@
;;
;; (fontaine-set-preset 'regular)
;;
+;; The default behaviour of `fontaine-set-preset' is to change fonts across
+;; all graphical frames. The user can, however, limit the changes to a
+;; given frame. For interactive use, this is done by invoking the command
+;; with a universal prefix argument (`C-u' by default), which changes fonts
+;; only in the current frame. When used in Lisp, the FRAME argument can be
+;; a frame object (satisfies `framep') or a non-nil value: the former
+;; applies the effects to the given object, while the latter means the
+;; current frame and thus is the same as interactively supplying the prefix
+;; argument.
+;;
;; The command `fontaine-set-face-font' prompts with completion for a face
;; and then asks the user to specify the value of the relevant properties.
;; Preferred font families can be defined in the user option
@@ -82,6 +92,9 @@
;; the underlying theme does not hardcode a weight and slant but inherits
;; from those faces instead (e.g. the `modus-themes').
;;
+;; The `fontaine-set-face-font' also accepts an optional FRAME argument,
+;; which is the same as what was described above for `fontaine-set-preset'.
+;;
;; The latest value of `fontaine-set-preset' is stored in a file whose
;; location is defined in `fontaine-latest-state-file'. Saving is done by
;; the `fontaine-store-latest-preset' function, which should be assigned to
@@ -298,80 +311,94 @@ combine the other two lists."
;;;; General utilities
-(defun fontaine--set-face-attributes (face family &optional weight height)
- "Set FACE font to FAMILY, with optional HEIGHT and WEIGHT."
+(defun fontaine--frame (frame)
+ "Return FRAME for `internal-set-lisp-face-attribute'."
+ (cond
+ ((framep frame) frame)
+ (frame nil)
+ (t 0)))
+
+(defun fontaine--set-face-attributes (face family &optional weight height
frame)
+ "Set FACE font to FAMILY, with optional HEIGHT, WEIGHT, FRAME."
(let ((family (or family "Monospace"))
(height (or height (if (eq face 'default) 100 1.0)))
- (weight (or weight 'normal)))
+ (weight (or weight 'normal))
+ (frames (fontaine--frame frame)))
;; ;; Read this: <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=45920>
;; ;; Hence why the following fails. Keeping it for posterity...
;; (set-face-attribute face nil :family family :weight weight :height
height)
(if (eq (face-attribute face :weight) weight)
- (internal-set-lisp-face-attribute face :family family 0)
- (internal-set-lisp-face-attribute face :weight weight 0)
- (internal-set-lisp-face-attribute face :family family 0)
- (internal-set-lisp-face-attribute face :weight weight 0))
- (internal-set-lisp-face-attribute face :height height 0)))
-
-(defun fontaine--set-italic-slant (family slant)
- "Set FAMILY and SLANT of `italic' face."
+ (internal-set-lisp-face-attribute face :family family frames)
+ (internal-set-lisp-face-attribute face :weight weight frames)
+ (internal-set-lisp-face-attribute face :family family frames)
+ (internal-set-lisp-face-attribute face :weight weight frames))
+ (internal-set-lisp-face-attribute face :height height frames)))
+
+(defun fontaine--set-italic-slant (family slant &optional frame)
+ "Set FAMILY and SLANT of `italic' face on optional FRAME."
(let ((slant (or slant 'italic))
- (family (or family 'unspecified)))
+ (family (or family 'unspecified))
+ (frames (fontaine--frame frame)))
(if (eq (face-attribute 'italic :slant) slant)
- (internal-set-lisp-face-attribute 'italic :family family 0)
- (internal-set-lisp-face-attribute 'italic :slant slant 0)
- (internal-set-lisp-face-attribute 'italic :family family 0)
- (internal-set-lisp-face-attribute 'italic :slant slant 0))))
+ (internal-set-lisp-face-attribute 'italic :family family frames)
+ (internal-set-lisp-face-attribute 'italic :slant slant frames)
+ (internal-set-lisp-face-attribute 'italic :family family frames)
+ (internal-set-lisp-face-attribute 'italic :slant slant frames))))
;;;; Apply preset configurations
-(defun fontaine--apply-default-preset (preset)
- "Set `default' face attributes based on PRESET."
+(defun fontaine--apply-default-preset (preset &optional frame)
+ "Set `default' face attributes based on PRESET for optional FRAME."
(if-let ((properties (alist-get preset fontaine-presets)))
(progn
(fontaine--set-face-attributes
'default
(plist-get properties :default-family)
(plist-get properties :default-weight)
- (plist-get properties :default-height))
+ (plist-get properties :default-height)
+ frame)
(setq-default line-spacing (plist-get properties :line-spacing)))
(user-error "%s is not in `fontaine-presets'" preset)))
-(defun fontaine--apply-fixed-pitch-preset (preset)
- "Set `fixed-pitch' face attributes based on PRESET."
+(defun fontaine--apply-fixed-pitch-preset (preset &optional frame)
+ "Set `fixed-pitch' face attributes based on PRESET for optional FRAME."
(if-let ((properties (alist-get preset fontaine-presets)))
(fontaine--set-face-attributes
'fixed-pitch
(or (plist-get properties :fixed-pitch-family) (plist-get properties
:default-family))
(or (plist-get properties :fixed-pitch-weight) (plist-get properties
:default-weight))
- (or (plist-get properties :fixed-pitch-height) 1.0))
+ (or (plist-get properties :fixed-pitch-height) 1.0)
+ frame)
(user-error "%s is not in `fontaine-presets'" preset)))
-(defun fontaine--apply-variable-pitch-preset (preset)
- "Set `variable-pitch' face attributes based on PRESET."
+(defun fontaine--apply-variable-pitch-preset (preset &optional frame)
+ "Set `variable-pitch' face attributes based on PRESET for optional FRAME."
(if-let ((properties (alist-get preset fontaine-presets)))
(fontaine--set-face-attributes
'variable-pitch
(or (plist-get properties :variable-pitch-family) (plist-get properties
:default-family))
(or (plist-get properties :variable-pitch-weight) (plist-get properties
:default-weight))
- (or (plist-get properties :variable-pitch-height) 1.0))
+ (or (plist-get properties :variable-pitch-height) 1.0)
+ frame)
(user-error "%s is not in `fontaine-presets'" preset)))
-(defun fontaine--apply-bold-preset (preset)
- "Set `bold' face attributes based on PRESET."
+(defun fontaine--apply-bold-preset (preset &optional frame)
+ "Set `bold' face attributes based on PRESET for optional FRAME."
(if-let ((properties (alist-get preset fontaine-presets)))
(fontaine--set-face-attributes
'bold
(or (plist-get properties :bold-family) 'unspecified)
- (or (plist-get properties :bold-weight) 'bold))
+ (or (plist-get properties :bold-weight) 'bold)
+ frame)
(user-error "%s is not in `fontaine-presets'" preset)))
-(defun fontaine--apply-italic-preset (preset)
- "Set `italic' face attributes based on PRESET."
+(defun fontaine--apply-italic-preset (preset &optional frame)
+ "Set `italic' face attributes based on PRESET for optional FRAME."
(if-let ((properties (alist-get preset fontaine-presets)))
(fontaine--set-italic-slant
(or (plist-get properties :italic-family) 'unspecified)
- (or (plist-get properties :italic-slant) 'italic))
+ (or (plist-get properties :italic-slant) 'italic)
+ frame)
(user-error "%s is not in `fontaine-presets'" preset)))
(defvar fontaine--font-display-hist '()
@@ -396,23 +423,33 @@ combine the other two lists."
"Current font set in `fontaine-presets'.")
;;;###autoload
-(defun fontaine-set-preset (preset)
+(defun fontaine-set-preset (preset &optional frame)
"Set font configurations specified in PRESET.
PRESET is a symbol that represents the car of a list in
`fontaine-presets'. If there is only one available, apply it
-outright, else prompt with completion."
+outright, else prompt with completion.
+
+Unless optional FRAME argument is supplied, apply the change to
+all frames. If FRAME satisfies `framep', then make the changes
+affect only it. If FRAME is non-nil, interpret it as the current
+frame and apply the effects to it.
+
+When called interactively with a universal prefix
+argument (\\[universal-argument]), FRAME is interpreted as
+non-nil."
(interactive
(list
(if (= (length fontaine-presets) 1)
(caar fontaine-presets)
- (fontaine--set-fonts-prompt))))
+ (fontaine--set-fonts-prompt))
+ current-prefix-arg))
(if (not window-system)
(user-error "Cannot use this in a terminal emulator; try the Emacs GUI")
- (fontaine--apply-default-preset preset)
- (fontaine--apply-fixed-pitch-preset preset)
- (fontaine--apply-variable-pitch-preset preset)
- (fontaine--apply-bold-preset preset)
- (fontaine--apply-italic-preset preset)
+ (fontaine--apply-default-preset preset frame)
+ (fontaine--apply-fixed-pitch-preset preset frame)
+ (fontaine--apply-variable-pitch-preset preset frame)
+ (fontaine--apply-bold-preset preset frame)
+ (fontaine--apply-italic-preset preset frame)
(setq fontaine--current-preset preset)
(add-to-history 'fontaine--preset-history (format "%s" preset))
(run-hooks 'fontaine-set-preset-hook)))
@@ -479,8 +516,8 @@ Target FRAME, if provided as an optional argument."
(defvar fontaine--natnum-history '()
"Minibuffer history for natural numbers.")
-(defun fontaine--set-default ()
- "Set `default' attributes interactively."
+(defun fontaine--set-default (&optional frame)
+ "Set `default' attributes, optionally for FRAME."
(let* ((families (or (alist-get 'default fontaine-font-families)
(append (alist-get 'fixed-pitch fontaine-font-families)
(alist-get 'variable-pitch
fontaine-font-families))
@@ -494,7 +531,7 @@ Target FRAME, if provided as an optional argument."
(or (string-to-number (nth 0
fontaine--natnum-history)))
'fontaine--natnum-history)))
(if (natnump height)
- (fontaine--set-face-attributes 'default family weight height)
+ (fontaine--set-face-attributes 'default family weight height frame)
(user-error "Height of `default' face must be a natural number"))))
(defvar fontaine--float-history '()
@@ -503,8 +540,8 @@ Target FRAME, if provided as an optional argument."
(defvar fontaine--fixed-pitch-font-family-history '()
"Minibuffer history of selected `fixed-pitch' font families.")
-(defun fontaine--set-fixed-pitch ()
- "Set `fixed-pitch' attributes interactively."
+(defun fontaine--set-fixed-pitch (&optional frame)
+ "Set `fixed-pitch' attributes, optionally for FRAME."
(let* ((families (or (alist-get 'fixed-pitch fontaine-font-families)
(fontaine--family-list-fixed-pitch)))
(family (completing-read "Font family of `fixed-pitch': "
@@ -515,14 +552,14 @@ Target FRAME, if provided as an optional argument."
(height (read-number "Height of `fixed-pitch' face (must be a
floating point): "
1.0 'fontaine--float-history)))
(if (floatp height)
- (fontaine--set-face-attributes 'fixed-pitch family weight height)
+ (fontaine--set-face-attributes 'fixed-pitch family weight height frame)
(user-error "Height of `fixed-pitch' face must be a floating point"))))
(defvar fontaine--variable-pitch-font-family-history '()
"Minibuffer history of selected `variable-pitch' font families.")
-(defun fontaine--set-variable-pitch ()
- "Set `variable-pitch' attributes interactively."
+(defun fontaine--set-variable-pitch (&optional frame)
+ "Set `variable-pitch' attributes, optionally for FRAME."
(let* ((families (or (alist-get 'variable-pitch fontaine-font-families)
(fontaine--family-list-variable-pitch)))
(family (completing-read "Font family of `variable-pitch': "
@@ -533,23 +570,23 @@ Target FRAME, if provided as an optional argument."
(height (read-number "Height of `variable-pitch' face (must be a
floating point): "
1.0 'fontaine--float-history)))
(if (floatp height)
- (fontaine--set-face-attributes 'variable-pitch family weight height)
+ (fontaine--set-face-attributes 'variable-pitch family weight height
frame)
(user-error "Height of `variable-pitch' face must be a floating
point"))))
-(defun fontaine--set-bold ()
- "Set `bold' attributes interactively."
+(defun fontaine--set-bold (&optional frame)
+ "Set `bold' attributes, optionally for FRAME."
(let ((weight (intern (completing-read "Select weight for `bold': "
fontaine--font-weights nil t))))
- (fontaine--set-face-attributes 'bold 'unspecified weight)))
+ (fontaine--set-face-attributes 'bold 'unspecified weight frame)))
-(defun fontaine--set-italic ()
- "Set `italic' attributes interactively."
+(defun fontaine--set-italic (&optional frame)
+ "Set `italic' attributes, optionally for FRAME."
(let ((slant (intern (completing-read "Select slant for `italic': "
fontaine--font-slants nil t))))
- (fontaine--set-italic-slant 'unspecified slant)))
+ (fontaine--set-italic-slant 'unspecified slant frame)))
;;;###autoload
-(defun fontaine-set-face-font (face)
+(defun fontaine-set-face-font (face &optional frame)
"Set font and/or other attributes of FACE.
When called interactively, prompt for FACE and then continue
@@ -571,20 +608,30 @@ and slant but inherits from those faces instead (e.g. the
When called from Lisp (albeit discouraged), if FACE is not part
of `fontaine--font-faces', fall back to interactively calling
-`fontaine-set-preset'."
+`fontaine-set-preset'.
+
+Unless optional FRAME argument is supplied, apply the change to
+all frames. If FRAME satisfies `framep', then make the changes
+affect only it. If FRAME is non-nil, interpret it as the current
+frame and apply the effects to it.
+
+When called interactively with a universal prefix
+argument (\\[universal-argument]), FRAME is interpreted as
+non-nil."
(declare (interactive-only t))
(interactive
(list
(intern
(completing-read "Which face to change? "
fontaine--font-faces nil t nil
- 'fontaine--face-history))))
+ 'fontaine--face-history))
+ current-prefix-arg))
(pcase face
- ('bold (fontaine--set-bold))
- ('default (fontaine--set-default))
- ('fixed-pitch (fontaine--set-fixed-pitch))
- ('italic (fontaine--set-italic))
- ('variable-pitch (fontaine--set-variable-pitch))
+ ('bold (fontaine--set-bold frame))
+ ('default (fontaine--set-default frame))
+ ('fixed-pitch (fontaine--set-fixed-pitch frame))
+ ('italic (fontaine--set-italic frame))
+ ('variable-pitch (fontaine--set-variable-pitch frame))
(_ (call-interactively #'fontaine-set-preset))))
;;;; Store and restore preset
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [elpa] externals/fontaine 752a0af5df: Accept optional FRAME for font changes,
ELPA Syncer <=