diff --git a/Terminal/Terminal.cpp b/Terminal/Terminal.cpp index b98d44d6b9..e41ffb7547 100644 --- a/Terminal/Terminal.cpp +++ b/Terminal/Terminal.cpp @@ -1,5 +1,6 @@ #include "Terminal.h" #include +#include #include #include #include @@ -291,13 +292,13 @@ void Terminal::escape$K(const Vector& params) break; case 1: // FIXME: Clear from cursor to beginning of screen. - notImplemented(); + unimplemented_escape(); break; case 2: - notImplemented(); + unimplemented_escape(); break; default: - notImplemented(); + unimplemented_escape(); break; } } @@ -309,12 +310,19 @@ void Terminal::escape$J(const Vector& params) mode = params[0]; switch (mode) { case 0: - // FIXME: Clear from cursor to end of screen. - notImplemented(); + // Clear from cursor to end of screen. + for (int i = m_cursor_column; i < m_columns; ++i) { + put_character_at(m_cursor_row, i, ' '); + } + for (int row = m_cursor_row + 1; row < m_rows; ++row) { + for (int column = 0; column < m_columns; ++column) { + put_character_at(row, column, ' '); + } + } break; case 1: // FIXME: Clear from cursor to beginning of screen. - notImplemented(); + unimplemented_escape(); break; case 2: clear(); @@ -324,13 +332,14 @@ void Terminal::escape$J(const Vector& params) clear(); break; default: - notImplemented(); + unimplemented_escape(); break; } } void Terminal::execute_xterm_command() { + m_final = '@'; bool ok; unsigned value = parseUInt(String((const char*)m_xterm_param1.data(), m_xterm_param1.size()), ok); if (ok) { @@ -339,7 +348,7 @@ void Terminal::execute_xterm_command() set_window_title(String((const char*)m_xterm_param2.data(), m_xterm_param2.size())); break; default: - notImplemented(); + unimplemented_xterm_escape(); break; } } @@ -349,6 +358,7 @@ void Terminal::execute_xterm_command() void Terminal::execute_escape_sequence(byte final) { + m_final = final; auto paramparts = String((const char*)m_parameters.data(), m_parameters.size()).split(';'); Vector params; for (auto& parampart : paramparts) { @@ -417,6 +427,7 @@ void Terminal::put_character_at(unsigned row, unsigned column, byte ch) ASSERT(column < columns()); line(row).characters[column] = ch; line(row).attributes[column] = m_current_attribute; + line(row).dirty = true; } void Terminal::on_char(byte ch) @@ -530,6 +541,36 @@ void Terminal::on_char(byte ch) } } +void Terminal::inject_string(const String& str) +{ + for (size_t i = 0; i < str.length(); ++i) + on_char(str[i]); +} + +void Terminal::unimplemented_escape() +{ + StringBuilder builder; + builder.appendf("((Unimplemented escape: %c", m_final); + if (!m_parameters.is_empty()) { + builder.append(" parameters:"); + for (size_t i = 0; i < m_parameters.size(); ++i) + builder.append((char)m_parameters[i]); + } + if (!m_intermediates.is_empty()) { + builder.append(" intermediates:"); + for (size_t i = 0; i < m_intermediates.size(); ++i) + builder.append((char)m_intermediates[i]); + } + builder.append("))"); + inject_string(builder.build()); +} + +void Terminal::unimplemented_xterm_escape() +{ + auto message = String::format("((Unimplemented xterm escape: %c))\n", m_final); + inject_string(message); +} + void Terminal::set_size(word columns, word rows) { m_columns = columns; diff --git a/Terminal/Terminal.h b/Terminal/Terminal.h index ed43ac5e8b..7bc816ae73 100644 --- a/Terminal/Terminal.h +++ b/Terminal/Terminal.h @@ -30,6 +30,10 @@ private: void invalidate_window(const Rect& = Rect()); void set_window_title(const String&); + void inject_string(const String&); + void unimplemented_escape(); + void unimplemented_xterm_escape(); + void escape$A(const Vector&); void escape$B(const Vector&); void escape$C(const Vector&); @@ -109,6 +113,7 @@ private: Vector m_intermediates; Vector m_xterm_param1; Vector m_xterm_param2; + byte m_final { 0 }; byte* m_horizontal_tabs { nullptr }; bool m_belling { false };