Bladeren bron

Terminal: Implement 'J' escape "clear from cursor to end of screen."

Andreas Kling 6 jaren geleden
bovenliggende
commit
f176af7cd1
2 gewijzigde bestanden met toevoegingen van 54 en 8 verwijderingen
  1. 49 8
      Terminal/Terminal.cpp
  2. 5 0
      Terminal/Terminal.h

+ 49 - 8
Terminal/Terminal.cpp

@@ -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;

+ 5 - 0
Terminal/Terminal.h

@@ -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 };