From: Eli Zaretskii Date: Tue, 20 Mar 2018 17:05:21 +0000 (+0200) Subject: Avoid redisplay problems with too wide wrap-prefix X-Git-Tag: emacs-26.1.90~413 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=9804482b026144237f10ae2fdd8a35e3fecb6d12;p=emacs.git Avoid redisplay problems with too wide wrap-prefix * src/xdisp.c (display_line): Avoid looping in redisplay when wrap-prefix is set to a too-wide stretch of whitespace. (Bug#30432) (cherry picked from commit 2a1fe08307402d6217d073f8ab7737750d253dd4) --- diff --git a/src/xdisp.c b/src/xdisp.c index 6ca115087c3..2142d771e2d 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -21957,9 +21957,24 @@ display_line (struct it *it, int cursor_vpos) break; } + /* Detect overly-wide wrap-prefixes made of (space ...) display + properties. When such a wrap prefix reaches past the right + margin of the window, we need to avoid the call to + set_iterator_to_next below, so that it->line_wrap is left at + its TRUNCATE value wisely set by handle_line_prefix. + Otherwise, set_iterator_to_next will pop the iterator stack, + restore it->line_wrap, and redisplay might infloop. */ + bool overwide_wrap_prefix = + CONSP (it->object) && EQ (XCAR (it->object), Qspace) + && it->sp > 0 && it->method == GET_FROM_STRETCH + && it->current_x >= it->last_visible_x + && it->continuation_lines_width > 0 + && it->line_wrap == TRUNCATE && it->stack[0].line_wrap != TRUNCATE; + /* Proceed with next display element. Note that this skips over lines invisible because of selective display. */ - set_iterator_to_next (it, true); + if (!overwide_wrap_prefix) + set_iterator_to_next (it, true); /* If we truncate lines, we are done when the last displayed glyphs reach past the right margin of the window. */