diff options
Diffstat (limited to 'Kernel/TTY/VirtualConsole.h')
-rw-r--r-- | Kernel/TTY/VirtualConsole.h | 96 |
1 files changed, 83 insertions, 13 deletions
diff --git a/Kernel/TTY/VirtualConsole.h b/Kernel/TTY/VirtualConsole.h index 10b04771f8..3ad2c0f703 100644 --- a/Kernel/TTY/VirtualConsole.h +++ b/Kernel/TTY/VirtualConsole.h @@ -1,35 +1,91 @@ /* * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il> * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once +#include <AK/Noncopyable.h> +#include <AK/NonnullOwnPtrVector.h> +#include <AK/String.h> +#include <AK/Vector.h> +#include <Kernel/API/KeyCode.h> #include <Kernel/ConsoleDevice.h> #include <Kernel/Devices/HID/HIDManagement.h> +#include <Kernel/Graphics/Console/Console.h> #include <Kernel/TTY/TTY.h> +#include <LibVT/Attribute.h> +#include <LibVT/Position.h> #include <LibVT/Terminal.h> namespace Kernel { -static constexpr unsigned s_max_virtual_consoles = 6; +class ConsoleManagement; +class VirtualConsole; +// FIXME: This implementation has no knowledge about keeping terminal history... +class ConsoleImpl final : public VT::Terminal { +public: + explicit ConsoleImpl(VirtualConsole&); + + virtual void set_size(u16 columns, u16 rows) override; + +private: + virtual void invalidate_cursor() override; + virtual void clear() override; + virtual void clear_including_history() override; + + virtual void scroll_up() override; + virtual void scroll_down() override; + virtual void newline() override; + virtual void put_character_at(unsigned row, unsigned column, u32 ch) override; + virtual void set_window_title(const String&) override; + + virtual void ICH(Parameters) override; + + virtual void IL(Parameters) override; + virtual void DCH(Parameters) override; + virtual void DL(Parameters) override; +}; class VirtualConsole final : public TTY , public KeyboardClient , public VT::TerminalClient { AK_MAKE_ETERNAL + friend class ConsoleManagement; + friend class ConsoleImpl; + friend class VT::Terminal; + public: - VirtualConsole(const unsigned index); + struct Line { + bool dirty; + }; + + struct Cell { + void clear() + { + ch = ' '; + attribute.reset(); + } + char ch; + VT::Attribute attribute; + }; + +public: + static NonnullRefPtr<VirtualConsole> create(size_t index); + virtual ~VirtualConsole() override; - static void switch_to(unsigned); - static void initialize(); + size_t index() const { return m_index; } bool is_graphical() { return m_graphical; } void set_graphical(bool graphical); + void emit_char(char); + private: + VirtualConsole(const unsigned index); // ^KeyboardClient virtual void on_key_pressed(KeyEvent) override; @@ -53,23 +109,37 @@ private: virtual String device_name() const override; void set_active(bool); - - void flush_vga_cursor(); void flush_dirty_lines(); unsigned m_index; bool m_active { false }; bool m_graphical { false }; - 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 }; + String m_tty_name; + RecursiveSpinLock m_lock; - VT::Terminal m_terminal; +private: + void invalidate_cursor(size_t row); - String m_tty_name; + void clear(); + + void inject_string(const StringView&); + + Cell& cell_at(size_t column, size_t row); + + typedef Vector<unsigned, 4> ParamVector; + + void on_code_point(u32); + + void scroll_down(); + void scroll_up(); + void newline(); + void clear_line(size_t index); + void put_character_at(unsigned row, unsigned column, u32 ch, const VT::Attribute&); + + OwnPtr<Region> m_cells; + Vector<VirtualConsole::Line> m_lines; + ConsoleImpl m_console_impl; }; } |