1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-06-21 02:32:07 +00:00
serenity/Kernel/TTY/VirtualConsole.h
Drew Stratford 4c35c8d7fd TTY: Implement Canonical mode and basic echoing.
The TTY driver now respects the ICANON flag, enabling basic line
editing like VKILL, VERASE, VEOF and VWERASE. Additionally,
ICANON is now set by default.

Basic echoing has can now be enabled via the ECHO flag, though
more complicated echoing like ECHOCTL or ECHONL has not been
implemented.
2019-10-20 10:51:12 +02:00

92 lines
2.4 KiB
C++

#pragma once
#include "Console.h"
#include <Kernel/Devices/KeyboardDevice.h>
#include <Kernel/TTY/TTY.h>
class VirtualConsole final : public TTY
, public KeyboardClient
, public ConsoleImplementation {
AK_MAKE_ETERNAL
public:
enum InitialContents {
Cleared,
AdoptCurrentVGABuffer
};
VirtualConsole(unsigned index, InitialContents = Cleared);
virtual ~VirtualConsole() override;
static void switch_to(unsigned);
static void initialize();
bool is_graphical() { return m_graphical; }
void set_graphical(bool graphical) { m_graphical = graphical; }
private:
// ^KeyboardClient
virtual void on_key_pressed(KeyboardDevice::Event) override;
// ^ConsoleImplementation
virtual void on_sysconsole_receive(u8) override;
// ^TTY
virtual ssize_t on_tty_write(const u8*, ssize_t) override;
virtual StringView tty_name() const override;
virtual void echo(u8) override { return; }
// ^CharacterDevice
virtual const char* class_name() const override { return "VirtualConsole"; }
void set_active(bool);
void on_char(u8);
void get_vga_cursor(u8& row, u8& column);
void flush_vga_cursor();
u8* m_buffer;
unsigned m_index;
bool m_active { false };
bool m_graphical { false };
void scroll_up();
void set_cursor(unsigned row, unsigned column);
void put_character_at(unsigned row, unsigned column, u8 ch);
void escape$A(const Vector<unsigned>&);
void escape$D(const Vector<unsigned>&);
void escape$H(const Vector<unsigned>&);
void escape$J(const Vector<unsigned>&);
void escape$m(const Vector<unsigned>&);
void escape$s(const Vector<unsigned>&);
void escape$u(const Vector<unsigned>&);
void clear();
u8 m_cursor_row { 0 };
u8 m_cursor_column { 0 };
u8 m_saved_cursor_row { 0 };
u8 m_saved_cursor_column { 0 };
u8 m_current_attribute { 0x07 };
void clear_vga_row(u16 row);
void set_vga_start_row(u16 row);
u16 m_vga_start_row { 0 };
u16 m_current_vga_start_address { 0 };
u8* m_current_vga_window { nullptr };
void execute_escape_sequence(u8 final);
enum EscapeState {
Normal,
ExpectBracket,
ExpectParameter,
ExpectIntermediate,
ExpectFinal,
};
EscapeState m_escape_state { Normal };
Vector<u8> m_parameters;
Vector<u8> m_intermediates;
u8* m_horizontal_tabs { nullptr };
char m_tty_name[32];
};