Commit 4043ea22 authored by Sven Schnelle's avatar Sven Schnelle Committed by Heiko Carstens

s390/tty3270: add support for background color

3270 terminals support 8 background colors. Add the code to utilize
them. Unfortunately the line erase code need to be adjusted: Without
background colors, it was sufficient to just set the line length to
zero. With background colors, we need to put spaces with the correct
background color.
Signed-off-by: default avatarSven Schnelle <svens@linux.ibm.com>
Acked-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Tested-by: default avatarNiklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
parent c2e9375e
...@@ -42,8 +42,9 @@ static struct tty3270 *condev; ...@@ -42,8 +42,9 @@ static struct tty3270 *condev;
static struct raw3270_fn tty3270_fn; static struct raw3270_fn tty3270_fn;
struct tty3270_attribute { struct tty3270_attribute {
unsigned char highlight; /* Blink/reverse/underscore */ unsigned char highlight; /* Blink/reverse/underscore */
unsigned char f_color; /* Foreground color */ unsigned char f_color; /* Foreground color */
unsigned char b_color; /* Background color */
}; };
struct tty3270_cell { struct tty3270_cell {
...@@ -205,10 +206,11 @@ static void tty3270_update_status(struct tty3270 *tp) ...@@ -205,10 +206,11 @@ static void tty3270_update_status(struct tty3270 *tp)
static void tty3270_create_status(struct tty3270 *tp) static void tty3270_create_status(struct tty3270 *tp)
{ {
static const unsigned char blueprint[] = static const unsigned char blueprint[] = {
{ TO_SBA, 0, 0, TO_SF, TF_LOG, TO_SA, TAT_COLOR, TAC_GREEN, TO_SBA, 0, 0, TO_SF, TF_LOG, TO_SA, TAT_FGCOLOR, TAC_GREEN,
0, 0, 0, 0, 0, 0, 0, TO_SF, TF_LOG, TO_SA, TAT_COLOR, 0, 0, 0, 0, 0, 0, 0, TO_SF, TF_LOG, TO_SA, TAT_FGCOLOR,
TAC_RESET }; TAC_RESET
};
struct string *line; struct string *line;
unsigned int offset; unsigned int offset;
...@@ -302,9 +304,10 @@ static struct string *tty3270_alloc_string(struct tty3270 *tp, size_t size) ...@@ -302,9 +304,10 @@ static struct string *tty3270_alloc_string(struct tty3270 *tp, size_t size)
*/ */
static void tty3270_blank_line(struct tty3270 *tp) static void tty3270_blank_line(struct tty3270 *tp)
{ {
static const unsigned char blueprint[] = static const unsigned char blueprint[] = {
{ TO_SBA, 0, 0, TO_SA, TAT_EXTHI, TAX_RESET, TO_SBA, 0, 0, TO_SA, TAT_EXTHI, TAX_RESET,
TO_SA, TAT_COLOR, TAC_RESET, TO_RA, 0, 0, 0 }; TO_SA, TAT_FGCOLOR, TAC_RESET, TO_RA, 0, 0, 0,
};
struct string *s; struct string *s;
s = tty3270_alloc_string(tp, sizeof(blueprint)); s = tty3270_alloc_string(tp, sizeof(blueprint));
...@@ -1089,7 +1092,7 @@ static void tty3270_convert_line(struct tty3270 *tp, int line_nr) ...@@ -1089,7 +1092,7 @@ static void tty3270_convert_line(struct tty3270 *tp, int line_nr)
struct tty3270_cell *cell; struct tty3270_cell *cell;
struct string *s, *n; struct string *s, *n;
unsigned char highlight; unsigned char highlight;
unsigned char f_color; unsigned char f_color, b_color;
char *cp; char *cp;
int flen, i; int flen, i;
...@@ -1099,6 +1102,7 @@ static void tty3270_convert_line(struct tty3270 *tp, int line_nr) ...@@ -1099,6 +1102,7 @@ static void tty3270_convert_line(struct tty3270 *tp, int line_nr)
flen += line->len; flen += line->len;
highlight = TAX_RESET; highlight = TAX_RESET;
f_color = TAC_RESET; f_color = TAC_RESET;
b_color = TAC_RESET;
for (i = 0, cell = line->cells; i < line->len; i++, cell++) { for (i = 0, cell = line->cells; i < line->len; i++, cell++) {
if (cell->attributes.highlight != highlight) { if (cell->attributes.highlight != highlight) {
flen += 3; /* TO_SA to switch highlight. */ flen += 3; /* TO_SA to switch highlight. */
...@@ -1108,11 +1112,17 @@ static void tty3270_convert_line(struct tty3270 *tp, int line_nr) ...@@ -1108,11 +1112,17 @@ static void tty3270_convert_line(struct tty3270 *tp, int line_nr)
flen += 3; /* TO_SA to switch color. */ flen += 3; /* TO_SA to switch color. */
f_color = cell->attributes.f_color; f_color = cell->attributes.f_color;
} }
if (cell->attributes.b_color != b_color) {
flen += 3; /* TO_SA to switch color. */
b_color = cell->attributes.b_color;
}
} }
if (highlight != TAX_RESET) if (highlight != TAX_RESET)
flen += 3; /* TO_SA to reset hightlight. */ flen += 3; /* TO_SA to reset hightlight. */
if (f_color != TAC_RESET) if (f_color != TAC_RESET)
flen += 3; /* TO_SA to reset color. */ flen += 3; /* TO_SA to reset color. */
if (b_color != TAC_RESET)
flen += 3; /* TO_SA to reset color. */
if (line->len < tp->view.cols) if (line->len < tp->view.cols)
flen += 4; /* Postfix (TO_RA). */ flen += 4; /* Postfix (TO_RA). */
...@@ -1143,6 +1153,7 @@ static void tty3270_convert_line(struct tty3270 *tp, int line_nr) ...@@ -1143,6 +1153,7 @@ static void tty3270_convert_line(struct tty3270 *tp, int line_nr)
highlight = TAX_RESET; highlight = TAX_RESET;
f_color = TAC_RESET; f_color = TAC_RESET;
b_color = TAC_RESET;
for (i = 0, cell = line->cells; i < line->len; i++, cell++) { for (i = 0, cell = line->cells; i < line->len; i++, cell++) {
if (cell->attributes.highlight != highlight) { if (cell->attributes.highlight != highlight) {
*cp++ = TO_SA; *cp++ = TO_SA;
...@@ -1152,10 +1163,17 @@ static void tty3270_convert_line(struct tty3270 *tp, int line_nr) ...@@ -1152,10 +1163,17 @@ static void tty3270_convert_line(struct tty3270 *tp, int line_nr)
} }
if (cell->attributes.f_color != f_color) { if (cell->attributes.f_color != f_color) {
*cp++ = TO_SA; *cp++ = TO_SA;
*cp++ = TAT_COLOR; *cp++ = TAT_FGCOLOR;
*cp++ = cell->attributes.f_color; *cp++ = cell->attributes.f_color;
f_color = cell->attributes.f_color; f_color = cell->attributes.f_color;
} }
if (cell->attributes.b_color != b_color) {
*cp++ = TO_SA;
*cp++ = TAT_BGCOLOR;
*cp++ = cell->attributes.b_color;
b_color = cell->attributes.b_color;
}
*cp++ = cell->character; *cp++ = cell->character;
} }
if (highlight != TAX_RESET) { if (highlight != TAX_RESET) {
...@@ -1165,7 +1183,12 @@ static void tty3270_convert_line(struct tty3270 *tp, int line_nr) ...@@ -1165,7 +1183,12 @@ static void tty3270_convert_line(struct tty3270 *tp, int line_nr)
} }
if (f_color != TAC_RESET) { if (f_color != TAC_RESET) {
*cp++ = TO_SA; *cp++ = TO_SA;
*cp++ = TAT_COLOR; *cp++ = TAT_FGCOLOR;
*cp++ = TAC_RESET;
}
if (b_color != TAC_RESET) {
*cp++ = TO_SA;
*cp++ = TAT_BGCOLOR;
*cp++ = TAC_RESET; *cp++ = TAC_RESET;
} }
if (line->len < tp->view.cols) { if (line->len < tp->view.cols) {
...@@ -1229,6 +1252,7 @@ static void tty3270_reset_attributes(struct tty3270_attribute *attr) ...@@ -1229,6 +1252,7 @@ static void tty3270_reset_attributes(struct tty3270_attribute *attr)
{ {
attr->highlight = TAX_RESET; attr->highlight = TAX_RESET;
attr->f_color = TAC_RESET; attr->f_color = TAC_RESET;
attr->b_color = TAC_RESET;
} }
static void tty3270_reset_cell(struct tty3270 *tp, struct tty3270_cell *cell) static void tty3270_reset_cell(struct tty3270 *tp, struct tty3270_cell *cell)
...@@ -1309,29 +1333,36 @@ static void tty3270_erase_line(struct tty3270 *tp, int mode) ...@@ -1309,29 +1333,36 @@ static void tty3270_erase_line(struct tty3270 *tp, int mode)
{ {
struct tty3270_line *line; struct tty3270_line *line;
struct tty3270_cell *cell; struct tty3270_cell *cell;
int i; int i, start, end;
line = tp->screen + tp->cy; line = tp->screen + tp->cy;
switch (mode) { switch (mode) {
case 0: case 0:
line->len = tp->cx; start = tp->cx;
end = tp->view.cols;
break; break;
case 1: case 1:
for (i = 0; i < tp->cx; i++) { start = 0;
cell = line->cells + i; end = tp->cx;
cell->character = ' ';
cell->attributes.highlight = TAX_RESET;
cell->attributes.f_color = TAC_RESET;
}
if (line->len <= tp->cx)
line->len = tp->cx + 1;
break; break;
case 2: case 2:
line->len = 0; start = 0;
end = tp->view.cols;
break; break;
default: default:
return; return;
} }
for (i = start; i < end; i++) {
cell = line->cells + i;
tty3270_reset_cell(tp, cell);
cell->attributes.b_color = tp->attributes.b_color;
}
if (line->len <= end)
line->len = end;
tty3270_convert_line(tp, tp->cy); tty3270_convert_line(tp, tp->cy);
} }
...@@ -1376,7 +1407,7 @@ static void tty3270_erase_display(struct tty3270 *tp, int mode) ...@@ -1376,7 +1407,7 @@ static void tty3270_erase_display(struct tty3270 *tp, int mode)
*/ */
static void tty3270_set_attributes(struct tty3270 *tp) static void tty3270_set_attributes(struct tty3270 *tp)
{ {
static unsigned char f_colors[] = { static unsigned char colors[] = {
TAC_DEFAULT, TAC_RED, TAC_GREEN, TAC_YELLOW, TAC_BLUE, TAC_DEFAULT, TAC_RED, TAC_GREEN, TAC_YELLOW, TAC_BLUE,
TAC_PINK, TAC_TURQ, TAC_WHITE, 0, TAC_DEFAULT TAC_PINK, TAC_TURQ, TAC_WHITE, 0, TAC_DEFAULT
}; };
...@@ -1420,7 +1451,19 @@ static void tty3270_set_attributes(struct tty3270 *tp) ...@@ -1420,7 +1451,19 @@ static void tty3270_set_attributes(struct tty3270 *tp)
case 36: /* Cyan */ case 36: /* Cyan */
case 37: /* White */ case 37: /* White */
case 39: /* Black */ case 39: /* Black */
tp->attributes.f_color = f_colors[attr - 30]; tp->attributes.f_color = colors[attr - 30];
break;
/* Background color. */
case 40: /* Black */
case 41: /* Red */
case 42: /* Green */
case 43: /* Yellow */
case 44: /* Blue */
case 45: /* Magenta */
case 46: /* Cyan */
case 47: /* White */
case 49: /* Black */
tp->attributes.b_color = colors[attr - 40];
break; break;
} }
} }
...@@ -1433,10 +1476,20 @@ static inline int tty3270_getpar(struct tty3270 *tp, int ix) ...@@ -1433,10 +1476,20 @@ static inline int tty3270_getpar(struct tty3270 *tp, int ix)
static void tty3270_goto_xy(struct tty3270 *tp, int cx, int cy) static void tty3270_goto_xy(struct tty3270 *tp, int cx, int cy)
{ {
struct tty3270_line *line;
struct tty3270_cell *cell;
int max_cx = max(0, cx); int max_cx = max(0, cx);
int max_cy = max(0, cy); int max_cy = max(0, cy);
tp->cx = min_t(int, tp->view.cols - 1, max_cx); tp->cx = min_t(int, tp->view.cols - 1, max_cx);
line = tp->screen + tp->cy;
while (line->len < tp->cx) {
cell = line->cells + line->len;
cell->character = ' ';
cell->attributes = tp->attributes;
line->len++;
}
cy = min_t(int, tp->view.rows - 3, max_cy); cy = min_t(int, tp->view.rows - 3, max_cy);
if (cy != tp->cy) { if (cy != tp->cy) {
tty3270_convert_line(tp, tp->cy); tty3270_convert_line(tp, tp->cy);
......
...@@ -48,8 +48,9 @@ ...@@ -48,8 +48,9 @@
#define TAT_RESET 0x00 #define TAT_RESET 0x00
#define TAT_FIELD 0xc0 #define TAT_FIELD 0xc0
#define TAT_EXTHI 0x41 #define TAT_EXTHI 0x41
#define TAT_COLOR 0x42 #define TAT_FGCOLOR 0x42
#define TAT_CHARS 0x43 #define TAT_CHARS 0x43
#define TAT_BGCOLOR 0x45
#define TAT_TRANS 0x46 #define TAT_TRANS 0x46
/* Extended-Highlighting Bytes */ /* Extended-Highlighting Bytes */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment