mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 06:47:35 +00:00
Terminal: Implement 'J' escape "clear from cursor to end of screen."
This commit is contained in:
parent
d1b805172d
commit
f176af7cd1
2 changed files with 54 additions and 8 deletions
|
@ -1,5 +1,6 @@
|
||||||
#include "Terminal.h"
|
#include "Terminal.h"
|
||||||
#include <AK/AKString.h>
|
#include <AK/AKString.h>
|
||||||
|
#include <AK/StringBuilder.h>
|
||||||
#include <SharedGraphics/Font.h>
|
#include <SharedGraphics/Font.h>
|
||||||
#include <SharedGraphics/Painter.h>
|
#include <SharedGraphics/Painter.h>
|
||||||
#include <AK/StdLibExtras.h>
|
#include <AK/StdLibExtras.h>
|
||||||
|
@ -291,13 +292,13 @@ void Terminal::escape$K(const Vector<unsigned>& params)
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
// FIXME: Clear from cursor to beginning of screen.
|
// FIXME: Clear from cursor to beginning of screen.
|
||||||
notImplemented();
|
unimplemented_escape();
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
notImplemented();
|
unimplemented_escape();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
notImplemented();
|
unimplemented_escape();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -309,12 +310,19 @@ void Terminal::escape$J(const Vector<unsigned>& params)
|
||||||
mode = params[0];
|
mode = params[0];
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case 0:
|
case 0:
|
||||||
// FIXME: Clear from cursor to end of screen.
|
// Clear from cursor to end of screen.
|
||||||
notImplemented();
|
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;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
// FIXME: Clear from cursor to beginning of screen.
|
// FIXME: Clear from cursor to beginning of screen.
|
||||||
notImplemented();
|
unimplemented_escape();
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
clear();
|
clear();
|
||||||
|
@ -324,13 +332,14 @@ void Terminal::escape$J(const Vector<unsigned>& params)
|
||||||
clear();
|
clear();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
notImplemented();
|
unimplemented_escape();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Terminal::execute_xterm_command()
|
void Terminal::execute_xterm_command()
|
||||||
{
|
{
|
||||||
|
m_final = '@';
|
||||||
bool ok;
|
bool ok;
|
||||||
unsigned value = parseUInt(String((const char*)m_xterm_param1.data(), m_xterm_param1.size()), ok);
|
unsigned value = parseUInt(String((const char*)m_xterm_param1.data(), m_xterm_param1.size()), ok);
|
||||||
if (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()));
|
set_window_title(String((const char*)m_xterm_param2.data(), m_xterm_param2.size()));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
notImplemented();
|
unimplemented_xterm_escape();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -349,6 +358,7 @@ void Terminal::execute_xterm_command()
|
||||||
|
|
||||||
void Terminal::execute_escape_sequence(byte final)
|
void Terminal::execute_escape_sequence(byte final)
|
||||||
{
|
{
|
||||||
|
m_final = final;
|
||||||
auto paramparts = String((const char*)m_parameters.data(), m_parameters.size()).split(';');
|
auto paramparts = String((const char*)m_parameters.data(), m_parameters.size()).split(';');
|
||||||
Vector<unsigned> params;
|
Vector<unsigned> params;
|
||||||
for (auto& parampart : paramparts) {
|
for (auto& parampart : paramparts) {
|
||||||
|
@ -417,6 +427,7 @@ void Terminal::put_character_at(unsigned row, unsigned column, byte ch)
|
||||||
ASSERT(column < columns());
|
ASSERT(column < columns());
|
||||||
line(row).characters[column] = ch;
|
line(row).characters[column] = ch;
|
||||||
line(row).attributes[column] = m_current_attribute;
|
line(row).attributes[column] = m_current_attribute;
|
||||||
|
line(row).dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Terminal::on_char(byte ch)
|
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)
|
void Terminal::set_size(word columns, word rows)
|
||||||
{
|
{
|
||||||
m_columns = columns;
|
m_columns = columns;
|
||||||
|
|
|
@ -30,6 +30,10 @@ private:
|
||||||
void invalidate_window(const Rect& = Rect());
|
void invalidate_window(const Rect& = Rect());
|
||||||
void set_window_title(const String&);
|
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$A(const Vector<unsigned>&);
|
||||||
void escape$B(const Vector<unsigned>&);
|
void escape$B(const Vector<unsigned>&);
|
||||||
void escape$C(const Vector<unsigned>&);
|
void escape$C(const Vector<unsigned>&);
|
||||||
|
@ -109,6 +113,7 @@ private:
|
||||||
Vector<byte> m_intermediates;
|
Vector<byte> m_intermediates;
|
||||||
Vector<byte> m_xterm_param1;
|
Vector<byte> m_xterm_param1;
|
||||||
Vector<byte> m_xterm_param2;
|
Vector<byte> m_xterm_param2;
|
||||||
|
byte m_final { 0 };
|
||||||
byte* m_horizontal_tabs { nullptr };
|
byte* m_horizontal_tabs { nullptr };
|
||||||
bool m_belling { false };
|
bool m_belling { false };
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue