diff --git a/gems/include/terminal/character_screen.h b/gems/include/terminal/character_screen.h index cb84562854..1a2c3acc51 100644 --- a/gems/include/terminal/character_screen.h +++ b/gems/include/terminal/character_screen.h @@ -181,6 +181,11 @@ namespace Terminal { */ virtual void sgr(int) = 0; + /** + * Turn of all attributes + */ + virtual void sgr0() = 0; + /** * Save current cursor position */ diff --git a/gems/include/terminal/decoder.h b/gems/include/terminal/decoder.h index 7cb20e4df3..3c458db26a 100644 --- a/gems/include/terminal/decoder.h +++ b/gems/include/terminal/decoder.h @@ -343,12 +343,49 @@ namespace Terminal { _screen.setaf(p2 - 30); return true; } + if ((p1 == 0 && p2 == 10)) { + /* turn of all attributes */ + _screen.sgr0(); + return true; + } return false; case 'R': return (_screen.u6(p1, p2), true); default: return false; } } + bool _handle_esc_seq_7() + { + /* + * All six-element escape sequences have the form + * \E[;; + */ + + if ((_escape_stack[0].value != '[') + || (_escape_stack[1].type != Escape_stack::Entry::NUMBER) + || (_escape_stack[2].value != ';') + || (_escape_stack[3].type != Escape_stack::Entry::NUMBER) + || (_escape_stack[4].value != ';') + || (_escape_stack[5].type != Escape_stack::Entry::NUMBER)) + return false; + + int const command = _escape_stack[6].value; + + switch (command) { + case 'm': + + /* + * Currently returning true w/o actually handling the + * sequence + */ + PDBG("Sequence '[X;Y;Zm' is not implemented"); + return true; + default: return false; + } + + return true; + } + public: Decoder(Character_screen &screen) @@ -425,7 +462,8 @@ namespace Terminal { || ((_escape_stack.num_elem() == 2) && _handle_esc_seq_2()) || ((_escape_stack.num_elem() == 3) && _handle_esc_seq_3()) || ((_escape_stack.num_elem() == 4) && _handle_esc_seq_4()) - || ((_escape_stack.num_elem() == 5) && _handle_esc_seq_5())) + || ((_escape_stack.num_elem() == 5) && _handle_esc_seq_5()) + || ((_escape_stack.num_elem() == 7) && _handle_esc_seq_7())) _enter_state_idle(); }; }; diff --git a/gems/src/server/terminal/main.cc b/gems/src/server/terminal/main.cc index a6811a81bc..c57f7e8c73 100644 --- a/gems/src/server/terminal/main.cc +++ b/gems/src/server/terminal/main.cc @@ -619,6 +619,11 @@ class Char_cell_array_character_screen : public Terminal::Character_screen _color_index = DEFAULT_COLOR_INDEX; } + void sgr0() + { + sgr(0); + } + void sc() { PDBG("not implemented"); diff --git a/gems/src/test/terminal_decoder/main.cc b/gems/src/test/terminal_decoder/main.cc index 5d1054da6e..f315c111c4 100644 --- a/gems/src/test/terminal_decoder/main.cc +++ b/gems/src/test/terminal_decoder/main.cc @@ -185,6 +185,10 @@ class Static_character_screen : public Terminal::Character_screen { } + virtual void sgr0() + { + } + void sc() { }