summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2018-11-10 00:56:10 +0100
committerAndreas Kling <awesomekling@gmail.com>2018-11-10 00:56:10 +0100
commit8605711f4bb5404d0368343f14896f716963d864 (patch)
treee6a0b02872b9368a86a7a160e1247295046b3cc1
parent3e3de67f025f427b557403193b0514ff19958c92 (diff)
downloadserenity-8605711f4bb5404d0368343f14896f716963d864.zip
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.
-rw-r--r--Kernel/VirtualConsole.cpp14
-rw-r--r--Kernel/VirtualConsole.h2
-rw-r--r--LibC/entry.cpp3
-rw-r--r--Userland/clear.cpp3
4 files changed, 19 insertions, 3 deletions
diff --git a/Kernel/VirtualConsole.cpp b/Kernel/VirtualConsole.cpp
index 2199cc509a..530913f47a 100644
--- a/Kernel/VirtualConsole.cpp
+++ b/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;
}
}
diff --git a/Kernel/VirtualConsole.h b/Kernel/VirtualConsole.h
index 1af03699b5..545a8a4894 100644
--- a/Kernel/VirtualConsole.h
+++ b/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 };
diff --git a/LibC/entry.cpp b/LibC/entry.cpp
index d24be1ff07..2753137e2c 100644
--- a/LibC/entry.cpp
+++ b/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);
diff --git a/Userland/clear.cpp b/Userland/clear.cpp
index c7568b384e..e31f99328b 100644
--- a/Userland/clear.cpp
+++ b/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;
}