Prevent themes from obliterating faces on low-color terminals.
authorChong Yidong <cyd@gnu.org>
Sun, 22 Dec 2013 13:40:44 +0000 (21:40 +0800)
committerChong Yidong <cyd@gnu.org>
Sun, 22 Dec 2013 13:40:44 +0000 (21:40 +0800)
* lisp/faces.el (face-spec-recalc): If the theme specs are not
applicable to a frame, fall back on the defface spec.

lisp/ChangeLog
lisp/faces.el

index 51bfe7c..8034a74 100644 (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
index 1328366..d60d1d2 100644 (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)