提交 93f78da4 编写于 作者: L Linus Torvalds

Revert "vt: fix background color on line feed"

This reverts commit c9e587ab, and the
subsequent commits that fixed it up:

 - afa9b649 "fbcon: prevent cursor disappearance after switching to 512
   character font"

 - d850a2fa "vt/fbcon: fix background color on line feed"

 - 7fe3915a "vt/fbcon: update scrl_erase_char after 256/512-glyph font
   switch"

by request of Alan Cox. Quoth Alan:
  "Unfortunately it's wrong and its been causing breakages because
   various apps like ncurses expect our previous (and correct)
   behaviour."

Alexander sent out a similar patch.
Requested-by: NAlan Cox <alan@lxorguk.ukuu.org.uk>
Tested-by: NJan Engelhardt <jengelh@medozas.de>
Cc: Alexander V. Lukyanov <lav@netis.ru>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 43096597
...@@ -301,7 +301,7 @@ static void scrup(struct vc_data *vc, unsigned int t, unsigned int b, int nr) ...@@ -301,7 +301,7 @@ static void scrup(struct vc_data *vc, unsigned int t, unsigned int b, int nr)
d = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t); d = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t);
s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * (t + nr)); s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * (t + nr));
scr_memmovew(d, s, (b - t - nr) * vc->vc_size_row); scr_memmovew(d, s, (b - t - nr) * vc->vc_size_row);
scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_scrl_erase_char, scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_video_erase_char,
vc->vc_size_row * nr); vc->vc_size_row * nr);
} }
...@@ -319,7 +319,7 @@ static void scrdown(struct vc_data *vc, unsigned int t, unsigned int b, int nr) ...@@ -319,7 +319,7 @@ static void scrdown(struct vc_data *vc, unsigned int t, unsigned int b, int nr)
s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t); s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t);
step = vc->vc_cols * nr; step = vc->vc_cols * nr;
scr_memmovew(s + step, s, (b - t - nr) * vc->vc_size_row); scr_memmovew(s + step, s, (b - t - nr) * vc->vc_size_row);
scr_memsetw(s, vc->vc_scrl_erase_char, 2 * step); scr_memsetw(s, vc->vc_video_erase_char, 2 * step);
} }
static void do_update_region(struct vc_data *vc, unsigned long start, int count) static void do_update_region(struct vc_data *vc, unsigned long start, int count)
...@@ -434,7 +434,6 @@ static void update_attr(struct vc_data *vc) ...@@ -434,7 +434,6 @@ static void update_attr(struct vc_data *vc)
vc->vc_blink, vc->vc_underline, vc->vc_blink, vc->vc_underline,
vc->vc_reverse ^ vc->vc_decscnm, vc->vc_italic); vc->vc_reverse ^ vc->vc_decscnm, vc->vc_italic);
vc->vc_video_erase_char = (build_attr(vc, vc->vc_color, 1, vc->vc_blink, 0, vc->vc_decscnm, 0) << 8) | ' '; vc->vc_video_erase_char = (build_attr(vc, vc->vc_color, 1, vc->vc_blink, 0, vc->vc_decscnm, 0) << 8) | ' ';
vc->vc_scrl_erase_char = (build_attr(vc, vc->vc_def_color, 1, false, false, vc->vc_decscnm, false) << 8) | ' ';
} }
/* Note: inverting the screen twice should revert to the original state */ /* Note: inverting the screen twice should revert to the original state */
......
...@@ -1855,8 +1855,6 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, ...@@ -1855,8 +1855,6 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
struct display *p = &fb_display[vc->vc_num]; struct display *p = &fb_display[vc->vc_num];
int scroll_partial = info->flags & FBINFO_PARTIAL_PAN_OK; int scroll_partial = info->flags & FBINFO_PARTIAL_PAN_OK;
unsigned short saved_ec;
int ret;
if (fbcon_is_inactive(vc, info)) if (fbcon_is_inactive(vc, info))
return -EINVAL; return -EINVAL;
...@@ -1869,11 +1867,6 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, ...@@ -1869,11 +1867,6 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
* whole screen (prevents flicker). * whole screen (prevents flicker).
*/ */
saved_ec = vc->vc_video_erase_char;
vc->vc_video_erase_char = vc->vc_scrl_erase_char;
ret = 0;
switch (dir) { switch (dir) {
case SM_UP: case SM_UP:
if (count > vc->vc_rows) /* Maximum realistic size */ if (count > vc->vc_rows) /* Maximum realistic size */
...@@ -1890,9 +1883,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, ...@@ -1890,9 +1883,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
scr_memsetw((unsigned short *) (vc->vc_origin + scr_memsetw((unsigned short *) (vc->vc_origin +
vc->vc_size_row * vc->vc_size_row *
(b - count)), (b - count)),
vc->vc_scrl_erase_char, vc->vc_video_erase_char,
vc->vc_size_row * count); vc->vc_size_row * count);
ret = 1; return 1;
break; break;
case SCROLL_WRAP_MOVE: case SCROLL_WRAP_MOVE:
...@@ -1962,10 +1955,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, ...@@ -1962,10 +1955,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
scr_memsetw((unsigned short *) (vc->vc_origin + scr_memsetw((unsigned short *) (vc->vc_origin +
vc->vc_size_row * vc->vc_size_row *
(b - count)), (b - count)),
vc->vc_scrl_erase_char, vc->vc_video_erase_char,
vc->vc_size_row * count); vc->vc_size_row * count);
ret = 1; return 1;
break;
} }
break; break;
...@@ -1982,9 +1974,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, ...@@ -1982,9 +1974,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
scr_memsetw((unsigned short *) (vc->vc_origin + scr_memsetw((unsigned short *) (vc->vc_origin +
vc->vc_size_row * vc->vc_size_row *
t), t),
vc->vc_scrl_erase_char, vc->vc_video_erase_char,
vc->vc_size_row * count); vc->vc_size_row * count);
ret = 1; return 1;
break; break;
case SCROLL_WRAP_MOVE: case SCROLL_WRAP_MOVE:
...@@ -2052,15 +2044,12 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, ...@@ -2052,15 +2044,12 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
scr_memsetw((unsigned short *) (vc->vc_origin + scr_memsetw((unsigned short *) (vc->vc_origin +
vc->vc_size_row * vc->vc_size_row *
t), t),
vc->vc_scrl_erase_char, vc->vc_video_erase_char,
vc->vc_size_row * count); vc->vc_size_row * count);
ret = 1; return 1;
break;
} }
break;
} }
vc->vc_video_erase_char = saved_ec; return 0;
return ret;
} }
...@@ -2522,9 +2511,6 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, ...@@ -2522,9 +2511,6 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
c = vc->vc_video_erase_char; c = vc->vc_video_erase_char;
vc->vc_video_erase_char = vc->vc_video_erase_char =
((c & 0xfe00) >> 1) | (c & 0xff); ((c & 0xfe00) >> 1) | (c & 0xff);
c = vc->vc_scrl_erase_char;
vc->vc_scrl_erase_char =
((c & 0xFE00) >> 1) | (c & 0xFF);
vc->vc_attr >>= 1; vc->vc_attr >>= 1;
} }
} else if (!vc->vc_hi_font_mask && cnt == 512) { } else if (!vc->vc_hi_font_mask && cnt == 512) {
...@@ -2555,14 +2541,9 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, ...@@ -2555,14 +2541,9 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
if (vc->vc_can_do_color) { if (vc->vc_can_do_color) {
vc->vc_video_erase_char = vc->vc_video_erase_char =
((c & 0xff00) << 1) | (c & 0xff); ((c & 0xff00) << 1) | (c & 0xff);
c = vc->vc_scrl_erase_char;
vc->vc_scrl_erase_char =
((c & 0xFF00) << 1) | (c & 0xFF);
vc->vc_attr <<= 1; vc->vc_attr <<= 1;
} else { } else
vc->vc_video_erase_char = c & ~0x100; vc->vc_video_erase_char = c & ~0x100;
vc->vc_scrl_erase_char = c & ~0x100;
}
} }
} }
......
...@@ -533,7 +533,7 @@ static void mdacon_cursor(struct vc_data *c, int mode) ...@@ -533,7 +533,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) static int mdacon_scroll(struct vc_data *c, int t, int b, int dir, int lines)
{ {
u16 eattr = mda_convert_attr(c->vc_scrl_erase_char); u16 eattr = mda_convert_attr(c->vc_video_erase_char);
if (!lines) if (!lines)
return 0; return 0;
......
...@@ -170,12 +170,12 @@ static int sticon_scroll(struct vc_data *conp, int t, int b, int dir, int count) ...@@ -170,12 +170,12 @@ static int sticon_scroll(struct vc_data *conp, int t, int b, int dir, int count)
switch (dir) { switch (dir) {
case SM_UP: case SM_UP:
sti_bmove(sti, t + count, 0, t, 0, b - t - count, conp->vc_cols); 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_scrl_erase_char); sti_clear(sti, b - count, 0, count, conp->vc_cols, conp->vc_video_erase_char);
break; break;
case SM_DOWN: case SM_DOWN:
sti_bmove(sti, t, 0, t + count, 0, b - t - count, conp->vc_cols); 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_scrl_erase_char); sti_clear(sti, t, 0, count, conp->vc_cols, conp->vc_video_erase_char);
break; break;
} }
......
...@@ -1350,7 +1350,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir, ...@@ -1350,7 +1350,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
} else } else
c->vc_origin += delta; c->vc_origin += delta;
scr_memsetw((u16 *) (c->vc_origin + c->vc_screenbuf_size - scr_memsetw((u16 *) (c->vc_origin + c->vc_screenbuf_size -
delta), c->vc_scrl_erase_char, delta), c->vc_video_erase_char,
delta); delta);
} else { } else {
if (oldo - delta < vga_vram_base) { if (oldo - delta < vga_vram_base) {
...@@ -1363,7 +1363,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir, ...@@ -1363,7 +1363,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
} else } else
c->vc_origin -= delta; c->vc_origin -= delta;
c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size; c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;
scr_memsetw((u16 *) (c->vc_origin), c->vc_scrl_erase_char, scr_memsetw((u16 *) (c->vc_origin), c->vc_video_erase_char,
delta); delta);
} }
c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size; c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;
......
...@@ -53,7 +53,6 @@ struct vc_data { ...@@ -53,7 +53,6 @@ struct vc_data {
unsigned short vc_hi_font_mask; /* [#] Attribute set for upper 256 chars of font or 0 if not supported */ unsigned short vc_hi_font_mask; /* [#] Attribute set for upper 256 chars of font or 0 if not supported */
struct console_font vc_font; /* Current VC font set */ struct console_font vc_font; /* Current VC font set */
unsigned short vc_video_erase_char; /* Background erase character */ unsigned short vc_video_erase_char; /* Background erase character */
unsigned short vc_scrl_erase_char; /* Erase character for scroll */
/* VT terminal data */ /* VT terminal data */
unsigned int vc_state; /* Escape sequence parser state */ unsigned int vc_state; /* Escape sequence parser state */
unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current escape sequence */ unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current escape sequence */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册