Explorar el Código

Make /bin/clear work again.

After I made stdio buffered, we were dropping anything unflushed on exit.
Since /bin/clear just prints out some escape sequences without a newline,
the entire buffer was being discarded.

Also add VirtualConsole::clear() that handles clearing of background VC's.
Andreas Kling hace 6 años
padre
commit
8605711f4b
Se han modificado 4 ficheros con 19 adiciones y 3 borrados
  1. 12 2
      Kernel/VirtualConsole.cpp
  2. 2 0
      Kernel/VirtualConsole.h
  3. 3 0
      LibC/entry.cpp
  4. 2 1
      Userland/clear.cpp

+ 12 - 2
Kernel/VirtualConsole.cpp

@@ -39,6 +39,16 @@ VirtualConsole::~VirtualConsole()
 {
 }
 
+void VirtualConsole::clear()
+{
+    word* linemem = m_active ? (word*)s_vga_buffer : (word*)m_buffer;
+    for (word i = 0; i < 80 * 25; ++i)
+        linemem[i] = 0x0720;
+    if (m_active)
+        set_vga_start_row(0);
+    set_cursor(0, 0);
+}
+
 void VirtualConsole::switch_to(unsigned index)
 {
     if ((int)index == s_active_console)
@@ -248,11 +258,11 @@ void VirtualConsole::escape$J(const Vector<unsigned>& params)
         notImplemented();
         break;
     case 2:
-        vga_clear();
+        clear();
         break;
     case 3:
         // FIXME: <esc>[3J should also clear the scrollback buffer.
-        vga_clear();
+        clear();
         break;
     }
 }

+ 2 - 0
Kernel/VirtualConsole.h

@@ -43,6 +43,8 @@ private:
     void escape$s(const Vector<unsigned>&);
     void escape$u(const Vector<unsigned>&);
 
+    void clear();
+
     const byte m_rows { 25 };
     const byte m_columns { 80 };
     byte m_cursor_row { 0 };

+ 3 - 0
LibC/entry.cpp

@@ -41,6 +41,9 @@ extern "C" int _start()
         goto epilogue;
     status = main(argc, argv);
 
+    fflush(stdout);
+    fflush(stderr);
+
 epilogue:
     Syscall::invoke(Syscall::SC_exit, status);
 

+ 2 - 1
Userland/clear.cpp

@@ -1,8 +1,9 @@
-#include <LibC/stdio.h>
+#include <stdio.h>
 
 int main(int, char**)
 {
     printf("\033[3J\033[H\033[2J");
+    fflush(stdout);
     return 0;
 }