From 9b4b08b144b6f2eb6479507a8b0060a11f92dfae Mon Sep 17 00:00:00 2001 From: Chester Liu Date: Wed, 2 Sep 2020 18:14:59 +0800 Subject: [PATCH 1/6] Init --- src/cascadia/TerminalControl/TermControl.cpp | 27 ++-------- src/cascadia/TerminalCore/ITerminalApi.hpp | 1 + src/cascadia/TerminalCore/Terminal.hpp | 2 + src/cascadia/TerminalCore/TerminalApi.cpp | 6 +++ .../TerminalCore/TerminalDispatch.cpp | 9 ++++ .../TerminalCore/TerminalDispatch.hpp | 1 + src/terminal/adapter/DispatchTypes.hpp | 1 + src/terminal/adapter/ITermDispatch.hpp | 2 + src/terminal/adapter/adaptDispatch.cpp | 5 ++ src/terminal/adapter/adaptDispatch.hpp | 2 + src/terminal/adapter/termDispatch.hpp | 1 + src/types/PasteConverter.cpp | 53 +++++++++++++++++++ src/types/inc/PasteConverter.h | 30 +++++++++++ src/types/lib/types.vcxproj | 4 +- src/types/lib/types.vcxproj.filters | 8 ++- 15 files changed, 128 insertions(+), 24 deletions(-) create mode 100644 src/types/PasteConverter.cpp create mode 100644 src/types/inc/PasteConverter.h diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 6c86ac93e36..b056515a0ea 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include "..\..\types\inc\GlyphWidth.hpp" @@ -16,6 +17,7 @@ #include "TermControlAutomationPeer.h" using namespace ::Microsoft::Console::Types; +using namespace ::Microsoft::Console::Utils; using namespace ::Microsoft::Console::VirtualTerminal; using namespace ::Microsoft::Terminal::Core; using namespace winrt::Windows::Graphics::Display; @@ -1797,31 +1799,12 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // Method Description: // - Pre-process text pasted (presumably from the clipboard) - // before sending it over the terminal's connection, converting - // Windows-space \r\n line-endings to \r line-endings + // and send it over the terminal's connection. void TermControl::_SendPastedTextToConnection(const std::wstring& wstr) { - // Some notes on this implementation: - // - // - std::regex can do this in a single line, but is somewhat - // overkill for a simple search/replace operation (and its - // performance guarantees aren't exactly stellar) - // - The STL doesn't have a simple string search/replace method. - // This fact is lamentable. - // - This line-ending conversion is intentionally fairly - // conservative, to avoid stripping out lone \n characters - // where they could conceivably be intentional. - - std::wstring stripped{ wstr }; - - std::wstring::size_type pos = 0; - - while ((pos = stripped.find(L"\r\n", pos)) != std::wstring::npos) - { - stripped.replace(pos, 2, L"\r"); - } + PasteFlags flags = PasteFlags::CarriageReturnNewline; - _connection.WriteInput(stripped); + _connection.WriteInput(PasteConverter::Convert(wstr, flags)); _terminal->TrySnapOnInput(); } diff --git a/src/cascadia/TerminalCore/ITerminalApi.hpp b/src/cascadia/TerminalCore/ITerminalApi.hpp index 98945de1cfe..db0ba4db2fa 100644 --- a/src/cascadia/TerminalCore/ITerminalApi.hpp +++ b/src/cascadia/TerminalCore/ITerminalApi.hpp @@ -54,6 +54,7 @@ namespace Microsoft::Terminal::Core virtual bool EnableButtonEventMouseMode(const bool enabled) noexcept = 0; virtual bool EnableAnyEventMouseMode(const bool enabled) noexcept = 0; virtual bool EnableAlternateScrollMode(const bool enabled) noexcept = 0; + virtual bool EnableBracketedPasteMode(const bool enabled) noexcept = 0; virtual bool IsVtInputEnabled() const = 0; diff --git a/src/cascadia/TerminalCore/Terminal.hpp b/src/cascadia/TerminalCore/Terminal.hpp index df70bc0184c..f5eb29890f7 100644 --- a/src/cascadia/TerminalCore/Terminal.hpp +++ b/src/cascadia/TerminalCore/Terminal.hpp @@ -107,6 +107,7 @@ class Microsoft::Terminal::Core::Terminal final : bool EnableButtonEventMouseMode(const bool enabled) noexcept override; bool EnableAnyEventMouseMode(const bool enabled) noexcept override; bool EnableAlternateScrollMode(const bool enabled) noexcept override; + bool EnableBracketedPasteMode(const bool enabled) noexcept override; bool IsVtInputEnabled() const noexcept override; @@ -219,6 +220,7 @@ class Microsoft::Terminal::Core::Terminal final : bool _snapOnInput; bool _altGrAliasing; bool _suppressApplicationTitle; + bool _bracketedPasteMode; #pragma region Text Selection // a selection is represented as a range between two COORDs (start and end) diff --git a/src/cascadia/TerminalCore/TerminalApi.cpp b/src/cascadia/TerminalCore/TerminalApi.cpp index 1e27a59702c..7a5897cfc5d 100644 --- a/src/cascadia/TerminalCore/TerminalApi.cpp +++ b/src/cascadia/TerminalCore/TerminalApi.cpp @@ -526,6 +526,12 @@ bool Terminal::EnableAlternateScrollMode(const bool enabled) noexcept return true; } +bool Terminal::EnableBracketedPasteMode(const bool enabled) noexcept +{ + _bracketedPasteMode = enabled; + return true; +} + bool Terminal::IsVtInputEnabled() const noexcept { // We should never be getting this call in Terminal. diff --git a/src/cascadia/TerminalCore/TerminalDispatch.cpp b/src/cascadia/TerminalCore/TerminalDispatch.cpp index f119cc266c7..1269ffe23f3 100644 --- a/src/cascadia/TerminalCore/TerminalDispatch.cpp +++ b/src/cascadia/TerminalCore/TerminalDispatch.cpp @@ -361,6 +361,12 @@ bool TerminalDispatch::EnableAlternateScroll(const bool enabled) noexcept return true; } +bool TerminalDispatch::EnableBracketedPasteMode(const bool enabled) noexcept +{ + _terminalApi.EnableBracketedPasteMode(enabled); + return true; +} + bool TerminalDispatch::SetPrivateModes(const gsl::span params) noexcept { return _SetResetPrivateModes(params, true); @@ -436,6 +442,9 @@ bool TerminalDispatch::_PrivateModeParamsHelper(const DispatchTypes::PrivateMode case DispatchTypes::PrivateModeParams::ATT610_StartCursorBlink: success = EnableCursorBlinking(enable); break; + case DispatchTypes::PrivateModeParams::XTERM_BracketedPasteMode: + success = false; + break; case DispatchTypes::PrivateModeParams::W32IM_Win32InputMode: success = EnableWin32InputMode(enable); break; diff --git a/src/cascadia/TerminalCore/TerminalDispatch.hpp b/src/cascadia/TerminalCore/TerminalDispatch.hpp index 4f3dc8e7371..9ff9404c83c 100644 --- a/src/cascadia/TerminalCore/TerminalDispatch.hpp +++ b/src/cascadia/TerminalCore/TerminalDispatch.hpp @@ -59,6 +59,7 @@ class TerminalDispatch : public Microsoft::Console::VirtualTerminal::TermDispatc bool EnableButtonEventMouseMode(const bool enabled) noexcept override; // ?1002 bool EnableAnyEventMouseMode(const bool enabled) noexcept override; // ?1003 bool EnableAlternateScroll(const bool enabled) noexcept override; // ?1007 + bool EnableBracketedPasteMode(const bool enabled) noexcept override; // ?2004 bool SetPrivateModes(const gsl::span /*params*/) noexcept override; // DECSET bool ResetPrivateModes(const gsl::span /*params*/) noexcept override; // DECRST diff --git a/src/terminal/adapter/DispatchTypes.hpp b/src/terminal/adapter/DispatchTypes.hpp index 1454ed279e4..938801526c3 100644 --- a/src/terminal/adapter/DispatchTypes.hpp +++ b/src/terminal/adapter/DispatchTypes.hpp @@ -186,6 +186,7 @@ namespace Microsoft::Console::VirtualTerminal::DispatchTypes SGR_EXTENDED_MODE = 1006, ALTERNATE_SCROLL = 1007, ASB_AlternateScreenBuffer = 1049, + XTERM_BracketedPasteMode = 2004, W32IM_Win32InputMode = 9001 }; diff --git a/src/terminal/adapter/ITermDispatch.hpp b/src/terminal/adapter/ITermDispatch.hpp index b90705ac4a9..de9e6b2345e 100644 --- a/src/terminal/adapter/ITermDispatch.hpp +++ b/src/terminal/adapter/ITermDispatch.hpp @@ -78,6 +78,8 @@ class Microsoft::Console::VirtualTerminal::ITermDispatch virtual bool EnableButtonEventMouseMode(const bool enabled) = 0; // ?1002 virtual bool EnableAnyEventMouseMode(const bool enabled) = 0; // ?1003 virtual bool EnableAlternateScroll(const bool enabled) = 0; // ?1007 + virtual bool EnableBracketedPasteMode(const bool enabled) = 0; // ?2004 + virtual bool SetColorTableEntry(const size_t tableIndex, const DWORD color) = 0; // OSCColorTable virtual bool SetDefaultForeground(const DWORD color) = 0; // OSCDefaultForeground virtual bool SetDefaultBackground(const DWORD color) = 0; // OSCDefaultBackground diff --git a/src/terminal/adapter/adaptDispatch.cpp b/src/terminal/adapter/adaptDispatch.cpp index d435498c322..0c53cbfa74e 100644 --- a/src/terminal/adapter/adaptDispatch.cpp +++ b/src/terminal/adapter/adaptDispatch.cpp @@ -2146,6 +2146,11 @@ bool AdaptDispatch::EnableAlternateScroll(const bool enabled) return success; } +bool AdaptDispatch::EnableBracketedPasteMode(const bool /*enabled*/) +{ + return false; +} + //Routine Description: // Set Cursor Style - Changes the cursor's style to match the given Dispatch // cursor style. Unix styles are a combination of the shape and the blinking state. diff --git a/src/terminal/adapter/adaptDispatch.hpp b/src/terminal/adapter/adaptDispatch.hpp index 2e5f27a7823..4462677e36a 100644 --- a/src/terminal/adapter/adaptDispatch.hpp +++ b/src/terminal/adapter/adaptDispatch.hpp @@ -105,6 +105,8 @@ namespace Microsoft::Console::VirtualTerminal bool EnableButtonEventMouseMode(const bool enabled) override; // ?1002 bool EnableAnyEventMouseMode(const bool enabled) override; // ?1003 bool EnableAlternateScroll(const bool enabled) override; // ?1007 + bool EnableBracketedPasteMode(const bool enabled) override; // ?2004 + bool SetCursorStyle(const DispatchTypes::CursorStyle cursorStyle) override; // DECSCUSR bool SetCursorColor(const COLORREF cursorColor) override; diff --git a/src/terminal/adapter/termDispatch.hpp b/src/terminal/adapter/termDispatch.hpp index 47ecd990784..7ff670b5690 100644 --- a/src/terminal/adapter/termDispatch.hpp +++ b/src/terminal/adapter/termDispatch.hpp @@ -72,6 +72,7 @@ class Microsoft::Console::VirtualTerminal::TermDispatch : public Microsoft::Cons bool EnableButtonEventMouseMode(const bool /*enabled*/) noexcept override { return false; } // ?1002 bool EnableAnyEventMouseMode(const bool /*enabled*/) noexcept override { return false; } // ?1003 bool EnableAlternateScroll(const bool /*enabled*/) noexcept override { return false; } // ?1007 + bool EnableBracketedPasteMode(const bool /*enabled*/) noexcept override { return false; } // ?2004 bool SetColorTableEntry(const size_t /*tableIndex*/, const DWORD /*color*/) noexcept override { return false; } // OSCColorTable bool SetDefaultForeground(const DWORD /*color*/) noexcept override { return false; } // OSCDefaultForeground bool SetDefaultBackground(const DWORD /*color*/) noexcept override { return false; } // OSCDefaultBackground diff --git a/src/types/PasteConverter.cpp b/src/types/PasteConverter.cpp new file mode 100644 index 00000000000..dfb0e1ea5f9 --- /dev/null +++ b/src/types/PasteConverter.cpp @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +#include "precomp.h" +#include "inc/PasteConverter.h" + +using namespace Microsoft::Console::Utils; + +std::wstring PasteConverter::Convert(const std::wstring& wstr, PasteFlags flags) +{ + std::wstring converted{ wstr }; + + // Convert Windows-space \r\n line-endings to \r (carriage return) line-endings + if (flags & PasteFlags::CarriageReturnNewline) + { + // Some notes on this implementation: + // + // - std::regex can do this in a single line, but is somewhat + // overkill for a simple search/replace operation (and its + // performance guarantees aren't exactly stellar) + // - The STL doesn't have a simple string search/replace method. + // This fact is lamentable. + // - This line-ending conversion is intentionally fairly + // conservative, to avoid stripping out lone \n characters + // where they could conceivably be intentional. + std::wstring::size_type pos = 0; + + while ((pos = converted.find(L"\r\n", pos)) != std::wstring::npos) + { + converted.replace(pos, 2, L"\r"); + } + } + + // Bracketed Paste Mode, invented by xterm and implemented in many popular terminal emulators. + // See: http://www.xfree86.org/current/ctlseqs.html#Bracketed%20Paste%20Mode + if (flags & PasteFlags::Bracketed) + { + // For security reasons, control characters should be filtered. + // For details, check out the "Paste Protection" section in https://lwn.net/Articles/749992/. + // Here ASCII control characters will be removed, except HT(0x09), LF(0x0a), CR(0x0d) and DEL(0x7F). + converted.erase(std::remove_if(converted.begin(), converted.end(), [](wchar_t c) + { + return c >= L'\x00' && c <= L'\x08' || + c >= L'\x0b' && c <= L'\x0c' || + c >= L'\x0e' && c <= L'\x1f'; + })); + + converted.insert(0, L"\x1b[200~"); + converted.append(L"\x1b[201~"); + } + + return converted; +} diff --git a/src/types/inc/PasteConverter.h b/src/types/inc/PasteConverter.h new file mode 100644 index 00000000000..e44239511a3 --- /dev/null +++ b/src/types/inc/PasteConverter.h @@ -0,0 +1,30 @@ +/*++ +Copyright (c) Microsoft Corporation +Licensed under the MIT license. + +Module Name: +- PasteConverter.h + +Abstract: +- Pre-process the text pasted (presumably from the clipboard). + +--*/ + +#pragma once + +#include + +namespace Microsoft::Console::Utils +{ + enum PasteFlags + { + CarriageReturnNewline = 1, + Bracketed = 2 + }; + + class PasteConverter + { + public: + static std::wstring Convert(const std::wstring& wstr, PasteFlags flags); + }; +} diff --git a/src/types/lib/types.vcxproj b/src/types/lib/types.vcxproj index 6d5835a8bd9..51c4dcd0896 100644 --- a/src/types/lib/types.vcxproj +++ b/src/types/lib/types.vcxproj @@ -20,6 +20,7 @@ + @@ -42,6 +43,7 @@ + @@ -64,4 +66,4 @@ - + \ No newline at end of file diff --git a/src/types/lib/types.vcxproj.filters b/src/types/lib/types.vcxproj.filters index 982dc7c38d6..bdf2cc34477 100644 --- a/src/types/lib/types.vcxproj.filters +++ b/src/types/lib/types.vcxproj.filters @@ -78,6 +78,9 @@ Source Files + + Source Files + @@ -161,8 +164,11 @@ Header Files + + Header Files + - + \ No newline at end of file From 8cf4ccbbb19549b0b708904ace2c9f58c9bfea10 Mon Sep 17 00:00:00 2001 From: skyline75489 Date: Wed, 2 Sep 2020 20:02:06 +0800 Subject: [PATCH 2/6] It works! --- src/cascadia/TerminalControl/TermControl.cpp | 5 +++++ src/cascadia/TerminalCore/ITerminalApi.hpp | 1 + src/cascadia/TerminalCore/Terminal.hpp | 1 + src/cascadia/TerminalCore/TerminalApi.cpp | 5 +++++ src/cascadia/TerminalCore/TerminalDispatch.cpp | 2 +- src/types/inc/PasteConverter.h | 2 ++ 6 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index b056515a0ea..19b50918a07 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -1804,6 +1804,11 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation { PasteFlags flags = PasteFlags::CarriageReturnNewline; + if (_terminal->IsBracketedPasteModeEnabled()) + { + flags |= PasteFlags::Bracketed; + } + _connection.WriteInput(PasteConverter::Convert(wstr, flags)); _terminal->TrySnapOnInput(); } diff --git a/src/cascadia/TerminalCore/ITerminalApi.hpp b/src/cascadia/TerminalCore/ITerminalApi.hpp index db0ba4db2fa..a9ac4b66f43 100644 --- a/src/cascadia/TerminalCore/ITerminalApi.hpp +++ b/src/cascadia/TerminalCore/ITerminalApi.hpp @@ -55,6 +55,7 @@ namespace Microsoft::Terminal::Core virtual bool EnableAnyEventMouseMode(const bool enabled) noexcept = 0; virtual bool EnableAlternateScrollMode(const bool enabled) noexcept = 0; virtual bool EnableBracketedPasteMode(const bool enabled) noexcept = 0; + virtual bool IsBracketedPasteModeEnabled() const = 0; virtual bool IsVtInputEnabled() const = 0; diff --git a/src/cascadia/TerminalCore/Terminal.hpp b/src/cascadia/TerminalCore/Terminal.hpp index f5eb29890f7..d1d3d8c1ebc 100644 --- a/src/cascadia/TerminalCore/Terminal.hpp +++ b/src/cascadia/TerminalCore/Terminal.hpp @@ -108,6 +108,7 @@ class Microsoft::Terminal::Core::Terminal final : bool EnableAnyEventMouseMode(const bool enabled) noexcept override; bool EnableAlternateScrollMode(const bool enabled) noexcept override; bool EnableBracketedPasteMode(const bool enabled) noexcept override; + bool IsBracketedPasteModeEnabled() const noexcept override; bool IsVtInputEnabled() const noexcept override; diff --git a/src/cascadia/TerminalCore/TerminalApi.cpp b/src/cascadia/TerminalCore/TerminalApi.cpp index 7a5897cfc5d..36fbf9a8e43 100644 --- a/src/cascadia/TerminalCore/TerminalApi.cpp +++ b/src/cascadia/TerminalCore/TerminalApi.cpp @@ -532,6 +532,11 @@ bool Terminal::EnableBracketedPasteMode(const bool enabled) noexcept return true; } +bool Terminal::IsBracketedPasteModeEnabled() const noexcept +{ + return _bracketedPasteMode; +} + bool Terminal::IsVtInputEnabled() const noexcept { // We should never be getting this call in Terminal. diff --git a/src/cascadia/TerminalCore/TerminalDispatch.cpp b/src/cascadia/TerminalCore/TerminalDispatch.cpp index 1269ffe23f3..7aab9dc7073 100644 --- a/src/cascadia/TerminalCore/TerminalDispatch.cpp +++ b/src/cascadia/TerminalCore/TerminalDispatch.cpp @@ -443,7 +443,7 @@ bool TerminalDispatch::_PrivateModeParamsHelper(const DispatchTypes::PrivateMode success = EnableCursorBlinking(enable); break; case DispatchTypes::PrivateModeParams::XTERM_BracketedPasteMode: - success = false; + success = EnableBracketedPasteMode(enable); break; case DispatchTypes::PrivateModeParams::W32IM_Win32InputMode: success = EnableWin32InputMode(enable); diff --git a/src/types/inc/PasteConverter.h b/src/types/inc/PasteConverter.h index e44239511a3..c1ee2724085 100644 --- a/src/types/inc/PasteConverter.h +++ b/src/types/inc/PasteConverter.h @@ -22,6 +22,8 @@ namespace Microsoft::Console::Utils Bracketed = 2 }; + DEFINE_ENUM_FLAG_OPERATORS(PasteFlags) + class PasteConverter { public: From 50f8e77eee151dfefd33a70ea285ab79460e4051 Mon Sep 17 00:00:00 2001 From: skyline75489 Date: Wed, 2 Sep 2020 20:27:38 +0800 Subject: [PATCH 3/6] Clean --- .../actions/spell-check/patterns/patterns.txt | 1 + src/types/PasteConverter.cpp | 22 ++++++++++++++----- src/types/inc/PasteConverter.h | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/.github/actions/spell-check/patterns/patterns.txt b/.github/actions/spell-check/patterns/patterns.txt index f8c3d65534a..d2c0706102e 100644 --- a/.github/actions/spell-check/patterns/patterns.txt +++ b/.github/actions/spell-check/patterns/patterns.txt @@ -3,6 +3,7 @@ https://aka\.ms/[-a-zA-Z0-9?&=\/_]* https://www\.itscj\.ipsj\.or\.jp/iso-ir/[-0-9]+\.pdf https://www\.vt100\.net/docs/[-a-zA-Z0-9#_\/.]* https://www.w3.org/[-a-zA-Z0-9?&=\/_#]* +http://www.xfree86.org/[-a-zA-Z0-9?&=\/_#]* https://(?:(?:www\.|)youtube\.com|youtu.be)/[-a-zA-Z0-9?&=]* https://[a-z-]+\.githubusercontent\.com/[-a-zA-Z0-9?&=_\/.]* [Pp]ublicKeyToken="?[0-9a-fA-F]{16}"? diff --git a/src/types/PasteConverter.cpp b/src/types/PasteConverter.cpp index dfb0e1ea5f9..03448da7508 100644 --- a/src/types/PasteConverter.cpp +++ b/src/types/PasteConverter.cpp @@ -36,14 +36,24 @@ std::wstring PasteConverter::Convert(const std::wstring& wstr, PasteFlags flags) if (flags & PasteFlags::Bracketed) { // For security reasons, control characters should be filtered. - // For details, check out the "Paste Protection" section in https://lwn.net/Articles/749992/. // Here ASCII control characters will be removed, except HT(0x09), LF(0x0a), CR(0x0d) and DEL(0x7F). - converted.erase(std::remove_if(converted.begin(), converted.end(), [](wchar_t c) + converted.erase(std::remove_if(converted.begin(), converted.end(), [](wchar_t c) { + if (c >= L'\x20' && c <= L'\x7f') { - return c >= L'\x00' && c <= L'\x08' || - c >= L'\x0b' && c <= L'\x0c' || - c >= L'\x0e' && c <= L'\x1f'; - })); + // Printable ASCII + DEL. + return false; + } + + if (c > L'\x7f') + { + // Not a control character for sure. + return false; + } + + return c >= L'\x00' && c <= L'\x08' || + c >= L'\x0b' && c <= L'\x0c' || + c >= L'\x0e' && c <= L'\x1f'; + })); converted.insert(0, L"\x1b[200~"); converted.append(L"\x1b[201~"); diff --git a/src/types/inc/PasteConverter.h b/src/types/inc/PasteConverter.h index c1ee2724085..36e4c7f6c04 100644 --- a/src/types/inc/PasteConverter.h +++ b/src/types/inc/PasteConverter.h @@ -19,7 +19,7 @@ namespace Microsoft::Console::Utils enum PasteFlags { CarriageReturnNewline = 1, - Bracketed = 2 + Bracketed = 2 }; DEFINE_ENUM_FLAG_OPERATORS(PasteFlags) From 1fdf4de14bb06bba59c66c2c9682ba0e5b64b52d Mon Sep 17 00:00:00 2001 From: skyline75489 Date: Wed, 2 Sep 2020 21:09:30 +0800 Subject: [PATCH 4/6] Audit --- src/terminal/adapter/adaptDispatch.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/terminal/adapter/adaptDispatch.cpp b/src/terminal/adapter/adaptDispatch.cpp index 0c53cbfa74e..2481fe5b2a5 100644 --- a/src/terminal/adapter/adaptDispatch.cpp +++ b/src/terminal/adapter/adaptDispatch.cpp @@ -2108,7 +2108,6 @@ bool AdaptDispatch::EnableButtonEventMouseMode(const bool enabled) //Routine Description: // Enable Any Event mode - send all mouse events to the input. - //Arguments: // - enabled - true to enable, false to disable. // Return value: @@ -2146,8 +2145,20 @@ bool AdaptDispatch::EnableAlternateScroll(const bool enabled) return success; } + +//Routine Description: +// Enable "brackted paste mode". +//Arguments: +// - enabled - true to enable, false to disable. +// Return value: +// True if handled successfully. False otherwise. bool AdaptDispatch::EnableBracketedPasteMode(const bool /*enabled*/) { + if (_pConApi->IsConsolePty()) + { + return false; + } + return false; } From a360eec0e63ff519fb8cb60238ce11464ac45c2b Mon Sep 17 00:00:00 2001 From: skyline75489 Date: Wed, 2 Sep 2020 21:15:22 +0800 Subject: [PATCH 5/6] Typo --- src/terminal/adapter/adaptDispatch.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/terminal/adapter/adaptDispatch.cpp b/src/terminal/adapter/adaptDispatch.cpp index 2481fe5b2a5..2b252f38899 100644 --- a/src/terminal/adapter/adaptDispatch.cpp +++ b/src/terminal/adapter/adaptDispatch.cpp @@ -2147,7 +2147,7 @@ bool AdaptDispatch::EnableAlternateScroll(const bool enabled) //Routine Description: -// Enable "brackted paste mode". +// Enable "bracketed paste mode". //Arguments: // - enabled - true to enable, false to disable. // Return value: From 56d46ac16eaa5e2cbf03fcae1422af0ed13cef31 Mon Sep 17 00:00:00 2001 From: skyline75489 Date: Thu, 3 Sep 2020 22:08:39 +0800 Subject: [PATCH 6/6] Add FilterControlCodes flag --- src/types/PasteConverter.cpp | 9 ++++++--- src/types/inc/PasteConverter.h | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/types/PasteConverter.cpp b/src/types/PasteConverter.cpp index 03448da7508..d8aa2193711 100644 --- a/src/types/PasteConverter.cpp +++ b/src/types/PasteConverter.cpp @@ -31,9 +31,7 @@ std::wstring PasteConverter::Convert(const std::wstring& wstr, PasteFlags flags) } } - // Bracketed Paste Mode, invented by xterm and implemented in many popular terminal emulators. - // See: http://www.xfree86.org/current/ctlseqs.html#Bracketed%20Paste%20Mode - if (flags & PasteFlags::Bracketed) + if (flags & PasteFlags::FilterControlCodes) { // For security reasons, control characters should be filtered. // Here ASCII control characters will be removed, except HT(0x09), LF(0x0a), CR(0x0d) and DEL(0x7F). @@ -54,7 +52,12 @@ std::wstring PasteConverter::Convert(const std::wstring& wstr, PasteFlags flags) c >= L'\x0b' && c <= L'\x0c' || c >= L'\x0e' && c <= L'\x1f'; })); + } + // Bracketed Paste Mode, invented by xterm and implemented in many popular terminal emulators. + // See: http://www.xfree86.org/current/ctlseqs.html#Bracketed%20Paste%20Mode + if (flags & PasteFlags::Bracketed) + { converted.insert(0, L"\x1b[200~"); converted.append(L"\x1b[201~"); } diff --git a/src/types/inc/PasteConverter.h b/src/types/inc/PasteConverter.h index 36e4c7f6c04..97f365e3953 100644 --- a/src/types/inc/PasteConverter.h +++ b/src/types/inc/PasteConverter.h @@ -19,7 +19,8 @@ namespace Microsoft::Console::Utils enum PasteFlags { CarriageReturnNewline = 1, - Bracketed = 2 + FilterControlCodes = 2, + Bracketed = 4 }; DEFINE_ENUM_FLAG_OPERATORS(PasteFlags)