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:
parent
b1fee13904
commit
283bd1a95c
4 changed files with 19 additions and 16 deletions
|
@ -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()
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue