diff --git a/csi.c b/csi.c index e833d2a7..c755d0af 100644 --- a/csi.c +++ b/csi.c @@ -1141,15 +1141,11 @@ csi_dispatch(struct terminal *term, uint8_t final) } case 's': - term->grid->saved_cursor = term->grid->cursor; - term->vt.saved_attrs = term->vt.attrs; - term->saved_charsets = term->charsets; + term_save_cursor(term); break; case 'u': term_restore_cursor(term, &term->grid->saved_cursor); - term->vt.attrs = term->vt.saved_attrs; - term->charsets = term->saved_charsets; break; case 't': { diff --git a/terminal.c b/terminal.c index c05325ee..13f7a6f7 100644 --- a/terminal.c +++ b/terminal.c @@ -2254,13 +2254,25 @@ term_reset_view(struct terminal *term) term_damage_view(term); } +void +term_save_cursor(struct terminal *term) +{ + term->grid->saved_cursor = term->grid->cursor; + term->vt.saved_attrs = term->vt.attrs; + term->saved_charsets = term->charsets; +} + void term_restore_cursor(struct terminal *term, const struct cursor *cursor) { 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->grid->cursor.lcf = cursor->lcf; + + term->vt.attrs = term->vt.saved_attrs; + term->charsets = term->saved_charsets; } void diff --git a/terminal.h b/terminal.h index 19fff0e2..5c3aacd7 100644 --- a/terminal.h +++ b/terminal.h @@ -595,6 +595,7 @@ void term_reverse_index(struct terminal *term); void term_arm_blink_timer(struct terminal *term); +void term_save_cursor(struct terminal *term); void term_restore_cursor(struct terminal *term, const struct cursor *cursor); void term_visual_focus_in(struct terminal *term); diff --git a/vt.c b/vt.c index e8e10b2f..cf5eef3d 100644 --- a/vt.c +++ b/vt.c @@ -366,15 +366,11 @@ action_esc_dispatch(struct terminal *term, uint8_t final) case 0: switch (final) { case '7': - term->grid->saved_cursor = term->grid->cursor; - term->vt.saved_attrs = term->vt.attrs; - term->saved_charsets = term->charsets; + term_save_cursor(term); break; case '8': term_restore_cursor(term, &term->grid->saved_cursor); - term->vt.attrs = term->vt.saved_attrs; - term->charsets = term->saved_charsets; break; case 'c':