Terminal: Implement 'J' escape "clear from cursor to end of screen."

This commit is contained in:
Andreas Kling 2019-01-30 21:04:49 +01:00
parent d1b805172d
commit f176af7cd1
Notes: sideshowbarker 2024-07-19 15:54:55 +09:00
2 changed files with 54 additions and 8 deletions

View file

@ -1,5 +1,6 @@
#include "Terminal.h"
#include <AK/AKString.h>
#include <AK/StringBuilder.h>
#include <SharedGraphics/Font.h>
#include <SharedGraphics/Painter.h>
#include <AK/StdLibExtras.h>
@ -291,13 +292,13 @@ void Terminal::escape$K(const Vector<unsigned>& 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<unsigned>& 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<unsigned>& 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<unsigned> 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;

View file

@ -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<unsigned>&);
void escape$B(const Vector<unsigned>&);
void escape$C(const Vector<unsigned>&);
@ -109,6 +113,7 @@ private:
Vector<byte> m_intermediates;
Vector<byte> m_xterm_param1;
Vector<byte> m_xterm_param2;
byte m_final { 0 };
byte* m_horizontal_tabs { nullptr };
bool m_belling { false };