]> code.delx.au - gnu-emacs/blobdiff - lisp/cus-face.el
* net/tramp-sh.el (tramp-set-file-uid-gid): UID and GID must be
[gnu-emacs] / lisp / cus-face.el
index 0a48c0fbd685bf9b81f6863d831fd834f270fdbb..772a57e54fd8cf26bb54d38ac6408bad76af9279 100644 (file)
@@ -1,6 +1,6 @@
 ;;; cus-face.el --- customization support for faces
 ;;
-;; Copyright (C) 1996-1997, 1999-2011 Free Software Foundation, Inc.
+;; Copyright (C) 1996-1997, 1999-2013 Free Software Foundation, Inc.
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, faces
@@ -34,8 +34,8 @@
 (defun custom-declare-face (face spec doc &rest args)
   "Like `defface', but FACE is evaluated as a normal argument."
   (unless (get face 'face-defface-spec)
-    (when (fboundp 'facep)
-      (unless (facep face)
+    (let ((facep (facep face)))
+      (unless facep
        ;; If the user has already created the face, respect that.
        (let ((value (or (get face 'saved-face) spec))
              (have-window-system (memq initial-window-system '(x w32))))
              (setq have-window-system t)))
          ;; When making a face after frames already exist
          (if have-window-system
-             (make-face-x-resource-internal face)))))
-    ;; Don't record SPEC until we see it causes no errors.
-    (put face 'face-defface-spec (purecopy spec))
-    (push (cons 'defface face) current-load-list)
-    (when (and doc (null (face-documentation face)))
-      (set-face-documentation face (purecopy doc)))
-    (custom-handle-all-keywords face args 'custom-face)
-    (run-hooks 'custom-define-hook))
+             (make-face-x-resource-internal face))))
+      ;; Don't record SPEC until we see it causes no errors.
+      (put face 'face-defface-spec (purecopy spec))
+      (push (cons 'defface face) current-load-list)
+      (when (and doc (null (face-documentation face)))
+       (set-face-documentation face (purecopy doc)))
+      (custom-handle-all-keywords face args 'custom-face)
+      (run-hooks 'custom-define-hook)
+      ;; If the face had existing settings, recalculate it.  For
+      ;; example, the user might load a theme with a face setting, and
+      ;; later load a library defining that face.
+      (if facep
+         (custom-theme-recalc-face face))))
   face)
 
 ;;; Face attributes.
      (choice :tag "Underline"
             :help-echo "Control text underlining."
             (const :tag "Off" nil)
-            (const :tag "On" t)
-            (color :tag "Colored")))
+            (list :tag "On"
+                  :value (:color foreground-color :style line)
+                  (const :format "" :value :color)
+                  (choice :tag "Color"
+                          (const :tag "Foreground Color" foreground-color)
+                          color)
+                  (const :format "" :value :style)
+                  (choice :tag "Style"
+                          (const :tag "Line" line)
+                          (const :tag "Wave" wave))))
+     ;; filter to make value suitable for customize
+     (lambda (real-value)
+       (and real-value
+           (let ((color
+                  (or (and (consp real-value) (plist-get real-value :color))
+                      (and (stringp real-value) real-value)
+                      'foreground-color))
+                 (style
+                  (or (and (consp real-value) (plist-get real-value :style))
+                      'line)))
+             (list :color color :style style))))
+     ;; filter to make customized-value suitable for storing
+     (lambda (cus-value)
+       (and cus-value
+           (let ((color (plist-get cus-value :color))
+                 (style (plist-get cus-value :style)))
+             (cond ((eq style 'line)
+                    ;; Use simple value for default style
+                    (if (eq color 'foreground-color) t color))
+                   (t
+                    `(:color ,color :style ,style)))))))
 
     (:overline
      (choice :tag "Overline"
@@ -348,7 +382,7 @@ FACE's list property `theme-face' \(using `custom-push-theme')."
              (put face 'face-override-spec nil)
              (face-spec-set face spec t))))))))
 
-;; XEmacs compability function.  In XEmacs, when you reset a Custom
+;; XEmacs compatibility function.  In XEmacs, when you reset a Custom
 ;; Theme, you have to specify the theme to reset it to.  We just apply
 ;; the next theme.
 (defun custom-theme-reset-faces (theme &rest args)