alt-screen: use a custom 'saved' cursor when switching to alt screen

This fixes an issue where we failed to restore the cursor correctly
when exiting from the alternate screen, if the client had sent escapes
to save the cursor position while inside the alternate screen.

This was because we used the *same* storage for saving the cursor
position through escapes, as for saving it when entering the alternate
screen.

Fix by using a custom variable dedicated to normal <--> alt screen
switching.
This commit is contained in:
Daniel Eklöf 2020-03-16 12:00:25 +01:00
parent 6eeea06cc0
commit 1006608093
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
5 changed files with 11 additions and 10 deletions

View file

@ -28,6 +28,7 @@
### Fixed
* Sixel images moved or deleted on window resize.
* Cursor sometimes incorrectly restored on exit from alternate screen.
### Security

6
csi.c
View file

@ -761,7 +761,7 @@ csi_dispatch(struct terminal *term, uint8_t final)
break;
case 'u':
term_restore_cursor(term);
term_restore_cursor(term, &term->saved_cursor);
break;
case 't': {
@ -1014,7 +1014,7 @@ csi_dispatch(struct terminal *term, uint8_t final)
selection_cancel(term);
term->grid = &term->alt;
term->saved_cursor = term->cursor;
term->alt_saved_cursor = term->cursor;
term_cursor_to(term, term->cursor.point.row, term->cursor.point.col);
@ -1137,7 +1137,7 @@ csi_dispatch(struct terminal *term, uint8_t final)
selection_cancel(term);
term->grid = &term->normal;
term_restore_cursor(term);
term_restore_cursor(term, &term->alt_saved_cursor);
tll_free(term->alt.damage);
tll_free(term->alt.scroll_damage);

View file

@ -1120,7 +1120,7 @@ term_reset(struct terminal *term, bool hard)
if (term->grid == &term->alt) {
term->grid = &term->normal;
term_restore_cursor(term);
term_restore_cursor(term, &term->alt_saved_cursor);
selection_cancel(term);
}
@ -1645,12 +1645,12 @@ term_reset_view(struct terminal *term)
}
void
term_restore_cursor(struct terminal *term)
term_restore_cursor(struct terminal *term, const struct cursor *cursor)
{
int row = min(term->saved_cursor.point.row, term->rows - 1);
int col = min(term->saved_cursor.point.col, term->cols - 1);
int row = min(cursor->point.row, term->rows - 1);
int col = min(cursor->point.col, term->cols - 1);
term_cursor_to(term, row, col);
term->cursor.lcf = term->saved_cursor.lcf;
term->cursor.lcf = cursor->lcf;
}
void

View file

@ -486,7 +486,7 @@ void term_reverse_index(struct terminal *term);
void term_arm_blink_timer(struct terminal *term);
void term_restore_cursor(struct terminal *term);
void term_restore_cursor(struct terminal *term, const struct cursor *cursor);
void term_visual_focus_in(struct terminal *term);
void term_visual_focus_out(struct terminal *term);

2
vt.c
View file

@ -347,7 +347,7 @@ action_esc_dispatch(struct terminal *term, uint8_t final)
break;
case '8':
term_restore_cursor(term);
term_restore_cursor(term, &term->saved_cursor);
term->vt.attrs = term->vt.saved_attrs;
term->charsets = term->saved_charsets;
break;