vt(4): Adjust the cursor position after changing the window size
A new terminal_set_cursor() is added: it wraps the existing teken_set_cursor() function. In vtbuf_grow(), the cursor position is adjusted at the end of the function. In vt_change_font(), we call terminal_set_cursor() just after terminal_set_winsize_blank(), while the terminal is mute. This fixes a bug where, after loading a kernel video driver which increases the terminal window size, the cursor remains at its old position, in other words, in the middle of the display content. PR: 194421 MFC after: 1 week
This commit is contained in:
parent
120021745e
commit
035cb01fbb
@ -562,6 +562,18 @@ vtbuf_grow(struct vt_buf *vb, const term_pos_t *p, unsigned int history_size)
|
||||
vb->vb_roffset = vb->vb_curroffset;
|
||||
}
|
||||
|
||||
/* Adjust cursor position. */
|
||||
if (vb->vb_cursor.tp_col > p->tp_col - 1)
|
||||
/*
|
||||
* Move cursor to the last column, in case its previous
|
||||
* position is outside of the new screen area.
|
||||
*/
|
||||
vb->vb_cursor.tp_col = p->tp_col - 1;
|
||||
|
||||
if (vb->vb_curroffset > 0 || vb->vb_cursor.tp_row > p->tp_row - 1)
|
||||
/* Move cursor to the last line on the screen. */
|
||||
vb->vb_cursor.tp_row = p->tp_row - 1;
|
||||
|
||||
vtbuf_make_undirty(vb);
|
||||
VTBUF_UNLOCK(vb);
|
||||
|
||||
|
@ -1532,6 +1532,7 @@ vt_change_font(struct vt_window *vw, struct vt_font *vf)
|
||||
terminal_mute(tm, 1);
|
||||
vtbuf_grow(&vw->vw_buf, &size, vw->vw_buf.vb_history_size);
|
||||
terminal_set_winsize_blank(tm, &wsz, 0, NULL);
|
||||
terminal_set_cursor(tm, &vw->vw_buf.vb_cursor);
|
||||
terminal_mute(tm, 0);
|
||||
|
||||
/* Actually apply the font to the current window. */
|
||||
|
@ -189,6 +189,13 @@ terminal_maketty(struct terminal *tm, const char *fmt, ...)
|
||||
terminal_sync_ttysize(tm);
|
||||
}
|
||||
|
||||
void
|
||||
terminal_set_cursor(struct terminal *tm, const term_pos_t *pos)
|
||||
{
|
||||
|
||||
teken_set_cursor(&tm->tm_emulator, pos);
|
||||
}
|
||||
|
||||
void
|
||||
terminal_set_winsize_blank(struct terminal *tm, const struct winsize *size,
|
||||
int blank, const term_attr_t *attr)
|
||||
|
@ -207,6 +207,7 @@ struct terminal {
|
||||
|
||||
struct terminal *terminal_alloc(const struct terminal_class *tc, void *softc);
|
||||
void terminal_maketty(struct terminal *tm, const char *fmt, ...);
|
||||
void terminal_set_cursor(struct terminal *tm, const term_pos_t *pos);
|
||||
void terminal_set_winsize_blank(struct terminal *tm,
|
||||
const struct winsize *size, int blank, const term_attr_t *attr);
|
||||
void terminal_set_winsize(struct terminal *tm, const struct winsize *size);
|
||||
|
Loading…
Reference in New Issue
Block a user