mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-22 12:35:14 +00:00
Terminal: Implement 'J' escape "clear from cursor to end of screen."
This commit is contained in:
parent
d1b805172d
commit
f176af7cd1
Notes:
sideshowbarker
2024-07-19 15:54:55 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/f176af7cd1f
2 changed files with 54 additions and 8 deletions
|
@ -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;
|
||||
|
|
|
@ -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 };
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue