Commit 166e930d authored by Eli Zaretskii's avatar Eli Zaretskii

Fix display of truncated R2L lines on a TTY.

 xdisp.c (display_line): Fix prepending of truncation glyphs to R2L rows.
 (insert_left_trunc_glyphs): Support addition of left truncation glyphs
 to R2L rows.
parent 017ea819
......@@ -4,6 +4,9 @@
(display_line): Use it.
(extend_face_to_end_of_line): In almost-filled rows, extend only
if the row is R2L and not continued.
(display_line): Fix prepending of truncation glyphs to R2L rows.
(insert_left_trunc_glyphs): Support addition of left truncation
glyphs to R2L rows.
2010-04-27 Eli Zaretskii <eliz@gnu.org>
......
......@@ -16739,24 +16739,61 @@ insert_left_trunc_glyphs (it)
produce_special_glyphs (&truncate_it, IT_TRUNCATION);
/* Overwrite glyphs from IT with truncation glyphs. */
from = truncate_it.glyph_row->glyphs[TEXT_AREA];
end = from + truncate_it.glyph_row->used[TEXT_AREA];
to = it->glyph_row->glyphs[TEXT_AREA];
toend = to + it->glyph_row->used[TEXT_AREA];
while (from < end)
*to++ = *from++;
/* There may be padding glyphs left over. Overwrite them too. */
while (to < toend && CHAR_GLYPH_PADDING_P (*to))
if (!it->glyph_row->reversed_p)
{
from = truncate_it.glyph_row->glyphs[TEXT_AREA];
end = from + truncate_it.glyph_row->used[TEXT_AREA];
to = it->glyph_row->glyphs[TEXT_AREA];
toend = to + it->glyph_row->used[TEXT_AREA];
while (from < end)
*to++ = *from++;
/* There may be padding glyphs left over. Overwrite them too. */
while (to < toend && CHAR_GLYPH_PADDING_P (*to))
{
from = truncate_it.glyph_row->glyphs[TEXT_AREA];
while (from < end)
*to++ = *from++;
}
if (to > toend)
it->glyph_row->used[TEXT_AREA] = to - it->glyph_row->glyphs[TEXT_AREA];
}
else
{
/* In R2L rows, overwrite the last (rightmost) glyphs, and do
that back to front. */
end = truncate_it.glyph_row->glyphs[TEXT_AREA];
from = end + truncate_it.glyph_row->used[TEXT_AREA] - 1;
toend = it->glyph_row->glyphs[TEXT_AREA];
to = toend + it->glyph_row->used[TEXT_AREA] - 1;
while (from >= end && to >= toend)
*to-- = *from--;
while (to >= toend && CHAR_GLYPH_PADDING_P (*to))
{
from =
truncate_it.glyph_row->glyphs[TEXT_AREA]
+ truncate_it.glyph_row->used[TEXT_AREA] - 1;
while (from >= end && to >= toend)
*to-- = *from--;
}
if (from >= end)
{
/* Need to free some room before prepending additional
glyphs. */
int move_by = from - end + 1;
struct glyph *g0 = it->glyph_row->glyphs[TEXT_AREA];
struct glyph *g = g0 + it->glyph_row->used[TEXT_AREA] - 1;
if (to > toend)
it->glyph_row->used[TEXT_AREA] = to - it->glyph_row->glyphs[TEXT_AREA];
for ( ; g >= g0; g--)
g[move_by] = *g;
while (from >= end)
*to-- = *from--;
it->glyph_row->used[TEXT_AREA] += move_by;
}
}
}
......@@ -17938,10 +17975,14 @@ display_line (it)
for (i = 0; i < row->used[TEXT_AREA]; i++)
if (!CHAR_GLYPH_PADDING_P (row->glyphs[TEXT_AREA][i]))
break;
/* Remove padding glyphs at the front of ROW, to
/* Remove any padding glyphs at the front of ROW, to
make room for the truncation glyphs we will be
adding below. */
unproduce_glyphs (it, i);
adding below. The loop below always inserts at
least one truncation glyph, so also remove the
last glyph added to ROW. */
unproduce_glyphs (it, i + 1);
/* Adjust i for the loop below. */
i = row->used[TEXT_AREA] - (i + 1);
}
for (n = row->used[TEXT_AREA]; i < n; ++i)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment