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 };