vt(4): reset scrollback and cursor position after clearing history buffer

r361601 implemented basic support for cleaing the console history buffer.
But after clearing the history buffer, it's not especially useful to be
able to scroll back through that buffer, or for the cursor position to
remain at (very likely) the bottom of the screen.

PR:		224436
Reviewed by:	emaste
Differential Revision:	https://reviews.freebsd.org/D25079
This commit is contained in:
Jason A. Harmening 2020-06-02 01:21:48 +00:00
parent ec45be6c36
commit ef1eabca5d
3 changed files with 30 additions and 3 deletions

View File

@ -433,17 +433,22 @@ vtbuf_do_clearhistory(struct vt_buf *vb)
vtbuf_do_fill(vb, &rect, VTBUF_SPACE_CHAR(ch)); vtbuf_do_fill(vb, &rect, VTBUF_SPACE_CHAR(ch));
} }
void static void
vtbuf_init_early(struct vt_buf *vb) vtbuf_reset_scrollback(struct vt_buf *vb)
{ {
vb->vb_flags |= VBF_CURSOR;
vb->vb_roffset = 0; vb->vb_roffset = 0;
vb->vb_curroffset = 0; vb->vb_curroffset = 0;
vb->vb_mark_start.tp_row = 0; vb->vb_mark_start.tp_row = 0;
vb->vb_mark_start.tp_col = 0; vb->vb_mark_start.tp_col = 0;
vb->vb_mark_end.tp_row = 0; vb->vb_mark_end.tp_row = 0;
vb->vb_mark_end.tp_col = 0; vb->vb_mark_end.tp_col = 0;
}
void
vtbuf_init_early(struct vt_buf *vb)
{
vb->vb_flags |= VBF_CURSOR;
vtbuf_reset_scrollback(vb);
vtbuf_init_rows(vb); vtbuf_init_rows(vb);
vtbuf_do_clearhistory(vb); vtbuf_do_clearhistory(vb);
vtbuf_make_undirty(vb); vtbuf_make_undirty(vb);
@ -477,6 +482,8 @@ vtbuf_clearhistory(struct vt_buf *vb)
{ {
VTBUF_LOCK(vb); VTBUF_LOCK(vb);
vtbuf_do_clearhistory(vb); vtbuf_do_clearhistory(vb);
vtbuf_reset_scrollback(vb);
vb->vb_flags &= ~VBF_HISTORY_FULL;
VTBUF_UNLOCK(vb); VTBUF_UNLOCK(vb);
} }

View File

@ -2332,6 +2332,16 @@ vtterm_ioctl(struct terminal *tm, u_long cmd, caddr_t data,
return (0); return (0);
case CONS_CLRHIST: case CONS_CLRHIST:
vtbuf_clearhistory(&vd->vd_curwindow->vw_buf); vtbuf_clearhistory(&vd->vd_curwindow->vw_buf);
/*
* Invalidate the entire visible window; it is not guaranteed
* that this operation will be immediately followed by a scroll
* event, so it would otherwise be possible for prior artifacts
* to remain visible.
*/
VT_LOCK(vd);
vd->vd_flags |= VDF_INVALID;
VT_UNLOCK(vd);
vt_resume_flush_timer(vd->vd_curwindow, 0);
return (0); return (0);
case CONS_GET: case CONS_GET:
/* XXX */ /* XXX */

View File

@ -480,6 +480,16 @@ termtty_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
tty_unlock(tp); tty_unlock(tp);
error = tm->tm_class->tc_ioctl(tm, cmd, data, td); error = tm->tm_class->tc_ioctl(tm, cmd, data, td);
tty_lock(tp); tty_lock(tp);
if ((error == 0) && (cmd == CONS_CLRHIST)) {
/*
* Scrollback history has been successfully cleared,
* so reset the cursor position to the top left of the screen.
*/
teken_pos_t p;
p.tp_row = 0;
p.tp_col = 0;
teken_set_cursor(&tm->tm_emulator, &p);
}
return (error); return (error);
} }