# HG changeset patch # User Richard M. Stallman # Date 765531801 0 # Node ID b5dc04567426a0d48b584ea4458769040520b935 # Parent af1629dfdb4c734f7c571e46ae86ee99eff8779b (display_text_line): Rename startp to leftmargin. Use that, not p1start, when checking for char off left edge. (mark_window_display_accurate, redisplay): Set window_end_valid to the buffer displayed, not Qt. diff -r af1629dfdb4c -r b5dc04567426 src/xdisp.c --- a/src/xdisp.c Tue Apr 05 07:41:09 1994 +0000 +++ b/src/xdisp.c Tue Apr 05 07:43:21 1994 +0000 @@ -836,7 +836,7 @@ { w->update_mode_line = Qnil; XFASTINT (w->last_modified) = BUF_MODIFF (b); - w->window_end_valid = Qt; + w->window_end_valid = w->buffer; last_arrow_position = Voverlay_arrow_position; last_arrow_string = Voverlay_arrow_string; if (do_verify_charstarts) @@ -910,7 +910,7 @@ : Qnil); } - w->window_end_valid = Qt; + w->window_end_valid = w->buffer; w->update_mode_line = Qnil; if (!NILP (w->vchild)) @@ -1635,7 +1635,24 @@ tem = scroll_frame_lines (f, bp.vpos + top - scroll_amount, top + height - max (0, scroll_amount), scroll_amount, bp.bufpos); - if (!tem) stop_vpos = height; + if (!tem) + stop_vpos = height; + else + { + /* scroll_frame_lines did not properly adjust subsequent + lines' charstarts in the case where the text of the + screen line at bp.vpos has changed. + (This can happen in a deletion that ends in mid-line.) + To adjust properly, we need to make things constent at + the position ep. + So do a second adjust to make that happen. + Note that stop_vpos >= ep.vpos, so it is sufficient + to update the charstarts for lines at ep.vpos and below. */ + int oldstart + = FRAME_CURRENT_GLYPHS (f)->charstarts[ep.vpos + top][0]; + adjust_window_charstarts (w, ep.vpos + top - 1, + ep.bufpos - oldstart); + } } else if (scroll_amount) { @@ -1966,7 +1983,7 @@ register int pause; register unsigned char *p; GLYPH *endp; - register GLYPH *startp; + register GLYPH *leftmargin; register GLYPH *p1prev = 0; register GLYPH *p1start; int *charstart; @@ -1978,10 +1995,10 @@ int lastpos; int invis; int hscroll = XINT (w->hscroll); - int truncate = hscroll - || (truncate_partial_width_windows - && XFASTINT (w->width) < FRAME_WIDTH (f)) - || !NILP (current_buffer->truncate_lines); + int truncate = (hscroll + || (truncate_partial_width_windows + && XFASTINT (w->width) < FRAME_WIDTH (f)) + || !NILP (current_buffer->truncate_lines)); /* 1 if we should highlight the region. */ int highlight_region @@ -2071,8 +2088,8 @@ /* In case we don't ever write anything into it... */ *charstart = -1; end = ZV; - startp = desired_glyphs->glyphs[vpos] + XFASTINT (w->left); - endp = startp + width; + leftmargin = desired_glyphs->glyphs[vpos] + XFASTINT (w->left); + endp = leftmargin + width; /* Arrange the overlays nicely for our purposes. Usually, we call display_text_line on only one line at a time, in which case this @@ -2094,7 +2111,7 @@ { /* Record which glyph starts a character, and the character position of that character. */ - if (p1 >= p1start) + if (p1 >= leftmargin) charstart[p1 - p1start] = pos; if (p1 >= endp) @@ -2112,7 +2129,7 @@ if (pos == point && cursor_vpos < 0) { cursor_vpos = vpos; - cursor_hpos = p1 - startp; + cursor_hpos = p1 - leftmargin; } #ifdef USE_TEXT_PROPERTIES @@ -2140,7 +2157,7 @@ if (pos < point && next_invisible >= point) { cursor_vpos = vpos; - cursor_hpos = p1 - startp; + cursor_hpos = p1 - leftmargin; } pos = next_invisible; } @@ -2181,7 +2198,7 @@ if (c >= 040 && c < 0177 && (dp == 0 || XTYPE (DISP_CHAR_VECTOR (dp, c)) != Lisp_Vector)) { - if (p1 >= startp) + if (p1 >= leftmargin) *p1 = MAKE_GLYPH (f, c, current_face); p1++; } @@ -2197,10 +2214,10 @@ if (FETCH_CHAR (pos - 1) == '\n') pos--; } - if (invis && selective_rlen > 0 && p1 >= startp) + if (invis && selective_rlen > 0 && p1 >= leftmargin) { p1 += selective_rlen; - if (p1 - startp > width) + if (p1 - leftmargin > width) p1 = endp; copy_part_of_rope (f, p1prev, p1prev, invis_vector_contents, (p1 - p1prev), current_face); @@ -2218,11 +2235,11 @@ { do { - if (p1 >= startp && p1 < endp) + if (p1 >= leftmargin && p1 < endp) *p1 = MAKE_GLYPH (f, ' ', current_face); p1++; } - while ((p1 - startp + taboffset + hscroll - (hscroll > 0)) + while ((p1 - leftmargin + taboffset + hscroll - (hscroll > 0)) % tab_width); } else if (c == Ctl ('M') && selective == -1) @@ -2233,7 +2250,7 @@ if (selective_rlen > 0) { p1 += selective_rlen; - if (p1 - startp > width) + if (p1 - leftmargin > width) p1 = endp; copy_part_of_rope (f, p1prev, p1prev, invis_vector_contents, (p1 - p1prev), current_face); @@ -2249,42 +2266,42 @@ } else if (dp != 0 && XTYPE (DISP_CHAR_VECTOR (dp, c)) == Lisp_Vector) { - p1 = copy_part_of_rope (f, p1, startp, + p1 = copy_part_of_rope (f, p1, leftmargin, XVECTOR (DISP_CHAR_VECTOR (dp, c))->contents, XVECTOR (DISP_CHAR_VECTOR (dp, c))->size, current_face); } else if (c < 0200 && ctl_arrow) { - if (p1 >= startp) + if (p1 >= leftmargin) *p1 = fix_glyph (f, (dp && XTYPE (DISP_CTRL_GLYPH (dp)) == Lisp_Int ? XINT (DISP_CTRL_GLYPH (dp)) : '^'), current_face); p1++; - if (p1 >= startp && p1 < endp) + if (p1 >= leftmargin && p1 < endp) *p1 = MAKE_GLYPH (f, c ^ 0100, current_face); p1++; } else { - if (p1 >= startp) + if (p1 >= leftmargin) *p1 = fix_glyph (f, (dp && XTYPE (DISP_ESCAPE_GLYPH (dp)) == Lisp_Int ? XINT (DISP_ESCAPE_GLYPH (dp)) : '\\'), current_face); p1++; - if (p1 >= startp && p1 < endp) + if (p1 >= leftmargin && p1 < endp) *p1 = MAKE_GLYPH (f, (c >> 6) + '0', current_face); p1++; - if (p1 >= startp && p1 < endp) + if (p1 >= leftmargin && p1 < endp) *p1 = MAKE_GLYPH (f, (7 & (c >> 3)) + '0', current_face); p1++; - if (p1 >= startp && p1 < endp) + if (p1 >= leftmargin && p1 < endp) *p1 = MAKE_GLYPH (f, (7 & c) + '0', current_face); p1++; } /* Do nothing here for a char that's entirely off the left edge. */ - if (p1 >= p1start) + if (p1 >= leftmargin) { /* For all the glyphs occupied by this character, except for the first, store -1 in charstarts. */ @@ -2296,7 +2313,7 @@ /* The window's left column should always contain a character position. And don't clobber anything to the left of that. */ - if (p1prev < p1start) + if (p1prev < leftmargin) { charstart[0] = pos; p2x = charstart; @@ -2395,7 +2412,7 @@ if (start <= point && point <= lastpos && cursor_vpos < 0) { cursor_vpos = vpos; - cursor_hpos = p1 - startp; + cursor_hpos = p1 - leftmargin; } if (cursor_vpos == vpos) @@ -2431,15 +2448,15 @@ /* If hscroll and line not empty, insert truncation-at-left marker */ if (hscroll && lastpos != start) { - *startp = fix_glyph (f, truncator, 0); - if (p1 <= startp) - p1 = startp + 1; + *leftmargin = fix_glyph (f, truncator, 0); + if (p1 <= leftmargin) + p1 = leftmargin + 1; } if (XFASTINT (w->width) + XFASTINT (w->left) != FRAME_WIDTH (f)) { endp++; - if (p1 < startp) p1 = startp; + if (p1 < leftmargin) p1 = leftmargin; while (p1 < endp) *p1++ = SPACEGLYPH; /* Don't draw vertical bars if we're using scroll bars. They're @@ -2470,10 +2487,10 @@ if (len > width) len = width; for (i = 0; i < len; i++) - startp[i] = p[i]; + leftmargin[i] = p[i]; /* Bug in SunOS 4.1.1 compiler requires this intermediate variable. */ - arrow_end = (startp - desired_glyphs->glyphs[vpos]) + len; + arrow_end = (leftmargin - desired_glyphs->glyphs[vpos]) + len; if (desired_glyphs->used[vpos] < arrow_end) desired_glyphs->used[vpos] = arrow_end;