From b7d1c40460862129e471c5a31e8fb9e0d6185d1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Mon, 12 Nov 2012 16:25:01 +0100 Subject: [PATCH] Terminal: add bg color handling + PDBG Set the right bg color instead of using a dimmed version of the fg color. The colors are stored in the first 6 bits of the color index. Thereby the first 3 bits contain the fg and the second 3 bits the bg color. The debug message in _handle_esc_seq5() now shows the sequence in question. Fixes #495. --- gems/include/terminal/decoder.h | 5 +++- gems/src/server/terminal/main.cc | 41 ++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/gems/include/terminal/decoder.h b/gems/include/terminal/decoder.h index 3c458db26a..ad8918d3de 100644 --- a/gems/include/terminal/decoder.h +++ b/gems/include/terminal/decoder.h @@ -369,6 +369,9 @@ namespace Terminal { || (_escape_stack[5].type != Escape_stack::Entry::NUMBER)) return false; + int const p1 = _escape_stack[1].value; + int const p2 = _escape_stack[2].value; + int const p3 = _escape_stack[3].value; int const command = _escape_stack[6].value; switch (command) { @@ -378,7 +381,7 @@ namespace Terminal { * Currently returning true w/o actually handling the * sequence */ - PDBG("Sequence '[X;Y;Zm' is not implemented"); + PDBG("Sequence '[%d;%d;%d%c' is not implemented", p1, p2, p3, command); return true; default: return false; } diff --git a/gems/src/server/terminal/main.cc b/gems/src/server/terminal/main.cc index ea47ecac97..c96f5f3386 100644 --- a/gems/src/server/terminal/main.cc +++ b/gems/src/server/terminal/main.cc @@ -97,32 +97,36 @@ struct Char_cell { unsigned char attr; unsigned char ascii; + unsigned char color; enum { ATTR_COLIDX_MASK = 0x07, ATTR_CURSOR = 0x10, ATTR_INVERSE = 0x20, ATTR_HIGHLIGHT = 0x40 }; + enum { COLOR_MASK = 0x3f }; /* 111111 */ + Char_cell() : attr(0), ascii(0) { } Char_cell(unsigned char c, Font_family::Face f, int colidx, bool inv, bool highlight) : - attr(f | (colidx & ATTR_COLIDX_MASK) - | (inv ? ATTR_INVERSE : 0) + attr(f | (inv ? ATTR_INVERSE : 0) | (highlight ? ATTR_HIGHLIGHT : 0)), - ascii(c) + ascii(c), + color(colidx & COLOR_MASK) { } Font_family::Face font_face() const { return (Font_family::Face)(attr & 0x3); } - int colidx() const { return attr & ATTR_COLIDX_MASK; } - bool inverse() const { return attr & ATTR_INVERSE; } - bool highlight() const { return attr & ATTR_HIGHLIGHT; } + int colidx_fg() const { return color & ATTR_COLIDX_MASK; } + int colidx_bg() const { return (color >> 3) & ATTR_COLIDX_MASK; } + bool inverse() const { return attr & ATTR_INVERSE; } + bool highlight() const { return attr & ATTR_HIGHLIGHT; } Color fg_color() const { - Color col = color_palette[colidx() + (highlight() ? 8 : 0)]; + Color col = color_palette[colidx_fg() + (highlight() ? 8 : 0)]; if (inverse()) col = Color(col.r/2, col.g/2, col.b/2); @@ -132,12 +136,12 @@ struct Char_cell Color bg_color() const { - Color col = color_palette[colidx() + (highlight() ? 8 : 0)]; + Color col = color_palette[colidx_bg() + (highlight() ? 8 : 0)]; if (inverse()) return Color((col.r + 255)/2, (col.g + 255)/2, (col.b + 255)/2); - else - return Color(0, 0, 0); + + return col; } void set_cursor() { attr |= ATTR_CURSOR; } @@ -158,6 +162,10 @@ class Char_cell_array_character_screen : public Terminal::Character_screen Cell_array &_char_cell_array; Terminal::Boundary _boundary; Terminal::Position _cursor_pos; + /** + * Color index contains the fg color in the first 3 bits + * and the bg color in the second 3 bits (0bbbbfff). + */ int _color_index; bool _inverse; bool _highlight; @@ -166,7 +174,7 @@ class Char_cell_array_character_screen : public Terminal::Character_screen int _region_end; int _tab_size; - enum { DEFAULT_COLOR_INDEX = 7, DEFAULT_TAB_SIZE = 8 }; + enum { DEFAULT_COLOR_INDEX_BG = 0, DEFAULT_COLOR_INDEX = 7, DEFAULT_TAB_SIZE = 8 }; struct Cursor_guard { @@ -415,7 +423,7 @@ class Char_cell_array_character_screen : public Terminal::Character_screen void op() { - _color_index = DEFAULT_COLOR_INDEX; + _color_index = DEFAULT_COLOR_INDEX | (DEFAULT_COLOR_INDEX_BG << 3); } void rc() { PDBG("not implemented"); } @@ -426,12 +434,15 @@ class Char_cell_array_character_screen : public Terminal::Character_screen void setab(int value) { - _inverse = (value != 0); + //_inverse = (value != 0); + _color_index &= ~0x38; /* clear 111000 */ + _color_index |= (((value == 9) ? DEFAULT_COLOR_INDEX_BG : value) << 3); } void setaf(int value) { - _color_index = value; + _color_index &= ~0x7; /* clear 000111 */ + _color_index |= (value == 9) ? DEFAULT_COLOR_INDEX : value; } void sgr(int value) @@ -441,7 +452,7 @@ class Char_cell_array_character_screen : public Terminal::Character_screen /* sgr 0 is the command to reset all attributes, including color */ if (value == 0) - _color_index = DEFAULT_COLOR_INDEX; + _color_index = DEFAULT_COLOR_INDEX | (DEFAULT_COLOR_INDEX_BG << 3); } void sgr0()