Mercurial > emacs
changeset 58530:5c07c674b739
Undo recent changes for restoring it->saved_face_id. Instead,
set it when it->method is set to next_element_from_display_vector.
(setup_for_ellipsis): Add LEN argument. Callers changed.
Set it->saved_face_id.
(get_next_display_element): Use loop instead of recursion.
Set it->saved_face_id. Combine duplicate code for ctr chars.
(next_element_from_display_vector): Do not set it->saved_face_id.
(next_element_from_ellipsis): Use setup_for_ellipsis.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Fri, 26 Nov 2004 14:38:55 +0000 |
parents | 45bdb8bde271 |
children | 7ca318a97cf0 |
files | src/xdisp.c |
diffstat | 1 files changed, 45 insertions(+), 76 deletions(-) [+] |
line wrap: on
line diff
--- a/src/xdisp.c Fri Nov 26 14:37:55 2004 +0000 +++ b/src/xdisp.c Fri Nov 26 14:38:55 2004 +0000 @@ -807,7 +807,7 @@ /* Function prototypes. */ -static void setup_for_ellipsis P_ ((struct it *)); +static void setup_for_ellipsis P_ ((struct it *, int)); static void mark_window_display_accurate_1 P_ ((struct window *, int)); static int single_display_prop_string_p P_ ((Lisp_Object, Lisp_Object)); static int display_prop_string_p P_ ((Lisp_Object, Lisp_Object)); @@ -3227,7 +3227,7 @@ it->stack[it->sp - 1].display_ellipsis_p = display_ellipsis_p; } else if (display_ellipsis_p) - setup_for_ellipsis (it); + setup_for_ellipsis (it, 0); } } @@ -3235,14 +3235,17 @@ } -/* Make iterator IT return `...' next. */ - -static void -setup_for_ellipsis (it) - struct it *it; -{ - if (it->dp - && VECTORP (DISP_INVIS_VECTOR (it->dp))) +/* Make iterator IT return `...' next. + Replaces LEN characters from buffer. */ + +static void +setup_for_ellipsis (it, len) + struct it *it; + int len; +{ + /* Use the display table definition for `...'. Invalid glyphs + will be handled by the method returning elements from dpvec. */ + if (it->dp && VECTORP (DISP_INVIS_VECTOR (it->dp))) { struct Lisp_Vector *v = XVECTOR (DISP_INVIS_VECTOR (it->dp)); it->dpvec = v->contents; @@ -3255,12 +3258,12 @@ it->dpend = default_invis_vector + 3; } - /* The ellipsis display does not replace the display of the - character at the new position. Indicate this by setting - IT->dpvec_char_len to zero. */ - it->dpvec_char_len = 0; - + it->dpvec_char_len = len; it->current.dpvec_index = 0; + + /* Remember the current face id in case glyphs specify faces. + IT's face is restored in set_iterator_to_next. */ + it->saved_face_id = it->face_id; it->method = next_element_from_display_vector; } @@ -4048,7 +4051,7 @@ /* If we have to display `...' for invisible text, set the iterator up for that. */ if (display_ellipsis_p) - setup_for_ellipsis (it); + setup_for_ellipsis (it, 0); } else { @@ -4840,7 +4843,10 @@ we hit the end of what we iterate over. Performance note: the function pointer `method' used here turns out to be faster than using a sequence of if-statements. */ - int success_p = (*it->method) (it); + int success_p; + + get_next: + success_p = (*it->method) (it); if (it->what == IT_CHARACTER) { @@ -4872,14 +4878,14 @@ it->dpvec = v->contents; it->dpend = v->contents + v->size; it->current.dpvec_index = 0; + it->saved_face_id = it->face_id; it->method = next_element_from_display_vector; - success_p = get_next_display_element (it); } else { set_iterator_to_next (it, 0); - success_p = get_next_display_element (it); - } + } + goto get_next; } /* Translate control characters into `\003' or `^C' form. @@ -4915,6 +4921,7 @@ IT->ctl_chars with glyphs for what we have to display. Then, set IT->dpvec to these glyphs. */ GLYPH g; + int ctl_len; if (it->c < 128 && it->ctl_arrow_p) { @@ -4929,14 +4936,7 @@ g = FAST_MAKE_GLYPH (it->c ^ 0100, 0); XSETINT (it->ctl_chars[1], g); - - /* Set up IT->dpvec and return first character from it. */ - it->dpvec_char_len = it->len; - it->dpvec = it->ctl_chars; - it->dpend = it->dpvec + 2; - it->current.dpvec_index = 0; - it->method = next_element_from_display_vector; - get_next_display_element (it); + ctl_len = 2; } else { @@ -4985,16 +4985,17 @@ g = FAST_MAKE_GLYPH ((str[i] & 7) + '0', 0); XSETINT (it->ctl_chars[i * 4 + 3], g); } - - /* Set up IT->dpvec and return the first character - from it. */ - it->dpvec_char_len = it->len; - it->dpvec = it->ctl_chars; - it->dpend = it->dpvec + len * 4; - it->current.dpvec_index = 0; - it->method = next_element_from_display_vector; - get_next_display_element (it); - } + ctl_len = len * 4; + } + + /* Set up IT->dpvec and return first character from it. */ + it->dpvec_char_len = it->len; + it->dpvec = it->ctl_chars; + it->dpend = it->dpvec + ctl_len; + it->current.dpvec_index = 0; + it->saved_face_id = it->face_id; + it->method = next_element_from_display_vector; + goto get_next; } } @@ -5184,11 +5185,14 @@ && IT_STRING_CHARPOS (*it) >= 0)); } - /* Load IT's display element fields with information about the next display element which comes from a display table entry or from the result of translating a control character to one of the forms `^C' - or `\003'. IT->dpvec holds the glyphs to return as characters. */ + or `\003'. + + IT->dpvec holds the glyphs to return as characters. + IT->saved_face_id holds the face id before the display vector-- + it is restored into IT->face_idin set_iterator_to_next. */ static int next_element_from_display_vector (it) @@ -5197,10 +5201,6 @@ /* Precondition. */ xassert (it->dpvec && it->current.dpvec_index >= 0); - /* Remember the current face id in case glyphs specify faces. - IT's face is restored in set_iterator_to_next. */ - it->saved_face_id = it->face_id; - if (INTEGERP (*it->dpvec) && GLYPH_CHAR_VALID_P (XFASTINT (*it->dpvec))) { @@ -5384,28 +5384,7 @@ struct it *it; { if (it->selective_display_ellipsis_p) - { - if (it->dp && VECTORP (DISP_INVIS_VECTOR (it->dp))) - { - /* Use the display table definition for `...'. Invalid glyphs - will be handled by the method returning elements from dpvec. */ - struct Lisp_Vector *v = XVECTOR (DISP_INVIS_VECTOR (it->dp)); - it->dpvec_char_len = it->len; - it->dpvec = v->contents; - it->dpend = v->contents + v->size; - it->current.dpvec_index = 0; - it->method = next_element_from_display_vector; - } - else - { - /* Use default `...' which is stored in default_invis_vector. */ - it->dpvec_char_len = it->len; - it->dpvec = default_invis_vector; - it->dpend = default_invis_vector + 3; - it->current.dpvec_index = 0; - it->method = next_element_from_display_vector; - } - } + setup_for_ellipsis (it, it->len); else { /* The face at the current position may be different from the @@ -5776,8 +5755,6 @@ result = MOVE_NEWLINE_OR_CR; break; } - if (it->method == next_element_from_display_vector) - it->face_id = it->saved_face_id; } #endif /* HAVE_WINDOW_SYSTEM */ } @@ -5862,8 +5839,6 @@ result = MOVE_NEWLINE_OR_CR; break; } - if (it->method == next_element_from_display_vector) - it->face_id = it->saved_face_id; } #endif /* HAVE_WINDOW_SYSTEM */ result = MOVE_LINE_TRUNCATED; @@ -14633,8 +14608,6 @@ { move_it_in_display_line_to (it, ZV, it->first_visible_x, MOVE_TO_POS | MOVE_TO_X); - if (it->method == next_element_from_display_vector) - it->face_id = it->saved_face_id; } /* Get the initial row height. This is either the height of the @@ -14794,8 +14767,6 @@ row->continued_p = 0; row->exact_window_width_line_p = 1; } - else if (it->method == next_element_from_display_vector) - it->face_id = it->saved_face_id; } #endif /* HAVE_WINDOW_SYSTEM */ } @@ -14976,8 +14947,6 @@ row->exact_window_width_line_p = 1; goto at_end_of_line; } - if (it->method == next_element_from_display_vector) - it->face_id = it->saved_face_id; } } #endif /* HAVE_WINDOW_SYSTEM */