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:
parent
3e3de67f02
commit
8605711f4b
4 changed files with 19 additions and 3 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 };
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue