Mercurial > emacs
changeset 79327:72cdd210604a
(face_at_buffer_position_no_overlays): New function.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sat, 03 Nov 2007 03:46:22 +0000 |
parents | 467360fde5e5 |
children | fcf9272ec241 |
files | src/xfaces.c |
diffstat | 1 files changed, 76 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/xfaces.c Sat Nov 03 03:08:46 2007 +0000 +++ b/src/xfaces.c Sat Nov 03 03:46:22 2007 +0000 @@ -7706,6 +7706,82 @@ return lookup_face (f, attrs, 0, NULL); } +/* Return the face ID associated with buffer position POS for + displaying ASCII characters, but without overlays. + Like face_at_buffer_position except it ignores overlays. */ + +int +face_at_buffer_position_no_overlays (w, pos, region_beg, region_end, + endptr, limit, mouse) + struct window *w; + int pos; + int region_beg, region_end; + int *endptr; + int limit; + int mouse; +{ + struct frame *f = XFRAME (w->frame); + Lisp_Object attrs[LFACE_VECTOR_SIZE]; + Lisp_Object prop, position; + int i, noverlays; + Lisp_Object *overlay_vec; + Lisp_Object frame; + int endpos; + Lisp_Object propname = mouse ? Qmouse_face : Qface; + Lisp_Object limit1, end; + struct face *default_face; + + /* W must display the current buffer. We could write this function + to use the frame and buffer of W, but right now it doesn't. */ + /* xassert (XBUFFER (w->buffer) == current_buffer); */ + + XSETFRAME (frame, f); + XSETFASTINT (position, pos); + + endpos = ZV; + if (pos < region_beg && region_beg < endpos) + endpos = region_beg; + + /* Get the `face' or `mouse_face' text property at POS, and + determine the next position at which the property changes. */ + prop = Fget_text_property (position, propname, w->buffer); + XSETFASTINT (limit1, (limit < endpos ? limit : endpos)); + end = Fnext_single_property_change (position, propname, w->buffer, limit1); + if (INTEGERP (end)) + endpos = XINT (end); + + *endptr = endpos; + + default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID); + + /* Optimize common cases where we can use the default face. */ + if (NILP (prop) + && !(pos >= region_beg && pos < region_end)) + return DEFAULT_FACE_ID; + + /* Begin with attributes from the default face. */ + bcopy (default_face->lface, attrs, sizeof attrs); + + /* Merge in attributes specified via text properties. */ + if (!NILP (prop)) + merge_face_ref (f, prop, attrs, 1, 0); + + /* If in the region, merge in the region face. */ + if (pos >= region_beg && pos < region_end) + { + merge_named_face (f, Qregion, attrs, 0); + + if (region_end < endpos) + endpos = region_end; + } + + *endptr = endpos; + + /* Look up a realized face with the given face attributes, + or realize a new one for ASCII characters. */ + return lookup_face (f, attrs, 0, NULL); +} + /* Compute the face at character position POS in Lisp string STRING on window W, for ASCII characters.