فهرست منبع

LibVT: Implement `DECIC`/`DECDC`

This commit adds support for these escape sequences that are used for
scrolling multiple lines at once. In the current, unoptimized
implementation, these just call the `scroll_left` and `scroll_right`
APIs multiple times.

It's a VT420 feature.
Daniel Bertalan 4 سال پیش
والد
کامیت
3752775a1e
2فایلهای تغییر یافته به همراه40 افزوده شده و 0 حذف شده
  1. 34 0
      Userland/Libraries/LibVT/Terminal.cpp
  2. 6 0
      Userland/Libraries/LibVT/Terminal.h

+ 34 - 0
Userland/Libraries/LibVT/Terminal.cpp

@@ -907,6 +907,28 @@ void Terminal::DECBI()
         set_cursor(cursor_row(), cursor_column() - 1);
 }
 
+void Terminal::DECIC(Parameters params)
+{
+    unsigned num = 1;
+    if (params.size() >= 1 && params[0] != 0)
+        num = params[0];
+
+    num = min<unsigned>(num, columns() - cursor_column());
+    for (unsigned row = cursor_row(); row <= m_scroll_region_bottom; ++row)
+        scroll_right(row, cursor_column(), num);
+}
+
+void Terminal::DECDC(Parameters params)
+{
+    unsigned num = 1;
+    if (params.size() >= 1 && params[0] != 0)
+        num = params[0];
+
+    num = min<unsigned>(num, columns() - cursor_column());
+    for (unsigned row = cursor_row(); row <= m_scroll_region_bottom; ++row)
+        scroll_left(row, cursor_column(), num);
+}
+
 void Terminal::DSR(Parameters params)
 {
     if (params.size() == 1 && params[0] == 5) {
@@ -1147,6 +1169,18 @@ void Terminal::execute_csi_sequence(Parameters parameters, Intermediates interme
     case 'u':
         SCORC();
         break;
+    case '}':
+        if (intermediates.size() >= 1 && intermediates[0] == '\'')
+            DECIC(parameters);
+        else
+            unimplemented_csi_sequence(parameters, intermediates, last_byte);
+        break;
+    case '~':
+        if (intermediates.size() >= 1 && intermediates[0] == '\'')
+            DECDC(parameters);
+        else
+            unimplemented_csi_sequence(parameters, intermediates, last_byte);
+        break;
     default:
         unimplemented_csi_sequence(parameters, intermediates, last_byte);
     }

+ 6 - 0
Userland/Libraries/LibVT/Terminal.h

@@ -359,6 +359,12 @@ protected:
     // FIXME: Find the right names for these.
     void XTERM_WM(Parameters);
 
+    // DECIC - Insert Column
+    void DECIC(Parameters);
+
+    // DECDC - Delete Column
+    void DECDC(Parameters);
+
 #ifndef KERNEL
     TerminalClient& m_client;
 #else