|
@@ -356,6 +356,24 @@ void Terminal::escape$J(const Vector<unsigned>& params)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void Terminal::execute_xterm_command()
|
|
|
|
+{
|
|
|
|
+ bool ok;
|
|
|
|
+ unsigned value = parseUInt(String((const char*)m_xterm_param1.data(), m_xterm_param1.size()), ok);
|
|
|
|
+ if (ok) {
|
|
|
|
+ switch (value) {
|
|
|
|
+ case 0:
|
|
|
|
+ set_window_title(String((const char*)m_xterm_param2.data(), m_xterm_param2.size()));
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ notImplemented();
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ m_xterm_param1.clear_with_capacity();
|
|
|
|
+ m_xterm_param2.clear_with_capacity();
|
|
|
|
+}
|
|
|
|
+
|
|
void Terminal::execute_escape_sequence(byte final)
|
|
void Terminal::execute_escape_sequence(byte 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(';');
|
|
@@ -437,9 +455,31 @@ void Terminal::on_char(byte ch)
|
|
case ExpectBracket:
|
|
case ExpectBracket:
|
|
if (ch == '[')
|
|
if (ch == '[')
|
|
m_escape_state = ExpectParameter;
|
|
m_escape_state = ExpectParameter;
|
|
|
|
+ else if (ch == ']')
|
|
|
|
+ m_escape_state = ExpectXtermParameter1;
|
|
else
|
|
else
|
|
m_escape_state = Normal;
|
|
m_escape_state = Normal;
|
|
return;
|
|
return;
|
|
|
|
+ case ExpectXtermParameter1:
|
|
|
|
+ if (ch != ';') {
|
|
|
|
+ m_xterm_param1.append(ch);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ m_escape_state = ExpectXtermParameter2;
|
|
|
|
+ return;
|
|
|
|
+ case ExpectXtermParameter2:
|
|
|
|
+ if (ch != '\007') {
|
|
|
|
+ m_xterm_param2.append(ch);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ m_escape_state = ExpectXtermFinal;
|
|
|
|
+ // fall through
|
|
|
|
+ case ExpectXtermFinal:
|
|
|
|
+ m_escape_state = Normal;
|
|
|
|
+ if (ch == '\007')
|
|
|
|
+ execute_xterm_command();
|
|
|
|
+ return;
|
|
|
|
+
|
|
case ExpectParameter:
|
|
case ExpectParameter:
|
|
if (is_valid_parameter_character(ch)) {
|
|
if (is_valid_parameter_character(ch)) {
|
|
m_parameters.append(ch);
|
|
m_parameters.append(ch);
|
|
@@ -640,6 +680,15 @@ void Terminal::invalidate_window(const Rect& a_rect)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void Terminal::set_window_title(const String& title)
|
|
|
|
+{
|
|
|
|
+ int rc = gui_set_window_title(m_window_id, title.characters(), title.length());
|
|
|
|
+ if (rc < 0) {
|
|
|
|
+ perror("gui_set_window_title");
|
|
|
|
+ exit(1);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
void Terminal::set_in_active_window(bool b)
|
|
void Terminal::set_in_active_window(bool b)
|
|
{
|
|
{
|
|
if (m_in_active_window == b)
|
|
if (m_in_active_window == b)
|