1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:17:34 +00:00

LibVT: Respond to DSR 0 (device status)

Also emit query responses in a single write() syscall instead of going
character-at-a-time.
This commit is contained in:
Andreas Kling 2020-05-09 10:38:57 +02:00
parent b1fee13904
commit 283bd1a95c
4 changed files with 19 additions and 16 deletions

View file

@ -705,10 +705,7 @@ void Terminal::execute_escape_sequence(u8 final)
HVP(params); HVP(params);
break; break;
case 'n': case 'n':
if (params.size() == 1 && params[0] == 6) DSR(params);
DSR();
else
dbg() << "Unknown CSIxn command";
break; break;
default: default:
dbgprintf("Terminal::execute_escape_sequence: Unhandled final '%c'\n", final); dbgprintf("Terminal::execute_escape_sequence: Unhandled final '%c'\n", final);
@ -812,10 +809,17 @@ void Terminal::RI()
CUU({}); CUU({});
} }
void Terminal::DSR() void Terminal::DSR(const ParamVector& params)
{ {
// Device Status Report (cursor position query) if (params.size() == 1 && params[0] == 5) {
emit_string(String::format("\033[%d;%dR", m_cursor_row + 1, m_cursor_column + 1)); // Device status
emit_string("\033[0n"); // Terminal status OK!
} else if (params.size() == 1 && params[0] == 6) {
// Cursor position query
emit_string(String::format("\033[%d;%dR", m_cursor_row + 1, m_cursor_column + 1));
} else {
dbg() << "Unknown DSR";
}
} }
void Terminal::on_char(u8 ch) void Terminal::on_char(u8 ch)
@ -962,10 +966,9 @@ void Terminal::inject_string(const StringView& str)
on_char(str[i]); on_char(str[i]);
} }
void Terminal::emit_string(const StringView& str) void Terminal::emit_string(const StringView& string)
{ {
for (size_t i = 0; i < str.length(); ++i) m_client.emit((const u8*)string.characters_without_null_termination(), string.length());
m_client.emit_char(str[i]);
} }
void Terminal::unimplemented_escape() void Terminal::unimplemented_escape()

View file

@ -41,7 +41,7 @@ public:
virtual void set_window_title(const StringView&) = 0; virtual void set_window_title(const StringView&) = 0;
virtual void terminal_did_resize(u16 columns, u16 rows) = 0; virtual void terminal_did_resize(u16 columns, u16 rows) = 0;
virtual void terminal_history_changed() = 0; virtual void terminal_history_changed() = 0;
virtual void emit_char(u8) = 0; virtual void emit(const u8*, size_t) = 0;
}; };
struct Attribute { struct Attribute {
@ -178,7 +178,7 @@ private:
void NEL(); void NEL();
void IND(); void IND();
void RI(); void RI();
void DSR(); void DSR(const ParamVector&);
TerminalClient& m_client; TerminalClient& m_client;

View file

@ -711,10 +711,10 @@ void TerminalWidget::beep()
force_repaint(); force_repaint();
} }
void TerminalWidget::emit_char(u8 ch) void TerminalWidget::emit(const u8* data, size_t size)
{ {
if (write(m_ptm_fd, &ch, 1) < 0) { if (write(m_ptm_fd, data, size) < 0) {
perror("emit_char: write"); perror("TerminalWidget::emit: write");
} }
} }

View file

@ -108,7 +108,7 @@ private:
virtual void set_window_title(const StringView&) override; virtual void set_window_title(const StringView&) override;
virtual void terminal_did_resize(u16 columns, u16 rows) override; virtual void terminal_did_resize(u16 columns, u16 rows) override;
virtual void terminal_history_changed() override; virtual void terminal_history_changed() override;
virtual void emit_char(u8) override; virtual void emit(const u8*, size_t) override;
void set_logical_focus(bool); void set_logical_focus(bool);