Mercurial > emacs
changeset 2784:f8c6796b7777
* xfaces.c (compute_char_face): When merging the overlays,
traverse sortvec, not overlay_vec; the latter isn't the one we
sorted.
* xfaces.c (intern_face): If the face has a GC, but it's not the
default or modeline face, abort. Nothing but those two faces
should have a GC *and* be passed to intern_face.
(compute_char_face, compute_glyph_face): After copying
the frame's default face into face, to use as a base case for
calculation, set the `gc' member to zero; that way we don't have
things lying around that look like display faces but aren't.
* xfaces.c (intern_frame_face): When copying the new face into the
frame's face array, remember that the number of bytes to copy is
sizeof (*new_face), not sizeof (new_face).
* xfaces.c (compute_char_face): Assume that W is displaying the
current buffer. Abort if it isn't.
author | Jim Blandy <jimb@redhat.com> |
---|---|
date | Fri, 14 May 1993 14:44:01 +0000 |
parents | 789c11177579 |
children | 55e9c556bbf8 |
files | src/xfaces.c |
diffstat | 1 files changed, 26 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/xfaces.c Fri May 14 14:43:30 1993 +0000 +++ b/src/xfaces.c Fri May 14 14:44:01 1993 +0000 @@ -246,12 +246,6 @@ struct frame *f; struct face *face; { - struct face *result; - - /* Does the face have a GC already? */ - if (face->gc) - return face; - /* If it's equivalent to the default face, use that. */ if (face_eql (face, FRAME_DEFAULT_FACE (f))) { @@ -268,6 +262,10 @@ return FRAME_MODE_LINE_FACE (f); } + /* If it's not one of the frame's default faces, it shouldn't have a GC. */ + if (face->gc) + abort (); + /* Get a specialized display face. */ return get_cached_face (f, face); } @@ -539,7 +537,7 @@ i = next_face_id++; ensure_face_ready (frame, i); - bcopy (new_face, FRAME_FACES (frame)[i], sizeof (new_face)); + bcopy (new_face, FRAME_FACES (frame)[i], sizeof (*new_face)); return i; } @@ -617,7 +615,8 @@ /* Return the face ID associated with a buffer position POS. Store into *ENDPTR the position at which a different face is needed. This does not take account of glyphs that specify their own face codes. - F is the frame in use for display, and W is the window. */ + F is the frame in use for display, and W is a window displaying + the current buffer. */ int compute_char_face (f, w, pos, endptr) struct frame *f; @@ -629,14 +628,21 @@ Lisp_Object prop, position; int i, j, noverlays; int facecode; - int endpos = BUF_ZV (XBUFFER (w->buffer)); Lisp_Object *overlay_vec; int len; struct sortvec *sortvec; Lisp_Object frame; + int endpos; + + /* 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. */ + if (XBUFFER (w->buffer) != current_buffer) + abort (); XSET (frame, Lisp_Frame, f); + endpos = ZV; + XFASTINT (position) = pos; prop = Fget_text_property (position, Qface, w->buffer); { @@ -648,13 +654,13 @@ } { - int end; + int next_overlay; len = 10; overlay_vec = (Lisp_Object *) xmalloc (len * sizeof (Lisp_Object)); - noverlays = overlays_at (pos, &overlay_vec, &len, &end); - if (end < endpos) - endpos = end; + noverlays = overlays_at (pos, &overlay_vec, &len, &next_overlay); + if (next_overlay < endpos) + endpos = next_overlay; } *endptr = endpos; @@ -664,6 +670,7 @@ return 0; bcopy (FRAME_DEFAULT_FACE (f), &face, sizeof (struct face)); + face.gc = 0; if (!NILP (prop)) { @@ -689,7 +696,8 @@ /* Also ignore overlays limited to one window if it's not the window we are using. */ - if (NILP (window) || XWINDOW (window) == w) + if (XTYPE (window) != Lisp_Window + || XWINDOW (window) == w) { Lisp_Object tem; @@ -714,10 +722,9 @@ qsort (sortvec, noverlays, sizeof (struct sortvec), sort_overlays); /* Now merge the overlay data in that order. */ - for (i = 0; i < noverlays; i++) { - prop = Foverlay_get (overlay_vec[i], Qface); + prop = Foverlay_get (sortvec[i].overlay, Qface); if (!NILP (prop)) { Lisp_Object oend; @@ -728,9 +735,9 @@ && FRAME_FACES (f) [facecode] != 0) merge_faces (FRAME_FACES (f) [facecode], &face); - oend = OVERLAY_END (overlay_vec[i]); + oend = OVERLAY_END (sortvec[i].overlay); oendpos = OVERLAY_POSITION (oend); - if (oendpos > endpos) + if (oendpos < endpos) endpos = oendpos; } } @@ -753,6 +760,7 @@ struct face face; bcopy (FRAME_DEFAULT_FACE (f), &face, sizeof (face)); + face.gc = 0; if (face_code >= 0 && face_code < FRAME_N_FACES (f) && FRAME_FACES (f) [face_code] != 0)