From 8be8016a7653a202666fb1cb46a91d881cbd3ac2 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sun, 12 Jul 2009 17:03:11 +0000 Subject: [PATCH] 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. --- screen.c | 45 ++++++++++----------------------------------- 1 file changed, 10 insertions(+), 35 deletions(-) diff --git a/screen.c b/screen.c index 40274cdd..a5d7161d 100644 --- a/screen.c +++ b/screen.c @@ -1,4 +1,4 @@ -/* $Id: screen.c,v 1.90 2009-07-08 18:03:03 nicm Exp $ */ +/* $Id: screen.c,v 1.91 2009-07-12 17:03:11 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -121,44 +121,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;