From 85505b0482b6f07622226ae3615539fca3ce4676 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 18 Apr 2025 17:31:46 +0300 Subject: [PATCH] Kernel: Fix ANSI SGR color invert --- kernel/include/kernel/Terminal/TTY.h | 2 -- kernel/include/kernel/Terminal/VirtualTTY.h | 4 ++++ kernel/kernel/Terminal/VirtualTTY.cpp | 12 ++++++------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/kernel/include/kernel/Terminal/TTY.h b/kernel/include/kernel/Terminal/TTY.h index d85b7e96..bf2749b8 100644 --- a/kernel/include/kernel/Terminal/TTY.h +++ b/kernel/include/kernel/Terminal/TTY.h @@ -69,8 +69,6 @@ namespace Kernel void do_backspace(); protected: - TerminalDriver::Color m_foreground { TerminalColor::BRIGHT_WHITE }; - TerminalDriver::Color m_background { TerminalColor::BLACK }; termios m_termios; private: diff --git a/kernel/include/kernel/Terminal/VirtualTTY.h b/kernel/include/kernel/Terminal/VirtualTTY.h index 728b82a6..99c10901 100644 --- a/kernel/include/kernel/Terminal/VirtualTTY.h +++ b/kernel/include/kernel/Terminal/VirtualTTY.h @@ -84,6 +84,10 @@ namespace Kernel uint32_t m_column { 0 }; Cell* m_buffer { nullptr }; + TerminalDriver::Color m_foreground { TerminalColor::BRIGHT_WHITE }; + TerminalDriver::Color m_background { TerminalColor::BLACK }; + bool m_colors_inverted { false }; + BAN::RefPtr m_terminal_driver; }; diff --git a/kernel/kernel/Terminal/VirtualTTY.cpp b/kernel/kernel/Terminal/VirtualTTY.cpp index e5e31525..b887a1c4 100644 --- a/kernel/kernel/Terminal/VirtualTTY.cpp +++ b/kernel/kernel/Terminal/VirtualTTY.cpp @@ -110,11 +110,11 @@ namespace Kernel case 0: m_foreground = TerminalColor::BRIGHT_WHITE; m_background = TerminalColor::BLACK; + m_colors_inverted = false; break; - case 7: - BAN::swap(m_foreground, m_background); - break; + case 7: m_colors_inverted = true; break; + case 27: m_colors_inverted = false; break; case 30: m_foreground = TerminalColor::BLACK; break; case 31: m_foreground = TerminalColor::RED; break; @@ -384,9 +384,9 @@ namespace Kernel ASSERT(x < m_width && y < m_height); auto& cell = m_buffer[y * m_width + x]; cell.codepoint = codepoint; - cell.foreground = m_foreground; - cell.background = m_background; - m_terminal_driver->putchar_at(codepoint, x, y, m_foreground, m_background); + cell.foreground = m_colors_inverted ? m_background : m_foreground; + cell.background = m_colors_inverted ? m_foreground : m_background; + m_terminal_driver->putchar_at(codepoint, x, y, cell.foreground, cell.background); } void VirtualTTY::putcodepoint(uint32_t codepoint)