Avoid infinite hscrolling loops when line numbers are displayed

* src/xdisp.c (maybe_produce_line_number): Don't produce line
numbers if we don't have enough screen estate.  (Bug#32351)
This commit is contained in:
Eli Zaretskii 2018-08-28 14:11:12 +03:00
parent 63e59c8ca5
commit fe06fcc595

View file

@ -21166,8 +21166,12 @@ maybe_produce_line_number (struct it *it)
an L2R paragraph. */ an L2R paragraph. */
tem_it.bidi_it.resolved_level = 2; tem_it.bidi_it.resolved_level = 2;
/* We must leave space for 2 glyphs for continuation and truncation,
and at least one glyph for buffer text. */
int width_limit =
tem_it.last_visible_x - tem_it.first_visible_x
- 3 * FRAME_COLUMN_WIDTH (it->f);
/* Produce glyphs for the line number in a scratch glyph_row. */ /* Produce glyphs for the line number in a scratch glyph_row. */
int n_glyphs_before;
for (const char *p = lnum_buf; *p; p++) for (const char *p = lnum_buf; *p; p++)
{ {
/* For continuation lines and lines after ZV, instead of a line /* For continuation lines and lines after ZV, instead of a line
@ -21191,18 +21195,18 @@ maybe_produce_line_number (struct it *it)
else else
tem_it.c = tem_it.char_to_display = *p; tem_it.c = tem_it.char_to_display = *p;
tem_it.len = 1; tem_it.len = 1;
n_glyphs_before = scratch_glyph_row.used[TEXT_AREA];
/* Make sure these glyphs will have a "position" of -1. */ /* Make sure these glyphs will have a "position" of -1. */
SET_TEXT_POS (tem_it.position, -1, -1); SET_TEXT_POS (tem_it.position, -1, -1);
PRODUCE_GLYPHS (&tem_it); PRODUCE_GLYPHS (&tem_it);
/* Stop producing glyphs if we don't have enough space on /* Stop producing glyphs, and refrain from producing the line
this line. FIXME: should we refrain from producing the number, if we don't have enough space on this line. */
line number at all in that case? */ if (tem_it.current_x >= width_limit)
if (tem_it.current_x > tem_it.last_visible_x)
{ {
scratch_glyph_row.used[TEXT_AREA] = n_glyphs_before; it->lnum_width = 0;
break; it->lnum_pixel_width = 0;
bidi_unshelve_cache (itdata, false);
return;
} }
} }