summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiles Bader <miles@gnu.org>2004-06-04 02:50:50 +0000
committerMiles Bader <miles@gnu.org>2004-06-04 02:50:50 +0000
commit1542dd4eb75713b2cd918f83a7557e9dd085fff3 (patch)
tree2598633685a75eda77176e021cd03bafeb64d3d8
parent7d06a8bc80162c2d45380755c79062119c67916f (diff)
downloademacs-1542dd4eb75713b2cd918f83a7557e9dd085fff3.tar.gz
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-369
Rewrite face-differs-from-default-p
-rw-r--r--etc/NEWS4
-rw-r--r--lisp/ChangeLog6
-rw-r--r--lisp/faces.el54
-rw-r--r--lispref/display.texi6
4 files changed, 47 insertions, 23 deletions
diff --git a/etc/NEWS b/etc/NEWS
index 07f0f09739a..cc5eff864ad 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -3032,6 +3032,10 @@ A new predicate `supports' has also been added to the `defface' face
specification language, which can be used to do this test for faces
defined with defface.
+** The function face-differs-from-default-p now truly checks whether the
+given face displays differently from the default face or not (previously
+it did only a very cursory check).
+
+++
** face-attribute, face-foreground, face-background, and face-stipple now
accept a new optional argument, INHERIT, which controls how face
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index c4f861626fd..70c3d9d8942 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,5 +1,11 @@
2004-06-04 Miles Bader <miles@gnu.org>
+ * faces.el (face-differs-from-default-p): Use a different
+ implementation, so we can really check whether FACE displays
+ differently or not.
+
+2004-06-04 Miles Bader <miles@gnu.org>
+
* faces.el (display-supports-face-attributes-p): Implement a
`different from default' check for non-tty displays.
diff --git a/lisp/faces.el b/lisp/faces.el
index 03e2ee699e7..cdc56075711 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -240,27 +240,43 @@ If FRAME is omitted or nil, use the selected frame."
(defun face-differs-from-default-p (face &optional frame)
- "Non-nil if FACE displays differently from the default face.
+ "Return non-nil if FACE displays differently from the default face.
If the optional argument FRAME is given, report on face FACE in that frame.
If FRAME is t, report on the defaults for face FACE (for new frames).
-If FRAME is omitted or nil, use the selected frame.
-A face is considered to be ``the same'' as the default face if it is
-actually specified in the same way (equal attributes) or if it is
-fully-unspecified, and thus inherits the attributes of any face it
-is displayed on top of."
- (cond ((eq frame t) (setq frame nil))
- ((null frame) (setq frame (selected-frame))))
- (let* ((v1 (internal-lisp-face-p face frame))
- (n (if v1 (length v1) 0))
- (v2 (internal-lisp-face-p 'default frame))
- (i 1))
- (unless v1
- (error "Not a face: %S" face))
- (while (and (< i n)
- (or (eq 'unspecified (aref v1 i))
- (equal (aref v1 i) (aref v2 i))))
- (setq i (1+ i)))
- (< i n)))
+If FRAME is omitted or nil, use the selected frame."
+ (if (not (equal (face-font face frame) (face-font 'default frame)))
+ ;; The font is different from the default face's font, so clearly it
+ ;; differs. This only really works on window-systems; on ttys, the
+ ;; "font" is a constant, with attributes layered on top of it.
+ :font
+ ;; General face attribute check. On graphical displays
+ ;; `display-supports-face-attributes-p' just checks whether each
+ ;; attribute is different that the default face, so we just check to
+ ;; make sure each attribute of the merged face is not `unspecified';
+ ;; we already checked the font above, so font-related attributes are
+ ;; omitted for that reason. On a tty,
+ ;; display-supports-face-attributes-p actually does do further
+ ;; checks, and correctly deals with the display's capabilities, so
+ ;; we use it to check all attributes.
+ (let ((attrs
+ (if (memq (framep (or frame (selected-frame))) '(x w32 mac))
+ ;; Omit font-related attributes on a window-system
+ '(:foreground :foreground :background :underline :overline
+ :strike-through :box :inverse-video :stipple)
+ ;; On a tty, check all attributes
+ '(:family :width :height :weight :slant :foreground
+ :foreground :background :underline :overline
+ :strike-through :box :inverse-video :stipple)))
+ (differs nil))
+ (while (and attrs (not differs))
+ (let* ((attr (pop attrs))
+ (attr-val (face-attribute face attr frame t)))
+ (when (and
+ (not (eq attr-val 'unspecified))
+ (display-supports-face-attributes-p (list attr attr-val)
+ frame))
+ (setq differs attr))))
+ differs)))
(defun face-nontrivial-p (face &optional frame)
diff --git a/lispref/display.texi b/lispref/display.texi
index ddf8cdb4723..addf66dd7a6 100644
--- a/lispref/display.texi
+++ b/lispref/display.texi
@@ -2288,10 +2288,8 @@ same attributes for display.
@end defun
@defun face-differs-from-default-p face &optional frame
-This returns @code{t} if the face @var{face} displays differently from
-the default face. A face is considered to be ``the same'' as the
-default face if each attribute is either the same as that of the default
-face, or unspecified (meaning to inherit from the default).
+This returns non-@code{nil} if the face @var{face} displays
+differently from the default face.
@end defun
@node Auto Faces