From bf1cbb4cde81b12b00643179b11316ecaa8a979f Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 5 May 2025 19:09:21 +0300 Subject: [PATCH] Terminal: Update terminal size and send SIGWINCH on resize --- userspace/programs/Terminal/Terminal.cpp | 35 ++++++++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/userspace/programs/Terminal/Terminal.cpp b/userspace/programs/Terminal/Terminal.cpp index 978c12e9..ece555a0 100644 --- a/userspace/programs/Terminal/Terminal.cpp +++ b/userspace/programs/Terminal/Terminal.cpp @@ -159,13 +159,36 @@ void Terminal::run() m_window->invalidate(m_window->width() - rem, 0, rem, m_window->height()); } - if (m_cursor.x < cols() && m_cursor.y < rows()) - return; + if (m_cursor.x >= cols() || m_cursor.y >= rows()) + { + m_cursor.x = BAN::Math::min(m_cursor.x, cols() - 1); + m_cursor.y = BAN::Math::min(m_cursor.y, rows() - 1); + for (auto& pixel : m_cursor_buffer) + pixel = m_bg_color; + } - m_cursor.x = BAN::Math::min(m_cursor.x, cols() - 1); - m_cursor.y = BAN::Math::min(m_cursor.y, rows() - 1); - for (auto& pixel : m_cursor_buffer) - pixel = m_bg_color; + const winsize winsize { + .ws_row = static_cast(rows()), + .ws_col = static_cast(cols()), + }; + if (ioctl(m_shell_info.pts_master, TIOCSWINSZ, &winsize) == -1) + { + perror("ioctl"); + return; + } + + const pid_t fgpgrp = tcgetpgrp(m_shell_info.pts_master); + if (fgpgrp == -1) + { + perror("tcgetpgrp"); + return; + } + + if (kill(-fgpgrp, SIGWINCH) == -1) + { + perror("kill"); + return; + } }); const int max_fd = BAN::Math::max(m_shell_info.pts_master, m_window->server_fd());