summaryrefslogtreecommitdiffstats
path: root/window.c
diff options
context:
space:
mode:
authornicm <nicm>2019-06-09 06:50:24 +0000
committernicm <nicm>2019-06-09 06:50:24 +0000
commit915097d312319a463fa4333c9bdf728b8dd6d39d (patch)
treea745d360165d5c2e66c4f97f9eb7d22384a89b5e /window.c
parent43796bf131c4d7d3a44185c10e5d75860869af0d (diff)
Exiting alternate screen mode should restore cursor position and
attributes even if already outside alternate screen mode. GitHub issue 1789.
Diffstat (limited to 'window.c')
-rw-r--r--window.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/window.c b/window.c
index 1d83c247..781ff30c 100644
--- a/window.c
+++ b/window.c
@@ -804,6 +804,8 @@ window_pane_create(struct window *w, u_int sx, u_int sy, u_int hlimit)
wp->pipe_event = NULL;
wp->saved_grid = NULL;
+ wp->saved_cx = UINT_MAX;
+ wp->saved_cy = UINT_MAX;
style_set(&wp->style, &grid_default_cell);
@@ -962,10 +964,25 @@ window_pane_alternate_off(struct window_pane *wp, struct grid_cell *gc,
struct screen *s = &wp->base;
u_int sx, sy;
- if (wp->saved_grid == NULL)
- return;
if (!options_get_number(wp->window->options, "alternate-screen"))
return;
+
+ /*
+ * Restore the cursor position and cell. This happens even if not
+ * currently in the alternate screen.
+ */
+ if (cursor && wp->saved_cx != UINT_MAX && wp->saved_cy != UINT_MAX) {
+ s->cx = wp->saved_cx;
+ if (s->cx > screen_size_x(s) - 1)
+ s->cx = screen_size_x(s) - 1;
+ s->cy = wp->saved_cy;
+ if (s->cy > screen_size_y(s) - 1)
+ s->cy = screen_size_y(s) - 1;
+ memcpy(gc, &wp->saved_cell, sizeof *gc);
+ }
+
+ if (wp->saved_grid == NULL)
+ return;
sx = screen_size_x(s);
sy = screen_size_y(s);
@@ -976,17 +993,8 @@ window_pane_alternate_off(struct window_pane *wp, struct grid_cell *gc,
if (sy > wp->saved_grid->sy)
screen_resize(s, sx, wp->saved_grid->sy, 1);
- /* Restore the grid, cursor position and cell. */
+ /* Restore the saved grid. */
grid_duplicate_lines(s->grid, screen_hsize(s), wp->saved_grid, 0, sy);
- if (cursor)
- s->cx = wp->saved_cx;
- if (s->cx > screen_size_x(s) - 1)
- s->cx = screen_size_x(s) - 1;
- if (cursor)
- s->cy = wp->saved_cy;
- if (s->cy > screen_size_y(s) - 1)
- s->cy = screen_size_y(s) - 1;
- memcpy(gc, &wp->saved_cell, sizeof *gc);
/*
* Turn history back on (so resize can use it) and then resize back to