changeset 9186:45bac5feb065

(compute_char_face): Handle list as overlay face property. (compute_char_face): If face text-property is a list, merge the attributes of the faces in the list.
author Richard M. Stallman <rms@gnu.org>
date Thu, 29 Sep 1994 23:00:43 +0000
parents a5b9b922a853
children 8cf9181c119e
files src/xfaces.c
diffstat 1 files changed, 49 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/xfaces.c	Thu Sep 29 22:47:30 1994 +0000
+++ b/src/xfaces.c	Thu Sep 29 23:00:43 1994 +0000
@@ -864,7 +864,30 @@
 
   compute_base_face (f, &face);
 
-  if (!NILP (prop))
+  if (CONSP (prop))
+    {
+      /* We have a list of faces, merge them in reverse order */
+      Lisp_Object length = Flength (prop);
+      int len = XINT (length);
+      Lisp_Object *faces;
+
+      /* 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);
+	}
+    }
+  else if (!NILP (prop))
     {
       facecode = face_name_id_number (f, prop);
       if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
@@ -878,7 +901,31 @@
   for (i = 0; i < noverlays; i++)
     {
       prop = Foverlay_get (overlay_vec[i], propname);
-      if (!NILP (prop))
+      if (CONSP (prop))
+	{
+	  /* We have a list of faces, merge them in reverse order */
+	  Lisp_Object length = Flength (prop);
+	  int len = XINT (length);
+	  Lisp_Object *faces;
+	  int i;
+
+	  /* 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);
+	    }
+	}
+      else if (!NILP (prop))
 	{
 	  Lisp_Object oend;
 	  int oendpos;