diff --git a/kernel/include/kernel/Terminal/TTY.h b/kernel/include/kernel/Terminal/TTY.h index 8509f7e5..d85b7e96 100644 --- a/kernel/include/kernel/Terminal/TTY.h +++ b/kernel/include/kernel/Terminal/TTY.h @@ -41,7 +41,6 @@ namespace Kernel virtual uint32_t height() const = 0; virtual uint32_t width() const = 0; - void putchar(uint8_t ch); virtual dev_t rdev() const final override { return m_rdev; } @@ -60,10 +59,13 @@ namespace Kernel TTY(mode_t mode, uid_t uid, gid_t gid); virtual void putchar_impl(uint8_t ch) = 0; + virtual void update_cursor() {} + virtual BAN::ErrorOr read_impl(off_t, BAN::ByteSpan) override; virtual BAN::ErrorOr write_impl(off_t, BAN::ConstByteSpan) override; private: + void putchar(uint8_t ch); void do_backspace(); protected: diff --git a/kernel/include/kernel/Terminal/VirtualTTY.h b/kernel/include/kernel/Terminal/VirtualTTY.h index 0f0c4392..728b82a6 100644 --- a/kernel/include/kernel/Terminal/VirtualTTY.h +++ b/kernel/include/kernel/Terminal/VirtualTTY.h @@ -24,6 +24,7 @@ namespace Kernel protected: virtual BAN::StringView name() const override { return m_name; } virtual void putchar_impl(uint8_t ch) override; + void update_cursor() override; private: VirtualTTY(BAN::RefPtr); @@ -78,6 +79,7 @@ namespace Kernel uint32_t m_saved_row { 0 }; uint32_t m_saved_column { 0 }; + bool m_cursor_shown { true }; uint32_t m_row { 0 }; uint32_t m_column { 0 }; Cell* m_buffer { nullptr }; diff --git a/kernel/kernel/Terminal/TTY.cpp b/kernel/kernel/Terminal/TTY.cpp index 2ea7b15c..4a05eb5a 100644 --- a/kernel/kernel/Terminal/TTY.cpp +++ b/kernel/kernel/Terminal/TTY.cpp @@ -215,6 +215,7 @@ namespace Kernel auto* ptr = reinterpret_cast(ansi_c_str); while (*ptr) handle_input_byte(*ptr++); + update_cursor(); } } @@ -358,6 +359,7 @@ namespace Kernel SpinLockGuard _(m_write_lock); for (size_t i = 0; i < buffer.size(); i++) putchar(buffer[i]); + update_cursor(); return buffer.size(); } @@ -366,6 +368,7 @@ namespace Kernel ASSERT(s_tty); SpinLockGuard _(s_tty->m_write_lock); s_tty->putchar(ch); + s_tty->update_cursor(); } bool TTY::is_initialized() diff --git a/kernel/kernel/Terminal/VirtualTTY.cpp b/kernel/kernel/Terminal/VirtualTTY.cpp index 8eab46b8..e5e31525 100644 --- a/kernel/kernel/Terminal/VirtualTTY.cpp +++ b/kernel/kernel/Terminal/VirtualTTY.cpp @@ -357,7 +357,7 @@ namespace Kernel case 'l': if (m_ansi_state.question && m_ansi_state.nums[0] == 25) { - m_terminal_driver->set_cursor_shown(ch == 'h'); + m_cursor_shown = (ch == 'h'); return reset_ansi(); } reset_ansi(); @@ -518,8 +518,21 @@ namespace Kernel } putcodepoint(codepoint); + } - m_terminal_driver->set_cursor_position(m_column, m_row); + void VirtualTTY::update_cursor() + { + static bool last_shown = !m_cursor_shown; + if (m_cursor_shown != last_shown) + m_terminal_driver->set_cursor_shown(m_cursor_shown); + last_shown = m_cursor_shown; + + static uint32_t last_column = -1; + static uint32_t last_row = -1; + if (last_column != m_column || last_row != m_row) + m_terminal_driver->set_cursor_position(m_column, m_row); + last_column = m_column; + last_row = m_row; } }