]> code.delx.au - gnu-emacs/blobdiff - src/xfaces.c
(Vnonascii_translation_table): Name changed from
[gnu-emacs] / src / xfaces.c
index c033911e1de3d190a2bf280168b5627fefa56b51..790cc368552538882a986d43e7538b0edcd15010 100644 (file)
@@ -28,6 +28,11 @@ Boston, MA 02111-1307, USA.  */
 
 #include "charset.h"
 
+#include "frame.h"
+
+/* The number of face-id's in use (same for all frames).  */
+static int next_face_id;
+
 #ifdef HAVE_FACES
 
 #ifdef HAVE_X_WINDOWS
@@ -39,7 +44,6 @@ Boston, MA 02111-1307, USA.  */
 #endif
 #include "buffer.h"
 #include "dispextern.h"
-#include "frame.h"
 #include "blockinput.h"
 #include "window.h"
 #include "intervals.h"
@@ -151,9 +155,6 @@ Boston, MA 02111-1307, USA.  */
 \f
 /* Definitions and declarations.  */
 
-/* The number of face-id's in use (same for all frames).  */
-static int next_face_id;
-
 /* The number of the face to use to indicate the region.  */
 static int region_face;
 
@@ -171,6 +172,9 @@ static int new_computed_face ( /* FRAME_PTR, struct face * */ );
 static int intern_computed_face ( /* FRAME_PTR, struct face * */ );
 static void ensure_face_ready ( /* FRAME_PTR, int id */ );
 void recompute_basic_faces ( /* FRAME_PTR f */ );
+static void merge_face_list ( /* FRAME_PTR, struct face *, Lisp_Object */ );
+
+extern Lisp_Object Qforeground_color, Qbackground_color;
 \f
 /* Allocating, copying, and comparing struct faces.  */
 
@@ -385,14 +389,14 @@ load_color (f, name)
   CHECK_STRING (name, 0);
   /* if the colormap is full, defined_color will return a best match
      to the values in an an existing cell. */
-  result = defined_color(f, (char *) XSTRING (name)->data, &color, 1);
+  result = defined_color (f, (char *) XSTRING (name)->data, &color, 1);
   if (! result)
     Fsignal (Qerror, Fcons (build_string ("undefined color"),
                            Fcons (name, Qnil)));
   return (unsigned long) color.pixel;
 }
 
-static void
+void
 unload_color (f, pixel)
      struct frame *f;
      unsigned long pixel;
@@ -979,101 +983,92 @@ compute_char_face (f, w, pos, region_beg, region_end, endptr, limit, mouse)
 
   compute_base_face (f, &face);
 
-  if (CONSP (prop))
+  merge_face_list (f, &face, prop);
+
+  noverlays = sort_overlays (overlay_vec, noverlays, w);
+
+  /* Now merge the overlay data in that order.  */
+  for (i = 0; i < noverlays; i++)
     {
-      /* We have a list of faces, merge them in reverse order */
-      Lisp_Object length;
-      int len;
-      Lisp_Object *faces;
+      Lisp_Object oend;
+      int oendpos;
+
+      prop = Foverlay_get (overlay_vec[i], propname);
+      merge_face_list (f, &face, prop);
+
+      oend = OVERLAY_END (overlay_vec[i]);
+      oendpos = OVERLAY_POSITION (oend);
+      if (oendpos < endpos)
+       endpos = oendpos;
+    }
+
+  if (pos >= region_beg && pos < region_end)
+    {
+      if (region_end < endpos)
+       endpos = region_end;
+      if (region_face >= 0 && region_face < next_face_id)
+       merge_faces (FRAME_PARAM_FACES (f)[region_face], &face);
+    }
+
+  *endptr = endpos;
+
+  return intern_computed_face (f, &face);
+}
+
+static void
+merge_face_list (f, face, prop)
+     FRAME_PTR f;
+     struct face *face;
+     Lisp_Object prop;
+{
+  Lisp_Object length;
+  int len;
+  Lisp_Object *faces;
+  int j;
+
+  if (CONSP (prop)
+      && ! STRINGP (XCONS (prop)->cdr))
+    {
+      /* We have a list of faces, merge them in reverse order.  */
 
       length = Fsafe_length (prop);
       len = XFASTINT (length);
 
-      /* Put them into an array */
+      /* Put them into an array */
       faces = (Lisp_Object *) alloca (len * sizeof (Lisp_Object));
       for (j = 0; j < len; j++)
        {
          faces[j] = Fcar (prop);
          prop = Fcdr (prop);
        }
-      /* So that we can merge them in the reverse order */
-      for (j = len - 1; j >= 0; j--)
-       {
-         facecode = face_name_id_number (f, faces[j]);
-         if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
-             && FRAME_PARAM_FACES (f) [facecode] != 0)
-           merge_faces (FRAME_PARAM_FACES (f) [facecode], &face);
-       }
+      /* So that we can merge them in the reverse order.  */
     }
