diff options
author | Richard M. Stallman <rms@gnu.org> | 1994-09-29 23:00:43 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1994-09-29 23:00:43 +0000 |
commit | fb0877909643f5426bd79b8340ebd0dfb0219040 (patch) | |
tree | 4234e65dabd807bddf2acc8e4ebcc62298737e50 /src/xfaces.c | |
parent | 2d83401467d6aafdfb12864851d41ae7c10c3fd9 (diff) | |
download | emacs-fb0877909643f5426bd79b8340ebd0dfb0219040.tar.gz |
(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.c | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/src/xfaces.c b/src/xfaces.c index 3ddc6e5f78d..7ac1a400cef 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; |