changeset 48950:8ccf8576bbc1

(custom-set-faces): Call custom-theme-set-faces. (custom-theme-set-faces): New function. (custom-theme-face-value): New function. (custom-theme-reset-internal-face): New function. (custom-theme-reset-faces): New function. (custom-reset-faces): New function.
author Richard M. Stallman <rms@gnu.org>
date Mon, 23 Dec 2002 18:40:38 +0000
parents f216c93c4189
children d77bc55dd27b
files lisp/cus-face.el
diffstat 1 files changed, 110 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/cus-face.el	Mon Dec 23 18:40:24 2002 +0000
+++ b/lisp/cus-face.el	Mon Dec 23 18:40:38 2002 +0000
@@ -1,10 +1,9 @@
 ;;; cus-face.el --- customization support for faces
 ;;
-;; Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, faces
-;; Version: Emacs
 
 ;; This file is part of GNU Emacs.
 
@@ -67,7 +66,7 @@
   '((:family
      (string :tag "Font Family"
 	     :help-echo "Font family or fontset alias name."))
-    
+
     (:width
      (choice :tag "Width"
 	     :help-echo "Font width."
@@ -249,7 +248,6 @@
 being customized, and should return a value suitable for setting the
 given face attribute.")
 
-
 (defun custom-face-attributes-get (face frame)
   "For FACE on FRAME, return an alternating list describing its attributes.
 The list has the form (KEYWORD VALUE KEYWORD VALUE...).
@@ -272,36 +270,125 @@
 ;;;###autoload
 (defun custom-set-faces (&rest args)
   "Initialize faces according to user preferences.
+This associates the settings with the `user' theme.
+The arguments should be a list where each entry has the form:
+
+  (FACE SPEC [NOW [COMMENT]])
+
+SPEC is stored as the saved value for FACE, as well as the value for the
+`user' theme.  The `user' theme is one of the default themes known to Emacs.
+See `custom-known-themes' for more information on the known themes.
+See `custom-theme-set-faces' for more information on the interplay
+between themes and faces.
+See `defface' for the format of SPEC.
+
+If NOW is present and non-nil, FACE is created now, according to SPEC.
+COMMENT is a string comment about FACE."
+  (apply 'custom-theme-set-faces 'user args))
+
+(defun custom-theme-set-faces (theme &rest args)
+  "Initialize faces for theme THEME.
 The arguments should be a list where each entry has the form:
 
   (FACE SPEC [NOW [COMMENT]])
 
-SPEC is stored as the saved value for FACE.
+SPEC is stored as the saved value for FACE, as well as the value for the
+`user' theme.  The `user' theme is one of the default themes known to Emacs.
+See `custom-known-themes' for more information on the known themes.
+See `custom-theme-set-faces' for more information on the interplay
+between themes and faces.
+See `defface' for the format of SPEC.
+
 If NOW is present and non-nil, FACE is created now, according to SPEC.
 COMMENT is a string comment about FACE.
 
-See `defface' for the format of SPEC."
-  (while args
-    (let ((entry (car args)))
-      (if (listp entry)
-	  (let ((face (nth 0 entry))
-		(spec (nth 1 entry))
-		(now (nth 2 entry))
-		(comment (nth 3 entry)))
-	    (put face 'saved-face spec)
-	    (put face 'saved-face-comment comment)
-	    (when now
-	      (put face 'force-face t))
-	    (when (or now (facep face))
-	      (put face 'face-comment comment)
-	      (make-empty-face face)
-	      (face-spec-set face spec))
+Several properties of THEME and FACE are used in the process:
+
+If THEME property `theme-immediate' is non-nil, this is equivalent of
+providing the NOW argument to all faces in the argument list: FACE is
+created now.  The only difference is FACE property `force-face': if NOW
+is non-nil, FACE property `force-face' is set to the symbol `rogue', else
+if THEME property `theme-immediate' is non-nil, FACE property `force-face'
+is set to the symbol `immediate'.
+
+SPEC itself is saved in FACE property `saved-face' and it is stored in
+FACE's list property `theme-face' \(using `custom-push-theme')."
+  (custom-check-theme theme)
+  (let ((immediate (get theme 'theme-immediate)))
+    (while args
+      (let ((entry (car args)))
+	(if (listp entry)
+	    (let ((face (nth 0 entry))
+		  (spec (nth 1 entry))
+		  (now (nth 2 entry))
+		  (comment (nth 3 entry)))
+	      (put face 'saved-face spec)
+	      (put face 'saved-face-comment comment)
+	      (custom-push-theme 'theme-face face theme 'set spec)
+	      (when (or now immediate)
+		(put face 'force-face (if now 'rogue 'immediate)))
+	      (when (or now immediate (facep face))
+		(unless (facep face)
+		  (make-empty-face face))
+		(put face 'face-comment comment)
+		(face-spec-set face spec))
 	    (setq args (cdr args)))
 	;; Old format, a plist of FACE SPEC pairs.
 	(let ((face (nth 0 args))
 	      (spec (nth 1 args)))
-	  (put face 'saved-face spec))
-	(setq args (cdr (cdr args)))))))
+	  (put face 'saved-face spec)
+	  (custom-push-theme 'theme-face face theme 'set spec))
+	(setq args (cdr (cdr args))))))))
+
+;;;###autoload
+(defun custom-theme-face-value (face theme)
+  "Return spec of FACE in THEME if THEME modifies FACE.
+Value is nil otherwise.  The association between theme and spec for FACE
+is stored in FACE's property `theme-face'.  The appropriate face
+is retrieved using `custom-theme-value'."
+  ;; Returns car because the value is stored inside a one element list
+  (car-safe (custom-theme-value theme (get face 'theme-face))))
+
+(defun custom-theme-reset-internal-face (face to-theme)
+  "Reset FACE to the value defined by TO-THEME.
+If FACE is not defined in TO-THEME, reset FACE to the standard
+value.  See `custom-theme-face-value'.  The standard value is
+stored in SYMBOL's property `face-defface-spec' by `defface'."
+  (let ((spec (custom-theme-face-value face to-theme))
+	was-in-theme)
+    (setq was-in-theme spec)
+    (setq spec (or spec (get face 'face-defface-spec)))
+    (when spec
+      (put face 'save-face was-in-theme)
+      (when (or (get face 'force-face) (facep face))
+	      (unless (facep face)
+		(make-empty-face face))
+	      (face-spec-set face spec)))
+    spec))
+
+;;;###autoload
+(defun custom-theme-reset-faces (theme &rest args)
+  "Reset the value of the face to values previously defined.
+Associate this setting with THEME.
+
+ARGS is a list of lists of the form
+
+    (FACE TO-THEME)
+
+This means reset FACE to its value in TO-THEME."
+  (custom-check-theme theme)
+  (mapcar '(lambda (arg)
+	     (apply 'custom-theme-reset-internal-face arg)
+	     (custom-push-theme 'theme-face (car arg) theme 'reset (cadr arg)))
+	  args))
+
+;;;###autoload
+(defun custom-reset-faces (&rest args)
+  "Reset the value of the face to values previously saved.
+This is the setting assosiated the `user' theme.
+
+ARGS is defined as for `custom-theme-reset-faces'"
+  (apply 'custom-theme-reset-faces 'user args))
 
 ;;; The End.