From cef8779bf7c128f964dd68fc64f0c78fa746cb1b Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 18 Apr 2025 02:42:24 +0300 Subject: [PATCH] Kernel: Improve error handling when setting TTY font --- .../include/kernel/Terminal/FramebufferTerminal.h | 2 +- kernel/include/kernel/Terminal/TTY.h | 2 +- kernel/include/kernel/Terminal/TerminalDriver.h | 4 ++-- kernel/include/kernel/Terminal/VirtualTTY.h | 2 +- kernel/kernel/Terminal/TTY.cpp | 2 +- kernel/kernel/Terminal/VirtualTTY.cpp | 15 +++++++-------- 6 files changed, 13 insertions(+), 14 deletions(-) diff --git a/kernel/include/kernel/Terminal/FramebufferTerminal.h b/kernel/include/kernel/Terminal/FramebufferTerminal.h index 4c54f4dc..02bf9e76 100644 --- a/kernel/include/kernel/Terminal/FramebufferTerminal.h +++ b/kernel/include/kernel/Terminal/FramebufferTerminal.h @@ -22,7 +22,7 @@ namespace Kernel virtual bool has_font() const override { return true; } - virtual void set_font(const LibFont::Font& font) override { m_font = font; }; + virtual void set_font(LibFont::Font&& font) override { m_font = BAN::move(font); }; virtual const LibFont::Font& font() const override { return m_font; }; private: diff --git a/kernel/include/kernel/Terminal/TTY.h b/kernel/include/kernel/Terminal/TTY.h index 102a44b2..8509f7e5 100644 --- a/kernel/include/kernel/Terminal/TTY.h +++ b/kernel/include/kernel/Terminal/TTY.h @@ -15,7 +15,7 @@ namespace Kernel class TTY : public CharacterDevice { public: - virtual void set_font(const LibFont::Font&) {}; + virtual BAN::ErrorOr set_font(LibFont::Font&&) { return BAN::Error::from_errno(EINVAL); } void set_foreground_pgrp(pid_t pgrp) { m_foreground_pgrp = pgrp; } pid_t foreground_pgrp() const { return m_foreground_pgrp; } diff --git a/kernel/include/kernel/Terminal/TerminalDriver.h b/kernel/include/kernel/Terminal/TerminalDriver.h index e38a2401..a5a7d0c8 100644 --- a/kernel/include/kernel/Terminal/TerminalDriver.h +++ b/kernel/include/kernel/Terminal/TerminalDriver.h @@ -37,8 +37,8 @@ namespace Kernel virtual void set_cursor_position(uint32_t, uint32_t) = 0; virtual bool has_font() const { return false; } - virtual void set_font(const LibFont::Font&) { ASSERT_NOT_REACHED(); }; - virtual const LibFont::Font& font() const { ASSERT_NOT_REACHED(); }; + virtual BAN::ErrorOr set_font(LibFont::Font&&) { return BAN::Error::from_errno(EINVAL); } + virtual const LibFont::Font& font() const { ASSERT_NOT_REACHED(); } }; extern BAN::RefPtr g_terminal_driver; diff --git a/kernel/include/kernel/Terminal/VirtualTTY.h b/kernel/include/kernel/Terminal/VirtualTTY.h index d480e9e1..867c3d04 100644 --- a/kernel/include/kernel/Terminal/VirtualTTY.h +++ b/kernel/include/kernel/Terminal/VirtualTTY.h @@ -14,7 +14,7 @@ namespace Kernel public: static BAN::ErrorOr> create(BAN::RefPtr); - virtual void set_font(const LibFont::Font&) override; + virtual BAN::ErrorOr set_font(LibFont::Font&&) override; virtual uint32_t height() const override { return m_height; } virtual uint32_t width() const override { return m_width; } diff --git a/kernel/kernel/Terminal/TTY.cpp b/kernel/kernel/Terminal/TTY.cpp index 18ee4bf7..2ea7b15c 100644 --- a/kernel/kernel/Terminal/TTY.cpp +++ b/kernel/kernel/Terminal/TTY.cpp @@ -188,7 +188,7 @@ namespace Kernel { auto absolute_path = TRY(Process::current().absolute_path_of(BAN::StringView(reinterpret_cast(argument)))); auto new_font = TRY(LibFont::Font::load(absolute_path)); - set_font(new_font); + TRY(set_font(BAN::move(new_font))); return 0; } case TIOCGWINSZ: diff --git a/kernel/kernel/Terminal/VirtualTTY.cpp b/kernel/kernel/Terminal/VirtualTTY.cpp index fc374c3e..4412e84c 100644 --- a/kernel/kernel/Terminal/VirtualTTY.cpp +++ b/kernel/kernel/Terminal/VirtualTTY.cpp @@ -55,17 +55,14 @@ namespace Kernel m_terminal_driver->clear(m_background); } - void VirtualTTY::set_font(const LibFont::Font& font) + BAN::ErrorOr VirtualTTY::set_font(LibFont::Font&& font) { + if (!m_terminal_driver->has_font()) + return BAN::Error::from_errno(EINVAL); + SpinLockGuard _(m_write_lock); - if (!m_terminal_driver->has_font()) - { - dwarnln("terminal driver does not have a font"); - return; - } - - m_terminal_driver->set_font(font); + TRY(m_terminal_driver->set_font(BAN::move(font))); uint32_t new_width = m_terminal_driver->width(); uint32_t new_height = m_terminal_driver->height(); @@ -91,6 +88,8 @@ namespace Kernel for (uint32_t y = 0; y < m_height; y++) for (uint32_t x = 0; x < m_width; x++) render_from_buffer(x, y); + + return {}; } void VirtualTTY::set_cursor_position(uint32_t x, uint32_t y)