vt(4): Add support for `vidcontrol -C'

Extract scrollback buffer initialization into a common routine, used both
during vt(4) init and in handling the CONS_CLRHIST ioctl.

PR:		224436
Reviewed by:	emaste
Differential Revision:	https://reviews.freebsd.org/D24815
This commit is contained in:
Jason A. Harmening 2020-05-28 21:22:30 +00:00
parent 0b229c80ae
commit 98f7cf022c
3 changed files with 30 additions and 12 deletions

View File

@ -231,6 +231,7 @@ void vtbuf_scroll_mode(struct vt_buf *vb, int yes);
void vtbuf_dirty(struct vt_buf *vb, const term_rect_t *area);
void vtbuf_undirty(struct vt_buf *, term_rect_t *);
void vtbuf_sethistory_size(struct vt_buf *, unsigned int);
void vtbuf_clearhistory(struct vt_buf *);
int vtbuf_iscursor(const struct vt_buf *vb, int row, int col);
void vtbuf_cursor_visibility(struct vt_buf *, int);
#ifndef SC_NO_CUTPASTE

View File

@ -416,13 +416,26 @@ vtbuf_init_rows(struct vt_buf *vb)
vb->vb_rows[r] = &vb->vb_buffer[r * vb->vb_scr_size.tp_col];
}
void
vtbuf_init_early(struct vt_buf *vb)
static void
vtbuf_do_clearhistory(struct vt_buf *vb)
{
term_rect_t rect;
const teken_attr_t *a;
term_char_t c;
term_char_t ch;
a = teken_get_curattr(&vb->vb_terminal->tm_emulator);
ch = TCOLOR_FG(a->ta_fgcolor) | TCOLOR_BG(a->ta_bgcolor);
rect.tr_begin.tp_row = rect.tr_begin.tp_col = 0;
rect.tr_end.tp_col = vb->vb_scr_size.tp_col;
rect.tr_end.tp_row = vb->vb_history_size;
vtbuf_do_fill(vb, &rect, VTBUF_SPACE_CHAR(ch));
}
void
vtbuf_init_early(struct vt_buf *vb)
{
vb->vb_flags |= VBF_CURSOR;
vb->vb_roffset = 0;
vb->vb_curroffset = 0;
@ -432,14 +445,7 @@ vtbuf_init_early(struct vt_buf *vb)
vb->vb_mark_end.tp_col = 0;
vtbuf_init_rows(vb);
rect.tr_begin.tp_row = rect.tr_begin.tp_col = 0;
rect.tr_end.tp_col = vb->vb_scr_size.tp_col;
rect.tr_end.tp_row = vb->vb_history_size;
a = teken_get_curattr(&vb->vb_terminal->tm_emulator);
c = TCOLOR_FG((term_char_t)a->ta_fgcolor) |
TCOLOR_BG((term_char_t)a->ta_bgcolor);
vtbuf_do_fill(vb, &rect, VTBUF_SPACE_CHAR(c));
vtbuf_do_clearhistory(vb);
vtbuf_make_undirty(vb);
if ((vb->vb_flags & VBF_MTX_INIT) == 0) {
mtx_init(&vb->vb_lock, "vtbuf", NULL, MTX_SPIN);
@ -466,6 +472,14 @@ vtbuf_init(struct vt_buf *vb, const term_pos_t *p)
vtbuf_init_early(vb);
}
void
vtbuf_clearhistory(struct vt_buf *vb)
{
VTBUF_LOCK(vb);
vtbuf_do_clearhistory(vb);
VTBUF_UNLOCK(vb);
}
void
vtbuf_sethistory_size(struct vt_buf *vb, unsigned int size)
{

View File

@ -2329,7 +2329,10 @@ skip_thunk:
if (*(int *)data != vd->vd_curwindow->vw_buf.vb_history_size)
vtbuf_sethistory_size(&vd->vd_curwindow->vw_buf,
*(int *)data);
return 0;
return (0);
case CONS_CLRHIST:
vtbuf_clearhistory(&vd->vd_curwindow->vw_buf);
return (0);
case CONS_GET:
/* XXX */
*(int *)data = M_CG640x480;