When the terminal size is reduced horizontally, don't truncate lines to the new

width, so that if the same lines are later increased in size the content
reappears.
pull/1/head
Nicholas Marriott 2009-07-09 22:48:20 +00:00
parent 5f2f07ed8a
commit 58361eb965
1 changed files with 9 additions and 34 deletions

View File

@ -122,44 +122,19 @@ void
screen_resize_x(struct screen *s, u_int sx)
{
struct grid *gd = s->grid;
const struct grid_cell *gc;
const struct grid_utf8 *gu;
u_int xx, yy;
if (sx == 0)
fatalx("zero size");
/* If getting larger, not much to do. */
if (sx > screen_size_x(s)) {
gd->sx = sx;
return;
}
/* If getting smaller, nuke any data in lines over the new size. */
for (yy = gd->hsize; yy < gd->hsize + screen_size_y(s); yy++) {
/*
* If the character after the last is wide or padding, remove
* it and any leading padding.
*/
gc = &grid_default_cell;
for (xx = sx; xx > 0; xx--) {
gc = grid_peek_cell(gd, xx - 1, yy);
if (!(gc->flags & GRID_FLAG_PADDING))
break;
grid_set_cell(gd, xx - 1, yy, &grid_default_cell);
}
if (xx > 0 && xx != sx && gc->flags & GRID_FLAG_UTF8) {
gu = grid_peek_utf8(gd, xx - 1, yy);
if (gu->width > 1) {
grid_set_cell(
gd, xx - 1, yy, &grid_default_cell);
}
}
/* Reduce the line size. */
grid_reduce_line(gd, yy, sx);
}
/*
* Treat resizing horizontally simply: just ensure the cursor is
* on-screen and change the size. Don't bother to truncate any lines -
* then the data should be accessible if the size is then incrased.
*
* The only potential wrinkle is if UTF-8 double-width characters are
* left in the last column, but UTF-8 terminals should deal with this
* sanely.
*/
if (s->cx >= sx)
s->cx = sx - 1;
gd->sx = sx;