-  else if (!NILP (prop))
+  else
     {
-      facecode = face_name_id_number (f, prop);
-      if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
-         && FRAME_PARAM_FACES (f) [facecode] != 0)
-       merge_faces (FRAME_PARAM_FACES (f) [facecode], &face);
+      faces = (Lisp_Object *) alloca (sizeof (Lisp_Object));
+      faces[0] = prop;
+      len = 1;
     }
 
-  noverlays = sort_overlays (overlay_vec, noverlays, w);
-
-  /* Now merge the overlay data in that order.  */
-  for (i = 0; i < noverlays; i++)
+  for (j = len - 1; j >= 0; j--)
     {
-      prop = Foverlay_get (overlay_vec[i], propname);
-      if (CONSP (prop))
+      if (CONSP (faces[j]))
        {
-         /* We have a list of faces, merge them in reverse order */
-         Lisp_Object length;
-         int len;
-         Lisp_Object *faces;
-
-         length = Fsafe_length (prop);
-         len = XFASTINT (length);
-
-         /* Put them into an array */
-         faces = (Lisp_Object *) alloca (len * sizeof (Lisp_Object));
-         for (j = 0; j < len; j++)
-           {
-             faces[j] = Fcar (prop);
-             prop = Fcdr (prop);
-           }
-         /* So that we can merge them in the reverse order */
-         for (j = len - 1; j >= 0; j--)
-           {
-             facecode = face_name_id_number (f, faces[j]);
-             if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
-                 && FRAME_PARAM_FACES (f) [facecode] != 0)
-               merge_faces (FRAME_PARAM_FACES (f) [facecode], &face);
-           }
+         if (EQ (XCONS (faces[j])->car, Qbackground_color))
+           face->background = load_color (f, XCONS (faces[j])->cdr);
+         if (EQ (XCONS (faces[j])->car, Qforeground_color))
+           face->foreground = load_color (f, XCONS (faces[j])->cdr);
        }
-      else if (!NILP (prop))
+      else
        {
-         Lisp_Object oend;
-         int oendpos;
-
-         facecode = face_name_id_number (f, prop);
+         int facecode = face_name_id_number (f, faces[j]);
          if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
              && FRAME_PARAM_FACES (f) [facecode] != 0)
-           merge_faces (FRAME_PARAM_FACES (f)[facecode], &face);
-
-         oend = OVERLAY_END (overlay_vec[i]);
-         oendpos = OVERLAY_POSITION (oend);
-         if (oendpos < endpos)
-           endpos = oendpos;
+           merge_faces (FRAME_PARAM_FACES (f) [facecode], face);
        }
     }
-
-  if (pos >= region_beg && pos < region_end)
-    {
-      if (region_end < endpos)
-       endpos = region_end;
-      if (region_face >= 0 && region_face < next_face_id)
-       merge_faces (FRAME_PARAM_FACES (f)[region_face], &face);
-    }
-
-  *endptr = endpos;
-
-  return intern_computed_face (f, &face);
 }
+
 \f
 /* Recompute the GC's for the default and modeline faces.
    We call this after changing frame parameters on which those GC's
@@ -1116,26 +1111,6 @@ recompute_basic_faces (f)
 \f
 /* Lisp interface. */
 
