From 48091966cb49d634b02562b137343c47d0710ad8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 22 Mar 2020 11:14:56 +0100 Subject: [PATCH] render: resize: update saved 'normal' cursor if we're in alt screen When resizing in alt mode, we never updated the saved 'normal' cursor. This meant that when we exited alt mode, the cursor would be positioned where it was in the old pre-resize/reflow grid. Now, we update the saved cursor in the same way we update visible cursor. The result is that when we exit the alt screen, the cursor is restored to the same coordinates it would have been updated to had the resize been done in the 'normal' screen. --- CHANGELOG.md | 2 ++ render.c | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0700e018..3a310289 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,8 @@ * Sixel images moved or deleted on window resize. * Cursor sometimes incorrectly restored on exit from alternate screen. * 'Underline' cursor being invisible on underlined text. +* Restored cursor position in 'normal' screen when window was resized + while in 'alt' screen. ### Security diff --git a/render.c b/render.c index 26ca92d3..d8a26060 100644 --- a/render.c +++ b/render.c @@ -1645,6 +1645,19 @@ maybe_resize(struct terminal *term, int width, int height, bool force) cursor_row, min(term->cursor.point.col, term->cols - 1)); + /* If in alt screen, update the saved 'normal' cursor too */ + if (term->grid == &term->alt) { + int cursor_row = last_normal_row - term->normal.offset; + + while (cursor_row < 0) + cursor_row += term->grid->num_rows; + + term->alt_saved_cursor.lcf = false; + term->alt_saved_cursor.point.row = cursor_row; + term->alt_saved_cursor.point.col = min( + term->alt_saved_cursor.point.col, term->cols - 1); + } + term->render.last_cursor.cell = NULL; damage_view: