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:
parent
63e59c8ca5
commit
fe06fcc595
1 changed files with 12 additions and 8 deletions
20
src/xdisp.c
20
src/xdisp.c
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue