diff options
author | Jan Engelhardt <jengelh@computergmbh.de> | 2008-04-29 03:59:46 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-29 11:06:06 -0400 |
commit | c9e587abfdec2c2aaa55fab83bcb4972e2f84f9b (patch) | |
tree | 86ab335b702608c90e9ce3dd759c1c96247a60d5 /drivers/video/console/fbcon.c | |
parent | 3265e66b1825942c6e0fc457986cdf941a5f7d37 (diff) |
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>
Diffstat (limited to 'drivers/video/console/fbcon.c')
-rw-r--r-- | drivers/video/console/fbcon.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 8eda7b60df8f..ad31983b43eb 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
@@ -1881,7 +1881,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | |||
1881 | scr_memsetw((unsigned short *) (vc->vc_origin + | 1881 | scr_memsetw((unsigned short *) (vc->vc_origin + |
1882 | vc->vc_size_row * | 1882 | vc->vc_size_row * |
1883 | (b - count)), | 1883 | (b - count)), |
1884 | vc->vc_video_erase_char, | 1884 | vc->vc_scrl_erase_char, |
1885 | vc->vc_size_row * count); | 1885 | vc->vc_size_row * count); |
1886 | return 1; | 1886 | return 1; |
1887 | break; | 1887 | break; |
@@ -1953,7 +1953,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | |||
1953 | scr_memsetw((unsigned short *) (vc->vc_origin + | 1953 | scr_memsetw((unsigned short *) (vc->vc_origin + |
1954 | vc->vc_size_row * | 1954 | vc->vc_size_row * |
1955 | (b - count)), | 1955 | (b - count)), |
1956 | vc->vc_video_erase_char, | 1956 | vc->vc_scrl_erase_char, |
1957 | vc->vc_size_row * count); | 1957 | vc->vc_size_row * count); |
1958 | return 1; | 1958 | return 1; |
1959 | } | 1959 | } |
@@ -1972,7 +1972,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | |||
1972 | scr_memsetw((unsigned short *) (vc->vc_origin + | 1972 | scr_memsetw((unsigned short *) (vc->vc_origin + |
1973 | vc->vc_size_row * | 1973 | vc->vc_size_row * |
1974 | t), | 1974 | t), |
1975 | vc->vc_video_erase_char, | 1975 | vc->vc_scrl_erase_char, |
1976 | vc->vc_size_row * count); | 1976 | vc->vc_size_row * count); |
1977 | return 1; | 1977 | return 1; |
1978 | break; | 1978 | break; |
@@ -2042,7 +2042,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | |||
2042 | scr_memsetw((unsigned short *) (vc->vc_origin + | 2042 | scr_memsetw((unsigned short *) (vc->vc_origin + |
2043 | vc->vc_size_row * | 2043 | vc->vc_size_row * |
2044 | t), | 2044 | t), |
2045 | vc->vc_video_erase_char, | 2045 | vc->vc_scrl_erase_char, |
2046 | vc->vc_size_row * count); | 2046 | vc->vc_size_row * count); |
2047 | return 1; | 2047 | return 1; |
2048 | } | 2048 | } |