From db7ffcf9d5f05e35ce8e6070477730f34d58b159 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 18 Nov 2025 03:07:54 +0200 Subject: [PATCH] Kernel/Terminal: Add support for bracketed paste mode This gets rid of annoying warnings when running some programs like bash --- kernel/kernel/Terminal/VirtualTTY.cpp | 5 +++++ userspace/programs/Terminal/Terminal.cpp | 26 +++++++++++++++++++++--- userspace/programs/Terminal/Terminal.h | 1 + 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/kernel/kernel/Terminal/VirtualTTY.cpp b/kernel/kernel/Terminal/VirtualTTY.cpp index 8c1feb1e..713c29b7 100644 --- a/kernel/kernel/Terminal/VirtualTTY.cpp +++ b/kernel/kernel/Terminal/VirtualTTY.cpp @@ -417,6 +417,11 @@ namespace Kernel m_cursor_shown = (ch == 'h'); return reset_ansi(); } + if (m_ansi_state.question && m_ansi_state.nums[0] == 2004) + { + // bracketed paste mode, there is no pasting so this is a no-op + return reset_ansi(); + } reset_ansi(); dprintln_if(DEBUG_VTTY, "Unsupported ANSI CSI character {}", static_cast(ch)); return; diff --git a/userspace/programs/Terminal/Terminal.cpp b/userspace/programs/Terminal/Terminal.cpp index de424d64..098617d6 100644 --- a/userspace/programs/Terminal/Terminal.cpp +++ b/userspace/programs/Terminal/Terminal.cpp @@ -274,7 +274,13 @@ void Terminal::run() auto clipboard = clipboard_or_error.release_value(); if (!clipboard.empty()) + { + if (m_brackted_paste_mode) + write(m_shell_info.pts_master, "\e[200~", 6); write(m_shell_info.pts_master, clipboard.data(), clipboard.size()); + if (m_brackted_paste_mode) + write(m_shell_info.pts_master, "\e[201~", 6); + } m_got_key_event = true; break; @@ -930,12 +936,26 @@ Rectangle Terminal::handle_csi(char ch) break; case 'h': case 'l': - if (!m_csi_info.question || m_csi_info.fields[0] != 25) + if (m_csi_info.question) { - dprintln("unsupported ANSI CSI {}", ch); + switch (m_csi_info.fields[0]) + { + case 25: + m_cursor_shown = (ch == 'h'); + break; + case 2004: + m_brackted_paste_mode = (ch == 'h'); + break; + default: + dwarnln("unsupported ANSI CSI ? {} {}", m_csi_info.fields[0], ch); + break; + } + } + else + { + dwarnln("unsupported ANSI CSI {} {}", m_csi_info.fields[0], ch); break; } - m_cursor_shown = (ch == 'h'); break; case 'n': if (m_csi_info.fields[0] != 6) diff --git a/userspace/programs/Terminal/Terminal.h b/userspace/programs/Terminal/Terminal.h index f6b70e0f..45ef2e61 100644 --- a/userspace/programs/Terminal/Terminal.h +++ b/userspace/programs/Terminal/Terminal.h @@ -106,6 +106,7 @@ private: uint32_t m_selection_e_col { UINT32_MAX }; uint32_t m_selection_e_row { UINT32_MAX }; bool m_selecting { false }; + bool m_brackted_paste_mode { false }; bool m_cursor_shown { true }; bool m_cursor_blink_shown { true };