Mercurial > emacs
diff src/xdisp.c @ 83231:549734260e34
Merged in changes from CVS trunk.
Patches applied:
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-714
Update from CVS
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-271
author | Karoly Lorentey <lorentey@elte.hu> |
---|---|
date | Wed, 08 Dec 2004 22:20:27 +0000 |
parents | 2a3f27a45698 5c07c674b739 |
children | 6b379caca6fa |
line wrap: on
line diff
--- a/src/xdisp.c Sun Nov 28 14:39:06 2004 +0000 +++ b/src/xdisp.c Wed Dec 08 22:20:27 2004 +0000 @@ -803,7 +803,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)); @@ -3223,7 +3223,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); } } @@ -3231,14 +3231,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; @@ -3251,12 +3254,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; } @@ -3571,7 +3574,7 @@ || EQ (XCAR (prop), Qright_fringe)) && CONSP (XCDR (prop))) { - unsigned face_id = DEFAULT_FACE_ID; + int face_id = DEFAULT_FACE_ID; int fringe_bitmap; /* Save current settings of IT so that we can restore them @@ -3590,10 +3593,9 @@ if (CONSP (XCDR (XCDR (prop)))) { Lisp_Object face_name = XCAR (XCDR (XCDR (prop))); - - face_id = lookup_named_face (it->f, face_name, 'A'); - if (face_id < 0) - return 0; + int face_id2 = lookup_named_face (it->f, face_name, 'A', 0); + if (face_id2 >= 0) + face_id = face_id2; } push_it (it); @@ -4048,7 +4050,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 +4842,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 +4877,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 +4920,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 +4935,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 +4984,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 +5184,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 +5200,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 +5383,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 +5754,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 */ } @@ -14538,7 +14514,9 @@ && glyph->u.ch == ' ')) && trailing_whitespace_p (glyph->charpos)) { - int face_id = lookup_named_face (f, Qtrailing_whitespace, 0); + int face_id = lookup_named_face (f, Qtrailing_whitespace, 0, 0); + if (face_id < 0) + return; while (glyph >= start && BUFFERP (glyph->object) @@ -14631,8 +14609,10 @@ hscrolled. This may stop at an x-position < IT->first_visible_x if the first glyph is partially visible or if we hit a line end. */ if (it->current_x < it->first_visible_x) - move_it_in_display_line_to (it, ZV, it->first_visible_x, - MOVE_TO_POS | MOVE_TO_X); + { + move_it_in_display_line_to (it, ZV, it->first_visible_x, + MOVE_TO_POS | MOVE_TO_X); + } /* Get the initial row height. This is either the height of the text hscrolled, if there is any, or zero. */ @@ -14791,8 +14771,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 */ } @@ -18812,7 +18790,7 @@ struct face *face; struct font_info *font_info; - face_id = lookup_named_face (it->f, face_name, ' '); + face_id = lookup_named_face (it->f, face_name, ' ', 0); if (face_id < 0) return make_number (-1);