Mercurial > hg > xemacs-beta
comparison lisp/cus-face.el @ 209:41ff10fd062f r20-4b3
Import from CVS: tag r20-4b3
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:04:58 +0200 |
parents | |
children | 78f53ef88e17 |
comparison
equal
deleted
inserted
replaced
208:f427b8ec4379 | 209:41ff10fd062f |
---|---|
1 ;;; cus-face.el -- Support for Custom faces. | |
2 ;; | |
3 ;; Copyright (C) 1996, 1997 Free Software Foundation, Inc. | |
4 ;; | |
5 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> | |
6 ;; Maintainer: Hrvoje Niksic <hniksic@srce.hr> | |
7 ;; Keywords: help, faces | |
8 ;; Version: 1.9960-x | |
9 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ | |
10 | |
11 ;;; Commentary: | |
12 ;; | |
13 ;; See `custom.el'. | |
14 | |
15 ;; This file should probably be dissolved, and code moved to faces.el, | |
16 ;; like Stallman did. | |
17 | |
18 ;;; Code: | |
19 | |
20 (require 'custom) | |
21 | |
22 ;; To elude the warnings for font functions. | |
23 (eval-when-compile | |
24 (require 'font)) | |
25 | |
26 ;;; Declaring a face. | |
27 | |
28 ;;;###autoload | |
29 (defun custom-declare-face (face spec doc &rest args) | |
30 "Like `defface', but FACE is evaluated as a normal argument." | |
31 ;; (when (fboundp 'load-gc) | |
32 ;; (error "Attempt to declare a face during dump")) | |
33 (unless (get face 'face-defface-spec) | |
34 (put face 'face-defface-spec spec) | |
35 (unless (find-face face) | |
36 ;; If the user has already created the face, respect that. | |
37 (let ((value (or (get face 'saved-face) spec)) | |
38 (frames (relevant-custom-frames)) | |
39 frame) | |
40 ;; Create global face. | |
41 (make-empty-face face) | |
42 (face-display-set face value) | |
43 ;; Create frame local faces | |
44 (while frames | |
45 (setq frame (car frames) | |
46 frames (cdr frames)) | |
47 (face-display-set face value frame)) | |
48 (init-face-from-resources face))) | |
49 (when (and doc (null (face-doc-string face))) | |
50 (set-face-doc-string face doc)) | |
51 (custom-handle-all-keywords face args 'custom-face) | |
52 (run-hooks 'custom-define-hook)) | |
53 face) | |
54 | |
55 ;;; Font Attributes. | |
56 | |
57 (defconst custom-face-attributes | |
58 '((:bold (boolean :tag "Bold" | |
59 :help-echo "Control whether a bold font should be used.") | |
60 custom-set-face-bold custom-face-bold) | |
61 (:italic (boolean :tag "Italic" | |
62 :help-echo "\ | |
63 Control whether an italic font should be used.") | |
64 custom-set-face-italic custom-face-italic) | |
65 (:underline (boolean :tag "Underline" | |
66 :help-echo "\ | |
67 Control whether the text should be underlined.") | |
68 set-face-underline-p face-underline-p) | |
69 (:foreground (color :tag "Foreground" | |
70 :value "" | |
71 :help-echo "Set foreground color.") | |
72 set-face-foreground face-foreground-name) | |
73 (:background (color :tag "Background" | |
74 :value "" | |
75 :help-echo "Set background color.") | |
76 set-face-background face-background-name) | |
77 ;; #### Should make it work on X | |
78 (:inverse-video (boolean :tag "Inverse" | |
79 :help-echo "\ | |
80 Control whether the text should be inverted. Works only on TTY-s") | |
81 set-face-reverse-p face-reverse-p) | |
82 (:stipple (editable-field :format "Stipple: %v" | |
83 :help-echo "Name of background bitmap file.") | |
84 set-face-background-pixmap custom-face-stipple) | |
85 (:family (editable-field :format "Font Family: %v" | |
86 :help-echo "\ | |
87 Name of font family to use (e.g. times).") | |
88 custom-set-face-font-family custom-face-font-family) | |
89 (:size (editable-field :format "Size: %v" | |
90 :help-echo "\ | |
91 Text size (e.g. 9pt or 2mm).") | |
92 custom-set-face-font-size custom-face-font-size) | |
93 (:strikethru (toggle :format "%[Strikethru%]: %v\n" | |
94 :help-echo "\ | |
95 Control whether the text should be strikethru.") | |
96 set-face-strikethru-p face-strikethru-p)) | |
97 "Alist of face attributes. | |
98 | |
99 The elements are of the form (KEY TYPE SET GET) where KEY is a symbol | |
100 identifying the attribute, TYPE is a widget type for editing the | |
101 attibute, SET is a function for setting the attribute value, and GET is a function for getiing the attribute value. | |
102 | |
103 The SET function should take three arguments, the face to modify, the | |
104 value of the attribute, and optionally the frame where the face should | |
105 be changed. | |
106 | |
107 The GET function should take two arguments, the face to examine, and | |
108 optonally the frame where the face should be examined.") | |
109 | |
110 (defun face-custom-attributes-set (face frame &rest atts) | |
111 "For FACE on FRAME set the attributes [KEYWORD VALUE].... | |
112 Each keyword should be listed in `custom-face-attributes'. | |
113 | |
114 If FRAME is nil, set the default face." | |
115 (while atts | |
116 (let* ((name (nth 0 atts)) | |
117 (value (nth 1 atts)) | |
118 (fun (nth 2 (assq name custom-face-attributes)))) | |
119 (setq atts (cdr (cdr atts))) | |
120 (condition-case nil | |
121 (funcall fun face value frame) | |
122 (error nil))))) | |
123 | |
124 (defun face-custom-attributes-get (face frame) | |
125 "For FACE on FRAME get the attributes [KEYWORD VALUE].... | |
126 Each keyword should be listed in `custom-face-attributes'. | |
127 | |
128 If FRAME is nil, use the default face." | |
129 (condition-case nil | |
130 ;; Attempt to get `font.el' from w3. | |
131 (require 'font) | |
132 (error nil)) | |
133 (let ((atts custom-face-attributes) | |
134 att result get) | |
135 (while atts | |
136 (setq att (car atts) | |
137 atts (cdr atts) | |
138 get (nth 3 att)) | |
139 (condition-case nil | |
140 ;; This may fail if w3 doesn't exists. | |
141 (when get | |
142 (let ((answer (funcall get face frame))) | |
143 (unless (equal answer (funcall get 'default frame)) | |
144 (when (widget-apply (nth 1 att) :match answer) | |
145 (setq result (cons (nth 0 att) (cons answer result))))))) | |
146 (error nil))) | |
147 result)) | |
148 | |
149 (defun custom-set-face-bold (face value &optional frame) | |
150 "Set the bold property of FACE to VALUE." | |
151 (if value | |
152 (make-face-bold face frame) | |
153 (make-face-unbold face frame))) | |
154 | |
155 ;; Really, we should get rid of these font.el dependencies... They | |
156 ;; are still presenting a problem with dumping the faces (font.el is | |
157 ;; too bloated for us to dump). I am thinking about hacking up | |
158 ;; font-like functionality myself for the sake of this file. It will | |
159 ;; probably be to-the-point and more efficient. | |
160 | |
161 (defun custom-face-bold (face &rest args) | |
162 "Return non-nil if the font of FACE is bold." | |
163 (let* ((font (apply 'face-font-name face args)) | |
164 ;; Gag | |
165 (fontobj (font-create-object font))) | |
166 (font-bold-p fontobj))) | |
167 | |
168 (defun custom-set-face-italic (face value &optional frame) | |
169 "Set the italic property of FACE to VALUE." | |
170 (if value | |
171 (make-face-italic face frame) | |
172 (make-face-unitalic face frame))) | |
173 | |
174 (defun custom-face-italic (face &rest args) | |
175 "Return non-nil if the font of FACE is italic." | |
176 (let* ((font (apply 'face-font-name face args)) | |
177 ;; Gag | |
178 (fontobj (font-create-object font))) | |
179 (font-italic-p fontobj))) | |
180 | |
181 (defun custom-face-stipple (face &rest args) | |
182 "Return the name of the stipple file used for FACE." | |
183 (let ((image (apply 'specifier-instance | |
184 (face-background-pixmap face) args))) | |
185 (and image | |
186 (image-instance-file-name image)))) | |
187 | |
188 (defun custom-set-face-font-size (face size &rest args) | |
189 "Set the font of FACE to SIZE" | |
190 (let* ((font (apply 'face-font-name face args)) | |
191 ;; Gag | |
192 (fontobj (font-create-object font))) | |
193 (set-font-size fontobj size) | |
194 (apply 'font-set-face-font face fontobj args))) | |
195 | |
196 (defun custom-face-font-size (face &rest args) | |
197 "Return the size of the font of FACE as a string." | |
198 (let* ((font (apply 'face-font-name face args)) | |
199 ;; Gag | |
200 (fontobj (font-create-object font))) | |
201 (format "%s" (font-size fontobj)))) | |
202 | |
203 (defun custom-set-face-font-family (face family &rest args) | |
204 "Set the font of FACE to FAMILY." | |
205 (let* ((font (apply 'face-font-name face args)) | |
206 ;; Gag | |
207 (fontobj (font-create-object font))) | |
208 (set-font-family fontobj family) | |
209 (apply 'font-set-face-font face fontobj args))) | |
210 | |
211 (defun custom-face-font-family (face &rest args) | |
212 "Return the name of the font family of FACE." | |
213 (let* ((font (apply 'face-font-name face args)) | |
214 ;; Gag | |
215 (fontobj (font-create-object font))) | |
216 (font-family fontobj))) | |
217 | |
218 ;;; Initializing. | |
219 | |
220 ;;;###autoload | |
221 (defun custom-set-faces (&rest args) | |
222 "Initialize faces according to user preferences. | |
223 The arguments should be a list where each entry has the form: | |
224 | |
225 (FACE SPEC [NOW]) | |
226 | |
227 SPEC will be stored as the saved value for FACE. If NOW is present | |
228 and non-nil, FACE will also be created according to SPEC. | |
229 | |
230 See `defface' for the format of SPEC." | |
231 (while args | |
232 (let ((entry (car args))) | |
233 (if (listp entry) | |
234 (let ((face (nth 0 entry)) | |
235 (spec (nth 1 entry)) | |
236 (now (nth 2 entry))) | |
237 (put face 'saved-face spec) | |
238 (when now | |
239 (put face 'force-face t)) | |
240 (when (or now (find-face face)) | |
241 (unless (find-face face) | |
242 (make-empty-face face)) | |
243 (face-spec-set face spec)) | |
244 (setq args (cdr args))) | |
245 ;; Old format, a plist of FACE SPEC pairs. | |
246 (let ((face (nth 0 args)) | |
247 (spec (nth 1 args))) | |
248 (put face 'saved-face spec)) | |
249 (setq args (cdr (cdr args))))))) | |
250 | |
251 ;;; The End. | |
252 | |
253 (provide 'cus-face) | |
254 | |
255 ;; cus-face.el ends here |