vt(4): The offset to center the text area is per-window now
The previous global offset, based on the last loaded font, had no meaning for other windows. This caused a shifted text area, often partly out-of-screen. MFC after: 1 week
This commit is contained in:
parent
b740f63f23
commit
ccd5615a33
@ -556,13 +556,13 @@ vga_bitblt_one_text_pixels_block(struct vt_device *vd,
|
||||
memset(pattern_2colors, 0, sizeof(pattern_2colors));
|
||||
memset(pattern_ncolors, 0, sizeof(pattern_ncolors));
|
||||
|
||||
if (i < vd->vd_offset.tp_col) {
|
||||
if (i < vw->vw_offset.tp_col) {
|
||||
/*
|
||||
* i is in the margin used to center the text area on
|
||||
* the screen.
|
||||
*/
|
||||
|
||||
i = vd->vd_offset.tp_col;
|
||||
i = vw->vw_offset.tp_col;
|
||||
}
|
||||
|
||||
while (i < x + VT_VGA_PIXELS_BLOCK) {
|
||||
@ -573,8 +573,8 @@ vga_bitblt_one_text_pixels_block(struct vt_device *vd,
|
||||
* While here, record what colors it uses.
|
||||
*/
|
||||
|
||||
col = (i - vd->vd_offset.tp_col) / vf->vf_width;
|
||||
row = (y - vd->vd_offset.tp_row) / vf->vf_height;
|
||||
col = (i - vw->vw_offset.tp_col) / vf->vf_width;
|
||||
row = (y - vw->vw_offset.tp_row) / vf->vf_height;
|
||||
|
||||
c = VTBUF_GET_FIELD(vb, row, col);
|
||||
src = vtfont_lookup(vf, c);
|
||||
@ -605,11 +605,11 @@ vga_bitblt_one_text_pixels_block(struct vt_device *vd,
|
||||
* character.
|
||||
*/
|
||||
|
||||
src_x = i - (col * vf->vf_width + vd->vd_offset.tp_col);
|
||||
src_x = i - (col * vf->vf_width + vw->vw_offset.tp_col);
|
||||
x_count = min(
|
||||
(col + 1) * vf->vf_width + vd->vd_offset.tp_col,
|
||||
(col + 1) * vf->vf_width + vw->vw_offset.tp_col,
|
||||
x + VT_VGA_PIXELS_BLOCK);
|
||||
x_count -= col * vf->vf_width + vd->vd_offset.tp_col;
|
||||
x_count -= col * vf->vf_width + vw->vw_offset.tp_col;
|
||||
x_count -= src_x;
|
||||
|
||||
/* Copy a portion of the character. */
|
||||
@ -632,8 +632,8 @@ vga_bitblt_one_text_pixels_block(struct vt_device *vd,
|
||||
* to mark the area dirty.
|
||||
*/
|
||||
cursor = vd->vd_mcursor;
|
||||
mx = vd->vd_moldx + vd->vd_offset.tp_col;
|
||||
my = vd->vd_moldy + vd->vd_offset.tp_row;
|
||||
mx = vd->vd_moldx + vw->vw_offset.tp_col;
|
||||
my = vd->vd_moldy + vw->vw_offset.tp_row;
|
||||
if (cursor_displayed &&
|
||||
((mx >= x && x + VT_VGA_PIXELS_BLOCK - 1 >= mx) ||
|
||||
(mx < x && mx + cursor->width >= x)) &&
|
||||
@ -720,10 +720,10 @@ vga_bitblt_text_gfxmode(struct vt_device *vd, const struct vt_window *vw,
|
||||
|
||||
col = area->tr_begin.tp_col;
|
||||
row = area->tr_begin.tp_row;
|
||||
x1 = (int)((col * vf->vf_width + vd->vd_offset.tp_col)
|
||||
x1 = (int)((col * vf->vf_width + vw->vw_offset.tp_col)
|
||||
/ VT_VGA_PIXELS_BLOCK)
|
||||
* VT_VGA_PIXELS_BLOCK;
|
||||
y1 = row * vf->vf_height + vd->vd_offset.tp_row;
|
||||
y1 = row * vf->vf_height + vw->vw_offset.tp_row;
|
||||
|
||||
/*
|
||||
* Compute the bottom right pixel position, again, aligned with
|
||||
@ -735,11 +735,11 @@ vga_bitblt_text_gfxmode(struct vt_device *vd, const struct vt_window *vw,
|
||||
|
||||
col = area->tr_end.tp_col;
|
||||
row = area->tr_end.tp_row;
|
||||
x2 = (int)((col * vf->vf_width + vd->vd_offset.tp_col
|
||||
x2 = (int)((col * vf->vf_width + vw->vw_offset.tp_col
|
||||
+ VT_VGA_PIXELS_BLOCK - 1)
|
||||
/ VT_VGA_PIXELS_BLOCK)
|
||||
* VT_VGA_PIXELS_BLOCK;
|
||||
y2 = row * vf->vf_height + vd->vd_offset.tp_row;
|
||||
y2 = row * vf->vf_height + vw->vw_offset.tp_row;
|
||||
|
||||
/*
|
||||
* Clip the area to the screen size.
|
||||
|
@ -136,7 +136,6 @@ struct vt_device {
|
||||
vt_axis_t vd_moldx; /* (?) Mouse X as of last redraw. */
|
||||
vt_axis_t vd_moldy; /* (?) Mouse Y as of last redraw. */
|
||||
uint32_t vd_mstate; /* (?) Mouse state. */
|
||||
term_pos_t vd_offset; /* (?) Pixel offset. */
|
||||
vt_axis_t vd_width; /* (?) Screen width. */
|
||||
vt_axis_t vd_height; /* (?) Screen height. */
|
||||
struct mtx vd_lock; /* Per-device lock. */
|
||||
@ -258,6 +257,7 @@ struct vt_window {
|
||||
struct terminal *vw_terminal; /* (c) Terminal. */
|
||||
struct vt_buf vw_buf; /* (u) Screen buffer. */
|
||||
struct vt_font *vw_font; /* (d) Graphical font. */
|
||||
term_pos_t vw_offset; /* (?) Pixel offset. */
|
||||
unsigned int vw_number; /* (c) Window number. */
|
||||
int vw_kbdmode; /* (?) Keyboard mode. */
|
||||
char *vw_kbdsq; /* Escape sequence queue*/
|
||||
|
@ -837,8 +837,8 @@ vt_bitblt_char(struct vt_device *vd, struct vt_font *vf, term_char_t c,
|
||||
* Fonts may not always be able to fill the entire
|
||||
* screen.
|
||||
*/
|
||||
top = row * vf->vf_height + vd->vd_offset.tp_row;
|
||||
left = col * vf->vf_width + vd->vd_offset.tp_col;
|
||||
top = row * vf->vf_height + vd->vd_curwindow->vw_offset.tp_row;
|
||||
left = col * vf->vf_width + vd->vd_curwindow->vw_offset.tp_col;
|
||||
|
||||
vd->vd_driver->vd_bitbltchr(vd, src, NULL, 0, top, left,
|
||||
vf->vf_width, vf->vf_height, fg, bg);
|
||||
@ -973,8 +973,8 @@ vt_flush(struct vt_device *vd)
|
||||
|
||||
vd->vd_driver->vd_bitbltchr(vd,
|
||||
vd->vd_mcursor->map, vd->vd_mcursor->mask, bpl,
|
||||
vd->vd_offset.tp_row + vd->vd_my,
|
||||
vd->vd_offset.tp_col + vd->vd_mx,
|
||||
vw->vw_offset.tp_row + vd->vd_my,
|
||||
vw->vw_offset.tp_col + vd->vd_mx,
|
||||
w, h, vd->vd_mcursor_fg, vd->vd_mcursor_bg);
|
||||
}
|
||||
#endif
|
||||
@ -1248,8 +1248,8 @@ vt_change_font(struct vt_window *vw, struct vt_font *vf)
|
||||
vt_termsize(vd, vf, &size);
|
||||
vt_winsize(vd, vf, &wsz);
|
||||
/* Save offset to font aligned area. */
|
||||
vd->vd_offset.tp_col = (vd->vd_width % vf->vf_width) / 2;
|
||||
vd->vd_offset.tp_row = (vd->vd_height % vf->vf_height) / 2;
|
||||
vw->vw_offset.tp_col = (vd->vd_width % vf->vf_width) / 2;
|
||||
vw->vw_offset.tp_row = (vd->vd_height % vf->vf_height) / 2;
|
||||
|
||||
/* Grow the screen buffer and terminal. */
|
||||
terminal_mute(tm, 1);
|
||||
@ -1287,8 +1287,8 @@ vt_set_border(struct vt_window *vw, struct vt_font *vf, term_color_t c)
|
||||
|
||||
x = vd->vd_width - 1;
|
||||
y = vd->vd_height - 1;
|
||||
off_x = vd->vd_offset.tp_col;
|
||||
off_y = vd->vd_offset.tp_row;
|
||||
off_x = vw->vw_offset.tp_col;
|
||||
off_y = vw->vw_offset.tp_row;
|
||||
|
||||
/* Top bar. */
|
||||
if (off_y > 0)
|
||||
|
Loading…
Reference in New Issue
Block a user