From: Chong Yidong Date: Sun, 22 Dec 2013 13:40:44 +0000 (+0800) Subject: Prevent themes from obliterating faces on low-color terminals. X-Git-Url: https://git.hcoop.net/bpt/emacs.git/commitdiff_plain/dca38cf96056f20a1b03cf24ff93644b0e44ea4e 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. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 51bfe7c1fb..8034a74809 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2013-12-22 Chong Yidong + + * 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 * progmodes/ruby-mode.el (ruby-smie--implicit-semi-p): Return t diff --git a/lisp/faces.el b/lisp/faces.el index 1328366578..d60d1d287e 100644 --- a/lisp/faces.el +++ b/lisp/faces.el @@ -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)