1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:57:36 +00:00

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.
This commit is contained in:
Andreas Kling 2018-11-10 00:56:10 +01:00
parent 3e3de67f02
commit 8605711f4b
4 changed files with 19 additions and 3 deletions

View file

@ -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) void VirtualConsole::switch_to(unsigned index)
{ {
if ((int)index == s_active_console) if ((int)index == s_active_console)
@ -248,11 +258,11 @@ void VirtualConsole::escape$J(const Vector<unsigned>& params)
notImplemented(); notImplemented();
break; break;
case 2: case 2:
vga_clear(); clear();
break; break;
case 3: case 3:
// FIXME: <esc>[3J should also clear the scrollback buffer. // FIXME: <esc>[3J should also clear the scrollback buffer.
vga_clear(); clear();
break; break;
} }
} }

View file

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

View file

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

View file

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