mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-17 22:05:22 -05:00
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:
parent
6eeea06cc0
commit
1006608093
5 changed files with 11 additions and 10 deletions
|
|
@ -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
6
csi.c
|
|
@ -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);
|
||||
|
|
|
|||
10
terminal.c
10
terminal.c
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
2
vt.c
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue