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)
This commit is contained in:
parent
db64a866f6
commit
2a1fe08307
1 changed files with 16 additions and 1 deletions
17
src/xdisp.c
17
src/xdisp.c
|
@ -21969,9 +21969,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. */
|
||||
|
|
Loading…
Add table
Reference in a new issue