Prevent themes from obliterating faces on low-color terminals.

* lisp/faces.el (face-spec-recalc): If the theme specs are not
applicable to a frame, fall back on the defface spec.
This commit is contained in:
Chong Yidong 2013-12-22 21:40:44 +08:00
parent 647d367f3b
commit dca38cf960
2 changed files with 23 additions and 9 deletions

View file

@ -1,3 +1,9 @@
2013-12-22 Chong Yidong <cyd@gnu.org>
* faces.el (face-spec-recalc): If the theme specs are not
applicable to a frame, fall back on the defface spec. This
prevents themes from obliterating faces on low-color terminals.
2013-12-22 Dmitry Gutov <dgutov@yandex.ru>
* progmodes/ruby-mode.el (ruby-smie--implicit-semi-p): Return t

View file

@ -1625,20 +1625,28 @@ then the override spec."
(setq face (get face 'face-alias)))
(face-spec-reset-face face frame)
;; If FACE is customized or themed, set the custom spec from
;; `theme-face' records, which completely replace the defface spec
;; rather than inheriting from it.
(let ((theme-faces (get face 'theme-face)))
;; `theme-face' records.
(let ((theme-faces (get face 'theme-face))
spec theme-face-applied)
(if theme-faces
(dolist (spec (reverse theme-faces))
(face-spec-set-2 face frame (cadr spec)))
(face-spec-set-2 face frame (face-default-spec face))))
(face-spec-set-2 face frame (get face 'face-override-spec))
(dolist (elt (reverse theme-faces))
(setq spec (face-spec-choose (cadr elt) frame))
(when spec
(face-spec-set-2 face frame spec)
(setq theme-face-applied t))))
;; If there was a spec applicable to FRAME, that overrides the
;; defface spec entirely (rather than inheriting from it). If
;; there was no spec applicable to FRAME, apply the defface spec.
(unless theme-face-applied
(setq spec (face-spec-choose (face-default-spec face) frame))
(face-spec-set-2 face frame spec))
(setq spec (face-spec-choose (get face 'face-override-spec) frame))
(face-spec-set-2 face frame spec))
(make-face-x-resource-internal face frame))
(defun face-spec-set-2 (face frame spec)
"Set the face attributes of FACE on FRAME according to SPEC."
(let* ((spec (face-spec-choose spec frame))
attrs)
(let (attrs)
(while spec
(when (assq (car spec) face-x-resources)
(push (car spec) attrs)