VirtualConsole.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <AK/Noncopyable.h>
  9. #include <AK/NonnullOwnPtrVector.h>
  10. #include <AK/String.h>
  11. #include <AK/Vector.h>
  12. #include <Kernel/API/KeyCode.h>
  13. #include <Kernel/ConsoleDevice.h>
  14. #include <Kernel/Devices/HID/HIDManagement.h>
  15. #include <Kernel/Graphics/Console/Console.h>
  16. #include <Kernel/TTY/TTY.h>
  17. #include <LibVT/Attribute.h>
  18. #include <LibVT/Color.h>
  19. #include <LibVT/Position.h>
  20. #include <LibVT/Terminal.h>
  21. namespace Kernel {
  22. class ConsoleManagement;
  23. class VirtualConsole;
  24. // FIXME: This implementation has no knowledge about keeping terminal history...
  25. class ConsoleImpl final : public VT::Terminal {
  26. public:
  27. explicit ConsoleImpl(VirtualConsole&);
  28. virtual void set_size(u16 columns, u16 rows) override;
  29. private:
  30. virtual void invalidate_cursor() override;
  31. virtual void clear() override;
  32. virtual void clear_history() override;
  33. virtual void scroll_up(u16 region_top, u16 region_bottom, size_t count) override;
  34. virtual void scroll_down(u16 region_top, u16 region_bottom, size_t count) override;
  35. virtual void scroll_left(u16 row, u16 column, size_t count) override;
  36. virtual void scroll_right(u16 row, u16 column, size_t count) override;
  37. virtual void put_character_at(unsigned row, unsigned column, u32 ch) override;
  38. virtual void clear_in_line(u16 row, u16 first_column, u16 last_column) override;
  39. };
  40. class VirtualConsole final : public TTY
  41. , public KeyboardClient
  42. , public VT::TerminalClient {
  43. AK_MAKE_ETERNAL
  44. friend class ConsoleManagement;
  45. friend class ConsoleImpl;
  46. friend class VT::Terminal;
  47. public:
  48. struct Line {
  49. bool dirty;
  50. size_t length;
  51. };
  52. struct Cell {
  53. void clear()
  54. {
  55. ch = ' ';
  56. attribute.reset();
  57. }
  58. char ch;
  59. VT::Attribute attribute;
  60. };
  61. public:
  62. static NonnullRefPtr<VirtualConsole> create(size_t index);
  63. static NonnullRefPtr<VirtualConsole> create_with_preset_log(size_t index, const CircularQueue<char, 16384>&);
  64. virtual ~VirtualConsole() override;
  65. size_t index() const { return m_index; }
  66. void refresh_after_resolution_change();
  67. bool is_graphical() { return m_graphical; }
  68. void set_graphical(bool graphical);
  69. void emit_char(char);
  70. private:
  71. explicit VirtualConsole(const unsigned index);
  72. VirtualConsole(const unsigned index, const CircularQueue<char, 16384>&);
  73. // ^KeyboardClient
  74. virtual void on_key_pressed(KeyEvent) override;
  75. // ^TTY
  76. virtual KResultOr<size_t> on_tty_write(const UserOrKernelBuffer&, size_t) override;
  77. virtual String const& tty_name() const override { return m_tty_name; }
  78. virtual void echo(u8) override;
  79. // ^TerminalClient
  80. virtual void beep() override;
  81. virtual void set_window_title(const StringView&) override;
  82. virtual void set_window_progress(int, int) override;
  83. virtual void terminal_did_resize(u16 columns, u16 rows) override;
  84. virtual void terminal_history_changed(int) override;
  85. virtual void emit(const u8*, size_t) override;
  86. virtual void set_cursor_style(VT::CursorStyle) override;
  87. // ^CharacterDevice
  88. virtual StringView class_name() const override { return "VirtualConsole"; }
  89. // ^Device
  90. virtual String device_name() const override;
  91. void set_active(bool);
  92. void flush_dirty_lines();
  93. unsigned m_index;
  94. bool m_active { false };
  95. bool m_graphical { false };
  96. String m_tty_name;
  97. private:
  98. void initialize();
  99. void invalidate_cursor(size_t row);
  100. void clear();
  101. void inject_string(const StringView&);
  102. Cell& cell_at(size_t column, size_t row);
  103. using ParamVector = Vector<unsigned, 4>;
  104. void on_code_point(u32);
  105. void scroll_down(u16 region_top, u16 region_bottom, size_t count);
  106. void scroll_up(u16 region_top, u16 region_bottom, size_t count);
  107. void scroll_left(u16 row, u16 column, size_t count);
  108. void scroll_right(u16 row, u16 column, size_t count);
  109. void clear_line(size_t index)
  110. {
  111. clear_in_line(index, 0, m_console_impl.columns() - 1);
  112. }
  113. void clear_in_line(u16 row, u16 first_column, u16 last_column);
  114. void put_character_at(unsigned row, unsigned column, u32 ch, const VT::Attribute&);
  115. OwnPtr<Memory::Region> m_cells;
  116. Vector<VirtualConsole::Line> m_lines;
  117. ConsoleImpl m_console_impl;
  118. };
  119. }