aboutsummaryrefslogtreecommitdiffstats
path: root/src/xfaces.c
diff options
context:
space:
mode:
authorRichard M. Stallman <[email protected]>1994-09-29 23:00:43 +0000
committerRichard M. Stallman <[email protected]>1994-09-29 23:00:43 +0000
commit4699e6d2a1a94b81e853c8afd48e652af232e529 (patch)
treef711c062c28036d37159c06891ddf7507eaafa57 /src/xfaces.c
parentcb5fbf94a8730473d64738028a3eec0ab73887ee (diff)
(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.
Diffstat (limited to 'src/xfaces.c')
-rw-r--r--src/xfaces.c51
1 files changed, 49 insertions, 2 deletions
diff --git a/src/xfaces.c b/src/xfaces.c
index 3ddc6e5f78..7ac1a400ce 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -864,7 +864,30 @@ compute_char_face (f, w, pos, region_beg, region_end, endptr, limit, mouse)
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 @@ compute_char_face (f, w, pos, region_beg, region_end, endptr, limit, mouse)
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;