1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-27 07:37:33 +00:00

Fix bug #16378 with mishandling of empty faces.

lisp/faces.el (face-spec-choose): Accept additional optional argument,
 whose value is returned if no matching attributes are found.
 (face-spec-recalc): Use the new optional argument when calling
 face-spec-choose.
This commit is contained in:
Matthias Dahl 2014-04-05 10:25:52 +03:00 committed by Eli Zaretskii
parent eb7a03cc76
commit fdafd487a9
2 changed files with 25 additions and 9 deletions

View File

@ -3,6 +3,10 @@
* faces.el (face-spec-recalc): Call make-face-x-resource-internal
only when inhibit-x-resources is nil, and do that earlier in the
function. Doc fix. (Bug#16694)
(face-spec-choose): Accept additional optional argument, whose
value is returned if no matching attributes are found.
(face-spec-recalc): Use the new optional argument when calling
face-spec-choose. (Bug#16378)
2014-04-04 Tassilo Horn <tsdh@gnu.org>

View File

@ -1512,13 +1512,15 @@ If FRAME is nil, the current FRAME is used."
match))
(defun face-spec-choose (spec &optional frame)
"Choose the proper attributes for FRAME, out of SPEC.
If SPEC is nil, return nil."
(defun face-spec-choose (spec &optional frame no-match-retval)
"Return the proper attributes for FRAME, out of SPEC.
If no match is found or SPEC is nil, return nil, unless NO-MATCH-RETVAL
is given, in which case return its value instead."
(unless frame
(setq frame (selected-frame)))
(let ((tail spec)
result defaults)
result defaults match-found)
(while tail
(let* ((entry (pop tail))
(display (car entry))
@ -1538,9 +1540,18 @@ If SPEC is nil, return nil."
(setq defaults thisval)
;; Otherwise, if it matches, use it.
(when (face-spec-set-match-display display frame)
(setq result thisval)
(setq tail nil)))))
(if defaults (append result defaults) result)))
(setq result thisval
tail nil
match-found t)))))
;; If defaults have been found, it's safe to just append those to the result
;; list (which at this point will be either nil or contain actual specs) and
;; return it to the caller. Since there will most definitely be something to
;; return in this case, there's no need to know/check if a match was found.
(if defaults
(append result defaults)
(if match-found
result
no-match-retval))))
(defun face-spec-reset-face (face &optional frame)
@ -1635,11 +1646,12 @@ After the reset, the specs are applied from the following sources in this order:
;; If FACE is customized or themed, set the custom spec from
;; `theme-face' records.
(let ((theme-faces (get face 'theme-face))
(no-match-found 0)
spec theme-face-applied)
(if theme-faces
(dolist (elt (reverse theme-faces))
(setq spec (face-spec-choose (cadr elt) frame))
(when spec
(setq spec (face-spec-choose (cadr elt) frame no-match-found))
(unless (eq spec no-match-found)
(face-spec-set-2 face frame spec)
(setq theme-face-applied t))))
;; If there was a spec applicable to FRAME, that overrides the