emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/xfaces.c,v


From: Miles Bader
Subject: [Emacs-diffs] Changes to emacs/src/xfaces.c,v
Date: Fri, 09 Nov 2007 09:45:44 +0000

CVSROOT:        /cvsroot/emacs
Module name:    emacs
Changes by:     Miles Bader <miles>     07/11/09 09:45:31

Index: src/xfaces.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/xfaces.c,v
retrieving revision 1.368
retrieving revision 1.369
diff -u -b -r1.368 -r1.369
--- src/xfaces.c        13 Oct 2007 12:47:51 -0000      1.368
+++ src/xfaces.c        9 Nov 2007 09:45:24 -0000       1.369
@@ -7732,6 +7732,85 @@
   return lookup_face (f, attrs, 0, NULL);
 }
 
+/* Return the face ID at buffer position POS for displaying ASCII
+   characters associated with overlay strings for overlay OVERLAY.
+
+   Like face_at_buffer_position except for OVERLAY.  Currently it
+   simply disregards the `face' properties of all overlays.  */
+
+int
+face_for_overlay_string (w, pos, region_beg, region_end,
+                        endptr, limit, mouse, overlay)
+     struct window *w;
+     int pos;
+     int region_beg, region_end;
+     int *endptr;
+     int limit;
+     int mouse;
+     Lisp_Object overlay;
+{
+  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.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]