-DEFUN ("frame-face-alist", Fframe_face_alist, Sframe_face_alist, 1, 1, 0,
-       "")
-     (frame)
-     Lisp_Object frame;
-{
-  CHECK_FRAME (frame, 0);
-  return XFRAME (frame)->face_alist;
-}
-
-DEFUN ("set-frame-face-alist", Fset_frame_face_alist, Sset_frame_face_alist,
-       2, 2, 0, "")
-     (frame, value)
-     Lisp_Object frame, value;
-{
-  CHECK_FRAME (frame, 0);
-  XFRAME (frame)->face_alist = value;
-  return value;
-}
-
-
 DEFUN ("make-face-internal", Fmake_face_internal, Smake_face_internal, 1, 1, 0,
   "Create face number FACE-ID on all frames.")
   (face_id)
@@ -1206,7 +1181,7 @@ DEFUN ("set-face-attribute-internal", Fset_face_attribute_internal,
            {
              struct font_info *fontp;
              
-             if (!(fontp = fs_load_font (f, FRAME_X_FONT_TABLE (f),
+             if (!(fontp = FS_LOAD_FONT (f, FRAME_X_FONT_TABLE (f),
                                          CHARSET_ASCII, NULL, fontset)))
                Fsignal (Qerror,
                         Fcons (build_string ("ASCII font can't be loaded"),
@@ -1272,19 +1247,13 @@ DEFUN ("set-face-attribute-internal", Fset_face_attribute_internal,
   if (garbaged)
     {
       SET_FRAME_GARBAGED (f);
+#ifdef HAVE_X_WINDOWS
       FRAME_X_DISPLAY_INFO (f)->mouse_face_defer = 1;
+#endif
     }
 
   return Qnil;
 }
-
-DEFUN ("internal-next-face-id", Finternal_next_face_id, Sinternal_next_face_id,
-  0, 0, 0, "")
-  ()
-{
-  return make_number (next_face_id++);
-}
-
 /* Return the face id for name NAME on frame FRAME.
    (It should be the same for all frames,
    but it's as easy to use the "right" frame to look it up
@@ -1305,12 +1274,42 @@ face_name_id_number (f, name)
   CHECK_NUMBER (tem, 0);
   return XINT (tem);
 }
+
+#endif /* HAVE_FACES */
+
+\f
+DEFUN ("frame-face-alist", Fframe_face_alist, Sframe_face_alist, 1, 1, 0,
+       "")
+     (frame)
+     Lisp_Object frame;
+{
+  CHECK_FRAME (frame, 0);
+  return XFRAME (frame)->face_alist;
+}
+
+DEFUN ("set-frame-face-alist", Fset_frame_face_alist, Sset_frame_face_alist,
+       2, 2, 0, "")
+     (frame, value)
+     Lisp_Object frame, value;
+{
+  CHECK_FRAME (frame, 0);
+  XFRAME (frame)->face_alist = value;
+  return value;
+}
+
+DEFUN ("internal-next-face-id", Finternal_next_face_id, Sinternal_next_face_id,
+  0, 0, 0, "")
+  ()
+{
+  return make_number (next_face_id++);
+}
 \f
 /* Emacs initialization.  */
 
 void
 syms_of_xfaces ()
 {
+#ifdef HAVE_FACES
   Qface = intern ("face");
   staticpro (&Qface);
   Qmouse_face = intern ("mouse-face");
@@ -1323,14 +1322,15 @@ syms_of_xfaces ()
 The region is highlighted with this face\n\
 when Transient Mark mode is enabled and the mark is active.");
 
+  defsubr (&Smake_face_internal);
+  defsubr (&Sset_face_attribute_internal);
+#endif /* HAVE_FACES */
+
 #ifdef HAVE_X_WINDOWS
   defsubr (&Spixmap_spec_p);
 #endif
+
   defsubr (&Sframe_face_alist);
   defsubr (&Sset_frame_face_alist);
-  defsubr (&Smake_face_internal);
-  defsubr (&Sset_face_attribute_internal);
   defsubr (&Sinternal_next_face_id);
 }
-
-#endif /* HAVE_FACES */