Commit fdafd487 authored by Matthias Dahl's avatar Matthias Dahl Committed by Eli Zaretskii

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.
parent eb7a03cc
...@@ -3,6 +3,10 @@ ...@@ -3,6 +3,10 @@
* faces.el (face-spec-recalc): Call make-face-x-resource-internal * faces.el (face-spec-recalc): Call make-face-x-resource-internal
only when inhibit-x-resources is nil, and do that earlier in the only when inhibit-x-resources is nil, and do that earlier in the
function. Doc fix. (Bug#16694) 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> 2014-04-04 Tassilo Horn <tsdh@gnu.org>
......
...@@ -1512,13 +1512,15 @@ If FRAME is nil, the current FRAME is used." ...@@ -1512,13 +1512,15 @@ If FRAME is nil, the current FRAME is used."
match)) match))
(defun face-spec-choose (spec &optional frame) (defun face-spec-choose (spec &optional frame no-match-retval)
"Choose the proper attributes for FRAME, out of SPEC. "Return the proper attributes for FRAME, out of SPEC.
If SPEC is nil, return nil."
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 (unless frame
(setq frame (selected-frame))) (setq frame (selected-frame)))
(let ((tail spec) (let ((tail spec)
result defaults) result defaults match-found)
(while tail (while tail
(let* ((entry (pop tail)) (let* ((entry (pop tail))
(display (car entry)) (display (car entry))
...@@ -1538,9 +1540,18 @@ If SPEC is nil, return nil." ...@@ -1538,9 +1540,18 @@ If SPEC is nil, return nil."
(setq defaults thisval) (setq defaults thisval)
;; Otherwise, if it matches, use it. ;; Otherwise, if it matches, use it.
(when (face-spec-set-match-display display frame) (when (face-spec-set-match-display display frame)
(setq result thisval) (setq result thisval
(setq tail nil))))) tail nil
(if defaults (append result defaults) result))) 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) (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: ...@@ -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 ;; If FACE is customized or themed, set the custom spec from
;; `theme-face' records. ;; `theme-face' records.
(let ((theme-faces (get face 'theme-face)) (let ((theme-faces (get face 'theme-face))
(no-match-found 0)
spec theme-face-applied) spec theme-face-applied)
(if theme-faces (if theme-faces
(dolist (elt (reverse theme-faces)) (dolist (elt (reverse theme-faces))
(setq spec (face-spec-choose (cadr elt) frame)) (setq spec (face-spec-choose (cadr elt) frame no-match-found))
(when spec (unless (eq spec no-match-found)
(face-spec-set-2 face frame spec) (face-spec-set-2 face frame spec)
(setq theme-face-applied t)))) (setq theme-face-applied t))))
;; If there was a spec applicable to FRAME, that overrides the ;; If there was a spec applicable to FRAME, that overrides the
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment