VirtualConsole.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /*
  2. * Copyright (c) 2018-2020, 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/Position.h>
  19. #include <LibVT/Terminal.h>
  20. namespace Kernel {
  21. class ConsoleManagement;
  22. class VirtualConsole;
  23. // FIXME: This implementation has no knowledge about keeping terminal history...
  24. class ConsoleImpl final : public VT::Terminal {
  25. public:
  26. explicit ConsoleImpl(VirtualConsole&);
  27. virtual void set_size(u16 columns, u16 rows) override;
  28. private:
  29. virtual void invalidate_cursor() override;
  30. virtual void clear() override;
  31. virtual void clear_including_history() override;
  32. virtual void scroll_up() override;
  33. virtual void scroll_down() override;
  34. virtual void linefeed() override;
  35. virtual void put_character_at(unsigned row, unsigned column, u32 ch) override;
  36. virtual void set_window_title(const String&) override;
  37. virtual void ICH(Parameters) override;
  38. virtual void IL(Parameters) override;
  39. virtual void DCH(Parameters) override;
  40. virtual void DL(Parameters) override;
  41. };
  42. class VirtualConsole final : public TTY
  43. , public KeyboardClient
  44. , public VT::TerminalClient {
  45. AK_MAKE_ETERNAL
  46. friend class ConsoleManagement;
  47. friend class ConsoleImpl;
  48. friend class VT::Terminal;
  49. public:
  50. struct Line {
  51. bool dirty;
  52. };
  53. struct Cell {
  54. void clear()
  55. {
  56. ch = ' ';
  57. attribute.reset();
  58. }
  59. char ch;
  60. VT::Attribute attribute;
  61. };
  62. public:
  63. static NonnullRefPtr<VirtualConsole> create(size_t index);
  64. static NonnullRefPtr<VirtualConsole> create_with_preset_log(size_t index, const CircularQueue<char, 16384>&);
  65. virtual ~VirtualConsole() override;
  66. size_t index() const { return m_index; }
  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 ssize_t on_tty_write(const UserOrKernelBuffer&, ssize_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() override;
  85. virtual void emit(const u8*, size_t) override;
  86. // ^CharacterDevice
  87. virtual const char* class_name() const override { return "VirtualConsole"; }
  88. // ^Device
  89. virtual String device_name() const override;
  90. void set_active(bool);
  91. void flush_dirty_lines();
  92. unsigned m_index;
  93. bool m_active { false };
  94. bool m_graphical { false };
  95. String m_tty_name;
  96. RecursiveSpinLock m_lock;
  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. typedef Vector<unsigned, 4> ParamVector;
  104. void on_code_point(u32);
  105. void scroll_down();
  106. void scroll_up();
  107. void clear_line(size_t index);
  108. void put_character_at(unsigned row, unsigned column, u32 ch, const VT::Attribute&);
  109. OwnPtr<Region> m_cells;
  110. Vector<VirtualConsole::Line> m_lines;
  111. ConsoleImpl m_console_impl;
  112. };
  113. }