From 838d8676809ccfa97a655c6b4630b185e254fe43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Fri, 1 Jun 2012 11:36:52 +0200 Subject: [PATCH] Terminal: add explicit handling of sgr0 + sgr seq sgr0 is currently implemented as a wrapper of sgr(0) which seems to work fine. For now we accept but ignore certain sgr sequences like for example [0;10;1m which is generated by lynx even when using TERM=linux (I am not sure yet if that's actually valid at all). --- gems/include/terminal/character_screen.h | 5 +++ gems/include/terminal/decoder.h | 40 +++++++++++++++++++++++- gems/src/server/terminal/main.cc | 5 +++ gems/src/test/terminal_decoder/main.cc | 4 +++ 4 files changed, 53 insertions(+), 1 deletion(-) 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() { }