diff src/xfaces.c @ 83296:effe22690419

Merged from miles@gnu.org--gnu-2005 (patch 281-285) Patches applied: * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-281 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-282 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-283 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-284 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-285 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-336
author Karoly Lorentey <lorentey@elte.hu>
date Mon, 02 May 2005 14:38:00 +0000
parents ad07ff6e4555 f658c441541a
children 6aee1e9b0bd7
line wrap: on
line diff
--- a/src/xfaces.c	Tue Apr 26 12:17:42 2005 +0000
+++ b/src/xfaces.c	Mon May 02 14:38:00 2005 +0000
@@ -336,6 +336,8 @@
 
 Lisp_Object Qface_alias;
 
+extern Lisp_Object Qcircular_list;
+
 /* Default stipple pattern used on monochrome displays.  This stipple
    pattern is used on monochrome displays instead of shades of gray
    for a face background color.  See `set-face-stipple' for possible
@@ -471,7 +473,7 @@
 
 static void map_tty_color P_ ((struct frame *, struct face *,
 			       enum lface_attribute_index, int *));
-static Lisp_Object resolve_face_name P_ ((Lisp_Object));
+static Lisp_Object resolve_face_name P_ ((Lisp_Object, int));
 static int may_use_scalable_font_p P_ ((const char *));
 static void set_font_frame_param P_ ((Lisp_Object, Lisp_Object));
 static int better_font_p P_ ((int *, struct font_name *, struct font_name *,
@@ -3220,27 +3222,47 @@
 }
 
 /* Resolve face name FACE_NAME.  If FACE_NAME is a string, intern it
-   to make it a symvol.  If FACE_NAME is an alias for another face,
-   return that face's name.  */
+   to make it a symbol.  If FACE_NAME is an alias for another face,
+   return that face's name.
+
+   Return default face in case of errors.  */
 
 static Lisp_Object
-resolve_face_name (face_name)
+resolve_face_name (face_name, signal_p)
      Lisp_Object face_name;
-{
-  Lisp_Object aliased;
-  int alias_loop_max = 10;
+     int signal_p;
+{
+  Lisp_Object orig_face;
+  Lisp_Object tortoise, hare;
 
   if (STRINGP (face_name))
     face_name = intern (SDATA (face_name));
 
-  while (SYMBOLP (face_name))
-    {
-      aliased = Fget (face_name, Qface_alias);
-      if (NILP (aliased))
+  if (NILP (face_name) || !SYMBOLP (face_name))
+    return face_name;
+
+  orig_face = face_name;
+  tortoise = hare = face_name;
+
+  while (1)
+    {
+      face_name = hare;
+      hare = Fget (hare, Qface_alias);
+      if (NILP (hare) || !SYMBOLP (hare))
 	break;
-      if (--alias_loop_max == 0)
+
+      face_name = hare;
+      hare = Fget (hare, Qface_alias);
+      if (NILP (hare) || !SYMBOLP (hare))
 	break;
-      face_name = aliased;
+
+      tortoise = Fget (tortoise, Qface_alias);
+      if (EQ (hare, tortoise))
+	{
+	  if (signal_p)
+	    Fsignal (Qcircular_list, Fcons (orig_face, Qnil));
+	  return Qdefault;
+	}
     }
 
   return face_name;
@@ -3264,7 +3286,7 @@
 {
   Lisp_Object lface;
 
-  face_name = resolve_face_name (face_name);
+  face_name = resolve_face_name (face_name, signal_p);
 
   if (f)
     lface = assq_no_quit (face_name, f->face_alist);
@@ -3999,7 +4021,7 @@
   CHECK_SYMBOL (face);
   CHECK_SYMBOL (attr);
 
-  face = resolve_face_name (face);
+  face = resolve_face_name (face, 1);
 
   /* If FRAME is 0, change face on all frames, and change the
      default for new frames.  */