From 4699e6d2a1a94b81e853c8afd48e652af232e529 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Thu, 29 Sep 1994 23:00:43 +0000 Subject: [PATCH] (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. --- src/xfaces.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file 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; -- 2.39.5