diff options
author | Andreas Kling <kling@serenityos.org> | 2020-01-25 19:12:08 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-01-25 19:12:08 +0100 |
commit | e6f5ce82852f6f88d5f6296ef469963244b34f17 (patch) | |
tree | b144c00ec30305d75dc1bff19e76bbf32665fd3a | |
parent | f4e7aecec24d1aa910e22a782f169efdfdfd564b (diff) | |
download | serenity-e6f5ce82852f6f88d5f6296ef469963244b34f17.zip |
LibVT: Support the DA (Device Attributes) request (final 'c')
This is used by vttest on startup to query the device for identity.
-rw-r--r-- | Libraries/LibVT/Terminal.cpp | 15 | ||||
-rw-r--r-- | Libraries/LibVT/Terminal.h | 4 | ||||
-rw-r--r-- | Libraries/LibVT/TerminalWidget.cpp | 7 | ||||
-rw-r--r-- | Libraries/LibVT/TerminalWidget.h | 1 |
4 files changed, 27 insertions, 0 deletions
diff --git a/Libraries/LibVT/Terminal.cpp b/Libraries/LibVT/Terminal.cpp index fe191c1872..4241392053 100644 --- a/Libraries/LibVT/Terminal.cpp +++ b/Libraries/LibVT/Terminal.cpp @@ -491,6 +491,12 @@ void Terminal::escape$L(const ParamVector& params) m_need_full_flush = true; } +void Terminal::escape$c(const ParamVector&) +{ + // DA - Device Attributes + emit_string("\033[?1;0c"); +} + void Terminal::escape$M(const ParamVector& params) { int count = 1; @@ -659,6 +665,9 @@ void Terminal::execute_escape_sequence(u8 final) case 'h': escape$h_l(false, question_param, params); break; + case 'c': + escape$c(params); + break; default: dbgprintf("Terminal::execute_escape_sequence: Unhandled final '%c'\n", final); break; @@ -867,6 +876,12 @@ void Terminal::inject_string(const StringView& str) on_char(str[i]); } +void Terminal::emit_string(const StringView& str) +{ + for (size_t i = 0; i < str.length(); ++i) + m_client.emit_char(str[i]); +} + void Terminal::unimplemented_escape() { StringBuilder builder; diff --git a/Libraries/LibVT/Terminal.h b/Libraries/LibVT/Terminal.h index 48418957d2..7679eb6fa7 100644 --- a/Libraries/LibVT/Terminal.h +++ b/Libraries/LibVT/Terminal.h @@ -41,6 +41,7 @@ public: virtual void set_window_title(const StringView&) = 0; virtual void terminal_did_resize(u16 columns, u16 rows) = 0; virtual void terminal_history_changed() = 0; + virtual void emit_char(u8) = 0; }; struct Attribute { @@ -145,6 +146,8 @@ private: void unimplemented_escape(); void unimplemented_xterm_escape(); + void emit_string(const StringView&); + void escape$A(const ParamVector&); void escape$B(const ParamVector&); void escape$C(const ParamVector&); @@ -167,6 +170,7 @@ private: void escape$T(const ParamVector&); void escape$L(const ParamVector&); void escape$h_l(bool, bool, const ParamVector&); + void escape$c(const ParamVector&); TerminalClient& m_client; diff --git a/Libraries/LibVT/TerminalWidget.cpp b/Libraries/LibVT/TerminalWidget.cpp index 7f0a256291..50e9f2ec13 100644 --- a/Libraries/LibVT/TerminalWidget.cpp +++ b/Libraries/LibVT/TerminalWidget.cpp @@ -679,6 +679,13 @@ void TerminalWidget::beep() force_repaint(); } +void TerminalWidget::emit_char(u8 ch) +{ + if (write(m_ptm_fd, &ch, 1) < 0) { + perror("emit_char: write"); + } +} + void TerminalWidget::context_menu_event(GContextMenuEvent& event) { if (!m_context_menu) { diff --git a/Libraries/LibVT/TerminalWidget.h b/Libraries/LibVT/TerminalWidget.h index 9d9744cafd..fcd4adeedb 100644 --- a/Libraries/LibVT/TerminalWidget.h +++ b/Libraries/LibVT/TerminalWidget.h @@ -108,6 +108,7 @@ private: virtual void set_window_title(const StringView&) override; virtual void terminal_did_resize(u16 columns, u16 rows) override; virtual void terminal_history_changed() override; + virtual void emit_char(u8) override; void set_logical_focus(bool); |