You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
vt: fix background color on line feed
A command that causes a line feed while a background color is active, such as perl -e 'print "x" x 60, "\e[44m", "x" x 40, "\e[0m\n"' and perl -e 'print "x" x 40, "\e[44m\n", "x" x 40, "\e[0m\n"' causes the line that was started as a result of the line feed to be completely filled with the currently active background color instead of the default color. When scrolling, part of the current screen is memcpy'd/memmove'd to the new region, and the new line(s) that will appear as a result are cleared using memset. However, the lines are cleared with vc->vc_video_erase_char, causing them to be colored with the currently active background color. This is different from X11 terminal emulators which always paint the new lines with the default background color (e.g. `xterm -bg black`). The clear operation (\e[1J and \e[2J) also use vc_video_erase_char, so a new vc->vc_scrl_erase_char is introduced with contains the erase character used for scrolling, which is built from vc->vc_def_color instead of vc->vc_color. Signed-off-by: Jan Engelhardt <jengelh@computergmbh.de> Cc: "Antonino A. Daplas" <adaplas@pol.net> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
3265e66b18
commit
c9e587abfd
@@ -1881,7 +1881,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
|
||||
scr_memsetw((unsigned short *) (vc->vc_origin +
|
||||
vc->vc_size_row *
|
||||
(b - count)),
|
||||
vc->vc_video_erase_char,
|
||||
vc->vc_scrl_erase_char,
|
||||
vc->vc_size_row * count);
|
||||
return 1;
|
||||
break;
|
||||
@@ -1953,7 +1953,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
|
||||
scr_memsetw((unsigned short *) (vc->vc_origin +
|
||||
vc->vc_size_row *
|
||||
(b - count)),
|
||||
vc->vc_video_erase_char,
|
||||
vc->vc_scrl_erase_char,
|
||||
vc->vc_size_row * count);
|
||||
return 1;
|
||||
}
|
||||
@@ -1972,7 +1972,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
|
||||
scr_memsetw((unsigned short *) (vc->vc_origin +
|
||||
vc->vc_size_row *
|
||||
t),
|
||||
vc->vc_video_erase_char,
|
||||
vc->vc_scrl_erase_char,
|
||||
vc->vc_size_row * count);
|
||||
return 1;
|
||||
break;
|
||||
@@ -2042,7 +2042,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
|
||||
scr_memsetw((unsigned short *) (vc->vc_origin +
|
||||
vc->vc_size_row *
|
||||
t),
|
||||
vc->vc_video_erase_char,
|
||||
vc->vc_scrl_erase_char,
|
||||
vc->vc_size_row * count);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -531,7 +531,7 @@ static void mdacon_cursor(struct vc_data *c, int mode)
|
||||
|
||||
static int mdacon_scroll(struct vc_data *c, int t, int b, int dir, int lines)
|
||||
{
|
||||
u16 eattr = mda_convert_attr(c->vc_video_erase_char);
|
||||
u16 eattr = mda_convert_attr(c->vc_scrl_erase_char);
|
||||
|
||||
if (!lines)
|
||||
return 0;
|
||||
|
||||
@@ -170,12 +170,12 @@ static int sticon_scroll(struct vc_data *conp, int t, int b, int dir, int count)
|
||||
switch (dir) {
|
||||
case SM_UP:
|
||||
sti_bmove(sti, t + count, 0, t, 0, b - t - count, conp->vc_cols);
|
||||
sti_clear(sti, b - count, 0, count, conp->vc_cols, conp->vc_video_erase_char);
|
||||
sti_clear(sti, b - count, 0, count, conp->vc_cols, conp->vc_scrl_erase_char);
|
||||
break;
|
||||
|
||||
case SM_DOWN:
|
||||
sti_bmove(sti, t, 0, t + count, 0, b - t - count, conp->vc_cols);
|
||||
sti_clear(sti, t, 0, count, conp->vc_cols, conp->vc_video_erase_char);
|
||||
sti_clear(sti, t, 0, count, conp->vc_cols, conp->vc_scrl_erase_char);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -1350,7 +1350,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
|
||||
} else
|
||||
c->vc_origin += delta;
|
||||
scr_memsetw((u16 *) (c->vc_origin + c->vc_screenbuf_size -
|
||||
delta), c->vc_video_erase_char,
|
||||
delta), c->vc_scrl_erase_char,
|
||||
delta);
|
||||
} else {
|
||||
if (oldo - delta < vga_vram_base) {
|
||||
@@ -1363,7 +1363,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
|
||||
} else
|
||||
c->vc_origin -= delta;
|
||||
c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;
|
||||
scr_memsetw((u16 *) (c->vc_origin), c->vc_video_erase_char,
|
||||
scr_memsetw((u16 *) (c->vc_origin), c->vc_scrl_erase_char,
|
||||
delta);
|
||||
}
|
||||
c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;
|
||||
|
||||
Reference in New Issue
Block a user