diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2021-01-26 09:32:53 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2021-01-26 09:32:53 +0000 |
commit | 86e5ef8260b84ff4c8d2fff563677a7ccde36f6d (patch) | |
tree | 8c6a3ed09194dc178f9329ead470b3b11d838079 | |
parent | 52d3b8e52c870256bd16f75255f80a59b49537ed (diff) |
Always resize the original screen before copying when exiting the
alternate screen, GitHub issue 2536.
-rw-r--r-- | usr.bin/tmux/screen.c | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/usr.bin/tmux/screen.c b/usr.bin/tmux/screen.c index 6189e9cd1ae..d5dfbffdcad 100644 --- a/usr.bin/tmux/screen.c +++ b/usr.bin/tmux/screen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: screen.c,v 1.68 2020/10/30 11:33:41 nicm Exp $ */ +/* $OpenBSD: screen.c,v 1.69 2021/01/26 09:32:52 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> @@ -574,7 +574,14 @@ screen_alternate_on(struct screen *s, struct grid_cell *gc, int cursor) void screen_alternate_off(struct screen *s, struct grid_cell *gc, int cursor) { - u_int sx, sy; + u_int sx = screen_size_x(s), sy = screen_size_y(s); + + /* + * If the current size is different, temporarily resize to the old size + * before copying back. + */ + if (s->saved_grid != NULL) + screen_resize(s, s->saved_grid->sx, s->saved_grid->sy, 1); /* * Restore the cursor position and cell. This happens even if not @@ -582,29 +589,23 @@ screen_alternate_off(struct screen *s, struct grid_cell *gc, int cursor) */ if (cursor && s->saved_cx != UINT_MAX && s->saved_cy != UINT_MAX) { s->cx = s->saved_cx; - if (s->cx > screen_size_x(s) - 1) - s->cx = screen_size_x(s) - 1; s->cy = s->saved_cy; - if (s->cy > screen_size_y(s) - 1) - s->cy = screen_size_y(s) - 1; if (gc != NULL) memcpy(gc, &s->saved_cell, sizeof *gc); } - if (s->saved_grid == NULL) + /* If not in the alternate screen, do nothing more. */ + if (s->saved_grid == NULL) { + if (s->cx > screen_size_x(s) - 1) + s->cx = screen_size_x(s) - 1; + if (s->cy > screen_size_y(s) - 1) + s->cy = screen_size_y(s) - 1; return; - sx = screen_size_x(s); - sy = screen_size_y(s); - - /* - * If the current size is bigger, temporarily resize to the old size - * before copying back. - */ - if (sy > s->saved_grid->sy) - screen_resize(s, sx, s->saved_grid->sy, 1); + } /* Restore the saved grid. */ - grid_duplicate_lines(s->grid, screen_hsize(s), s->saved_grid, 0, sy); + grid_duplicate_lines(s->grid, screen_hsize(s), s->saved_grid, 0, + s->saved_grid->sy); /* * Turn history back on (so resize can use it) and then resize back to @@ -612,9 +613,13 @@ screen_alternate_off(struct screen *s, struct grid_cell *gc, int cursor) */ if (s->saved_flags & GRID_HISTORY) s->grid->flags |= GRID_HISTORY; - if (sy > s->saved_grid->sy || sx != s->saved_grid->sx) - screen_resize(s, sx, sy, 1); + screen_resize(s, sx, sy, 1); grid_destroy(s->saved_grid); s->saved_grid = NULL; + + if (s->cx > screen_size_x(s) - 1) + s->cx = screen_size_x(s) - 1; + if (s->cy > screen_size_y(s) - 1) + s->cy = screen_size_y(s) - 1; } |