From 88ff59feacda892dd5f23a321f7bee0fd9cb909f Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 22 Mar 2022 12:03:18 -0500 Subject: [PATCH 01/27] better align overlay, transparent to clicks now --- src/cascadia/TerminalControl/TermControl.xaml | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/cascadia/TerminalControl/TermControl.xaml b/src/cascadia/TerminalControl/TermControl.xaml index 589f9d4c3f7..052c076b9a9 100644 --- a/src/cascadia/TerminalControl/TermControl.xaml +++ b/src/cascadia/TerminalControl/TermControl.xaml @@ -1244,6 +1244,30 @@ Style="{StaticResource ForkedScrollbarTemplate}" ValueChanged="_ScrollbarChangeHandler" ViewportSize="10" /> + + + + + + + + + + + + + + Date: Tue, 22 Mar 2022 15:41:27 -0500 Subject: [PATCH 02/27] the start of a bunch of actions --- .../TerminalApp/AppActionHandlers.cpp | 105 ++++++++++++++++++ .../TerminalSettingsModel/ActionAndArgs.cpp | 8 ++ .../TerminalSettingsModel/ActionArgs.cpp | 27 +++++ .../TerminalSettingsModel/ActionArgs.h | 14 +++ .../TerminalSettingsModel/ActionArgs.idl | 20 ++++ .../AllShortcutActions.h | 6 + .../Resources/en-US/Resources.resw | 25 +++++ .../TerminalSettingsSerializationHelpers.h | 11 ++ 8 files changed, 216 insertions(+) diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index a82575656a9..96b069ba3af 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -266,6 +266,111 @@ namespace winrt::TerminalApp::implementation args.Handled(true); } + void TerminalPage::_HandleScrollToMark(const IInspectable& /*sender*/, + const ActionEventArgs& args) + { + if (const auto& realArgs = args.ActionArgs().try_as()) + { + _ApplyToActiveControls([realArgs](auto& control) { + const auto currentOffset = control.ScrollOffset(); + const auto marks{ control.ScrollMarks() }; + + std::optional tgt{ std::nullopt }; + + switch (realArgs.Direction()) + { + case ScrollToMarkDirection::Last: + { + int highest = 0; + for (const auto& mark : marks) + { + const auto newY = mark.Start.Y; + if (newY > highest) + { + tgt = mark; + highest = newY; + } + } + break; + } + case ScrollToMarkDirection::First: + { + int lowest = currentOffset; + for (const auto& mark : marks) + { + const auto newY = mark.Start.Y; + if (newY < lowest) + { + tgt = mark; + lowest = newY; + } + } + break; + } + case ScrollToMarkDirection::Next: + { + int minDistance = INT_MAX; + for (const auto& mark : marks) + { + const auto delta = mark.Start.Y - currentOffset; + if (delta > 0 && delta < minDistance) + { + tgt = mark; + minDistance = delta; + } + } + break; + } + case ScrollToMarkDirection::Previous: + default: + { + int minDistance = INT_MAX; + for (const auto& mark : marks) + { + const auto delta = currentOffset - mark.Start.Y; + if (delta > 0 && delta < minDistance) + { + tgt = mark; + minDistance = delta; + } + } + break; + } + } + + if (tgt.has_value()) + { + control.ScrollViewport(tgt->Start.Y); + } + }); + } + args.Handled(true); + } + void TerminalPage::_HandleAddMark(const IInspectable& /*sender*/, + const ActionEventArgs& args) + { + if (const auto& realArgs = args.ActionArgs().try_as()) + { + _ApplyToActiveControls([realArgs](auto& /*control*/) { + }); + } + args.Handled(true); + } + void TerminalPage::_HandleClearMark(const IInspectable& /*sender*/, + const ActionEventArgs& args) + { + _ApplyToActiveControls([](auto& /*control*/) { + }); + args.Handled(true); + } + void TerminalPage::_HandleClearAllMarks(const IInspectable& /*sender*/, + const ActionEventArgs& args) + { + _ApplyToActiveControls([](auto& /*control*/) { + }); + args.Handled(true); + } + void TerminalPage::_HandleFindMatch(const IInspectable& /*sender*/, const ActionEventArgs& args) { diff --git a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp index 7abb6b33f7a..8cb945f9984 100644 --- a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp @@ -39,6 +39,10 @@ static constexpr std::string_view ScrollUpKey{ "scrollUp" }; static constexpr std::string_view ScrollUpPageKey{ "scrollUpPage" }; static constexpr std::string_view ScrollToTopKey{ "scrollToTop" }; static constexpr std::string_view ScrollToBottomKey{ "scrollToBottom" }; +static constexpr std::string_view ScrollToMarkKey{ "scrollToMark" }; +static constexpr std::string_view AddMarkKey{ "addMark" }; +static constexpr std::string_view ClearMarkKey{ "clearMark" }; +static constexpr std::string_view ClearAllMarksKey{ "clearAllMarks" }; static constexpr std::string_view SendInputKey{ "sendInput" }; static constexpr std::string_view SetColorSchemeKey{ "setColorScheme" }; static constexpr std::string_view SetTabColorKey{ "setTabColor" }; @@ -351,6 +355,10 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { ShortcutAction::ScrollUpPage, RS_(L"ScrollUpPageCommandKey") }, { ShortcutAction::ScrollToTop, RS_(L"ScrollToTopCommandKey") }, { ShortcutAction::ScrollToBottom, RS_(L"ScrollToBottomCommandKey") }, + { ShortcutAction::ScrollToMark, RS_(L"ScrollToPreviousMarkCommandKey") }, + { ShortcutAction::AddMark, RS_(L"AddMarkCommandKey") }, + { ShortcutAction::ClearMark, RS_(L"ClearMarkCommandKey") }, + { ShortcutAction::ClearAllMarks, RS_(L"ClearAllMarksCommandKey") }, { ShortcutAction::SendInput, L"" }, { ShortcutAction::SetColorScheme, L"" }, { ShortcutAction::SetTabColor, RS_(L"ResetTabColorCommandKey") }, diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp index 42898ee1668..4fc8201c1d6 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp @@ -29,6 +29,8 @@ #include "CloseTabsAfterArgs.g.cpp" #include "CloseTabArgs.g.cpp" #include "MoveTabArgs.g.cpp" +#include "ScrollToMarkArgs.g.cpp" +#include "AddMarkArgs.g.cpp" #include "FindMatchArgs.g.cpp" #include "ToggleCommandPaletteArgs.g.cpp" #include "NewWindowArgs.g.cpp" @@ -611,6 +613,31 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation return RS_(L"ScrollDownCommandKey"); } + winrt::hstring ScrollToMarkArgs::GenerateName() const + { + switch (Direction()) + { + case ScrollToMarkDirection::Last: + return winrt::hstring{ RS_(L"ScrollToLastMarkCommandKey") }; + case ScrollToMarkDirection::First: + return winrt::hstring{ RS_(L"ScrollToFirstMarkCommandKey") }; + case ScrollToMarkDirection::Next: + return winrt::hstring{ RS_(L"ScrollToNextMarkCommandKey") }; + case ScrollToMarkDirection::Previous: + default: + return winrt::hstring{ RS_(L"ScrollToPreviousMarkCommandKey") }; + } + return winrt::hstring{ RS_(L"ScrollToPreviousMarkCommandKey") }; + } + + winrt::hstring AddMarkArgs::GenerateName() const + { + return winrt::hstring{ + fmt::format(std::wstring_view(RS_(L"AddMarkWithColorCommandKey")), + til::color{ Color() }.ToHexString(true)) + }; + } + winrt::hstring MoveTabArgs::GenerateName() const { winrt::hstring directionString; diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.h b/src/cascadia/TerminalSettingsModel/ActionArgs.h index 05bd831a3ae..7dbd643765f 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.h +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.h @@ -30,6 +30,8 @@ #include "CloseTabArgs.g.h" #include "ScrollUpArgs.g.h" #include "ScrollDownArgs.g.h" +#include "ScrollToMarkArgs.g.h" +#include "AddMarkArgs.g.h" #include "MoveTabArgs.g.h" #include "ToggleCommandPaletteArgs.g.h" #include "FindMatchArgs.g.h" @@ -180,6 +182,14 @@ private: #define SCROLL_DOWN_ARGS(X) \ X(Windows::Foundation::IReference, RowsToScroll, "rowsToScroll", false, nullptr) +//////////////////////////////////////////////////////////////////////////////// +#define SCROLL_TO_MARK_ARGS(X) \ + X(ScrollToMarkDirection, Direction, "direction", false, ScrollToMarkDirection::Previous) + +//////////////////////////////////////////////////////////////////////////////// +#define ADD_MARK_ARGS(X) \ + X(til::color, Color, "color", false, 255, 255, 255) + //////////////////////////////////////////////////////////////////////////////// #define TOGGLE_COMMAND_PALETTE_ARGS(X) \ X(CommandPaletteLaunchMode, LaunchMode, "launchMode", false, CommandPaletteLaunchMode::Action) @@ -612,6 +622,10 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation ACTION_ARGS_STRUCT(ScrollDownArgs, SCROLL_DOWN_ARGS); + ACTION_ARGS_STRUCT(ScrollToMarkArgs, SCROLL_TO_MARK_ARGS); + + ACTION_ARGS_STRUCT(AddMarkArgs, ADD_MARK_ARGS); + ACTION_ARGS_STRUCT(ToggleCommandPaletteArgs, TOGGLE_COMMAND_PALETTE_ARGS); ACTION_ARGS_STRUCT(FindMatchArgs, FIND_MATCH_ARGS); diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.idl b/src/cascadia/TerminalSettingsModel/ActionArgs.idl index ddc05c28dc9..d4253df0735 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.idl +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.idl @@ -107,6 +107,14 @@ namespace Microsoft.Terminal.Settings.Model ToMouse, }; + enum ScrollToMarkDirection + { + Previous, + Next, + First, + Last + }; + [default_interface] runtimeclass NewTerminalArgs { NewTerminalArgs(); NewTerminalArgs(Int32 profileIndex); @@ -290,6 +298,18 @@ namespace Microsoft.Terminal.Settings.Model Windows.Foundation.IReference RowsToScroll { get; }; }; + + [default_interface] runtimeclass ScrollToMarkArgs : IActionArgs + { + ScrollToMarkDirection Direction { get; }; + }; + + [default_interface] runtimeclass AddMarkArgs : IActionArgs + { + Microsoft.Terminal.Core.Color Color { get; }; + // Windows.Foundation.IReference RowsToScroll { get; }; + }; + [default_interface] runtimeclass ToggleCommandPaletteArgs : IActionArgs { CommandPaletteLaunchMode LaunchMode { get; }; diff --git a/src/cascadia/TerminalSettingsModel/AllShortcutActions.h b/src/cascadia/TerminalSettingsModel/AllShortcutActions.h index 32ba5d6b631..4ae0330d73a 100644 --- a/src/cascadia/TerminalSettingsModel/AllShortcutActions.h +++ b/src/cascadia/TerminalSettingsModel/AllShortcutActions.h @@ -47,6 +47,10 @@ ON_ALL_ACTIONS(ScrollDownPage) \ ON_ALL_ACTIONS(ScrollToTop) \ ON_ALL_ACTIONS(ScrollToBottom) \ + ON_ALL_ACTIONS(ScrollToMark) \ + ON_ALL_ACTIONS(AddMark) \ + ON_ALL_ACTIONS(ClearMark) \ + ON_ALL_ACTIONS(ClearAllMarks) \ ON_ALL_ACTIONS(ResizePane) \ ON_ALL_ACTIONS(MoveFocus) \ ON_ALL_ACTIONS(MovePane) \ @@ -116,6 +120,8 @@ ON_ALL_ACTIONS_WITH_ARGS(ResizePane) \ ON_ALL_ACTIONS_WITH_ARGS(ScrollDown) \ ON_ALL_ACTIONS_WITH_ARGS(ScrollUp) \ + ON_ALL_ACTIONS_WITH_ARGS(ScrollToMark) \ + ON_ALL_ACTIONS_WITH_ARGS(AddMark) \ ON_ALL_ACTIONS_WITH_ARGS(SendInput) \ ON_ALL_ACTIONS_WITH_ARGS(SetColorScheme) \ ON_ALL_ACTIONS_WITH_ARGS(SetTabColor) \ diff --git a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw index 5d7d029bfda..684d01dd89e 100644 --- a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw @@ -368,6 +368,31 @@ Scroll to the bottom of history + + Scroll to the the previous mark + + + Scroll to the next mark + + + Scroll to the first mark + + + Scroll to the last mark + + + Add a mark + + + Add a mark, color:{0} + {0} will be replaced with a color in hexadecimal format, like `#123456` + + + Clear mark + + + Clear all marks + Send Input: "{0}" {0} will be replaced with a string of input as defined by the user diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h b/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h index 940843fcbce..2de036af3a6 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h +++ b/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h @@ -546,3 +546,14 @@ JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Settings::Model::InfoBarMessage) pair_type{ "setAsDefault", ValueType::SetAsDefault }, }; }; + +// Possible ScrollToMarkDirection values +JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Settings::Model::ScrollToMarkDirection) +{ + JSON_MAPPINGS(4) = { + pair_type{ "previous", ValueType::Previous }, + pair_type{ "next", ValueType::Next }, + pair_type{ "first", ValueType::First }, + pair_type{ "last", ValueType::Last }, + }; +}; From be8325540b3f7aed4e5a942e68adc850b67d881b Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 23 Mar 2022 08:39:48 -0500 Subject: [PATCH 03/27] Plumb more actions through --- .../TerminalApp/AppActionHandlers.cpp | 11 ++++++-- src/cascadia/TerminalControl/ControlCore.cpp | 28 +++++++++++++++++++ src/cascadia/TerminalControl/ControlCore.h | 6 ++++ src/cascadia/TerminalControl/ICoreState.idl | 4 +++ src/cascadia/TerminalControl/TermControl.cpp | 3 ++ src/cascadia/TerminalControl/TermControl.h | 6 ++++ src/cascadia/TerminalCore/Terminal.cpp | 15 ++++++++++ src/cascadia/TerminalCore/Terminal.hpp | 5 ++++ 8 files changed, 75 insertions(+), 3 deletions(-) diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 96b069ba3af..0393dc74b73 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -351,7 +351,10 @@ namespace winrt::TerminalApp::implementation { if (const auto& realArgs = args.ActionArgs().try_as()) { - _ApplyToActiveControls([realArgs](auto& /*control*/) { + _ApplyToActiveControls([realArgs](auto& control) { + Control::ScrollMark mark; + mark.Color = realArgs.Color(); + control.AddMark(mark); }); } args.Handled(true); @@ -359,14 +362,16 @@ namespace winrt::TerminalApp::implementation void TerminalPage::_HandleClearMark(const IInspectable& /*sender*/, const ActionEventArgs& args) { - _ApplyToActiveControls([](auto& /*control*/) { + _ApplyToActiveControls([](auto& control) { + control.ClearMark(); }); args.Handled(true); } void TerminalPage::_HandleClearAllMarks(const IInspectable& /*sender*/, const ActionEventArgs& args) { - _ApplyToActiveControls([](auto& /*control*/) { + _ApplyToActiveControls([](auto& control) { + control.ClearAllMarks(); }); args.Handled(true); } diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp index c2618b0bc7f..2c88659c343 100644 --- a/src/cascadia/TerminalControl/ControlCore.cpp +++ b/src/cascadia/TerminalControl/ControlCore.cpp @@ -1729,4 +1729,32 @@ namespace winrt::Microsoft::Terminal::Control::implementation // transparency, or our acrylic, or our image. return Opacity() < 1.0f || UseAcrylic() || !_settings->BackgroundImage().empty(); } + + Windows::Foundation::Collections::IVector ControlCore::ScrollMarks() const + { + auto internalMarks{ _terminal->GetScrollMarks() }; + auto v = winrt::single_threaded_observable_vector(); + for (const auto& mark : internalMarks) + { + Control::ScrollMark m{}; + m.Color = winrt::Microsoft::Terminal::Core::Color(mark.color); + m.Start = mark.start.to_core_point(); + m.End = mark.end.to_core_point(); + // m.Category = (size_t)mark.category; // TODO! whatever + m.Comment = winrt::hstring(mark.comment); + + v.Append(m); + } + + return v; + } + + void ControlCore::AddMark(const Control::ScrollMark& mark) + { + ::Microsoft::Console::VirtualTerminal::DispatchTypes::ScrollMark m{}; + m.color = til::color{ mark.Color }; + _terminal->AddMark(m); + } + void ControlCore::ClearMark() { _terminal->ClearMark(); } + void ControlCore::ClearAllMarks() { _terminal->ClearAllMarks(); } } diff --git a/src/cascadia/TerminalControl/ControlCore.h b/src/cascadia/TerminalControl/ControlCore.h index 0d265375bc6..9d8a61b8b4c 100644 --- a/src/cascadia/TerminalControl/ControlCore.h +++ b/src/cascadia/TerminalControl/ControlCore.h @@ -114,6 +114,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation int BufferHeight() const; bool BracketedPasteEnabled() const noexcept; + + Windows::Foundation::Collections::IVector ScrollMarks() const; + void AddMark(const Control::ScrollMark& mark); + void ClearMark(); + void ClearAllMarks(); + #pragma endregion #pragma region ITerminalInput diff --git a/src/cascadia/TerminalControl/ICoreState.idl b/src/cascadia/TerminalControl/ICoreState.idl index fd11bda8f14..d99de02479f 100644 --- a/src/cascadia/TerminalControl/ICoreState.idl +++ b/src/cascadia/TerminalControl/ICoreState.idl @@ -27,5 +27,9 @@ namespace Microsoft.Terminal.Control UInt64 OwningHwnd; + void AddMark(ScrollMark mark); + void ClearMark(); + void ClearAllMarks(); + }; } diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index f45e05cb56f..8603ecdac74 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -2804,4 +2804,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation return _core.OwningHwnd(); } + void TermControl::AddMark(const Control::ScrollMark& mark) { _core.AddMark(mark); } + void TermControl::ClearMark() { _core.ClearMark(); } + void TermControl::ClearAllMarks() { _core.ClearAllMarks(); } } diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index 512ab1476b6..d016c56046e 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -62,6 +62,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation uint64_t OwningHwnd(); void OwningHwnd(uint64_t owner); + + Windows::Foundation::Collections::IVector ScrollMarks() const; + void AddMark(const Control::ScrollMark& mark); + void ClearMark(); + void ClearAllMarks(); + #pragma endregion void ScrollViewport(int viewTop); diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index 90928513fce..160dc7c53af 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -1427,3 +1427,18 @@ void Terminal::_updateUrlDetection() ClearPatternTree(); } } + +void Terminal::ClearMark() +{ + // TODO! just look for one where the cursor is, or where the selection is + + _scrollMarks.clear(); + // Tell the control that the scrollbar has somehow changed. Used as a hack. + _NotifyScrollEvent(); +} +void Terminal::ClearAllMarks() +{ + _scrollMarks.clear(); + // Tell the control that the scrollbar has somehow changed. Used as a hack. + _NotifyScrollEvent(); +} diff --git a/src/cascadia/TerminalCore/Terminal.hpp b/src/cascadia/TerminalCore/Terminal.hpp index df882f3eed0..250442737f7 100644 --- a/src/cascadia/TerminalCore/Terminal.hpp +++ b/src/cascadia/TerminalCore/Terminal.hpp @@ -140,6 +140,11 @@ class Microsoft::Terminal::Core::Terminal final : void UseAlternateScreenBuffer() override; void UseMainScreenBuffer() override; + + void AddMark(const Microsoft::Console::VirtualTerminal::DispatchTypes::ScrollMark& mark); + void ClearMark(); + void ClearAllMarks(); + #pragma endregion #pragma region ITerminalInput From 66a5d9e45bfc20ed97c5be50beedadbf7d17d106 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 23 Mar 2022 08:40:05 -0500 Subject: [PATCH 04/27] Auto prompt detection on enter --- src/cascadia/TerminalCore/ICoreSettings.idl | 3 +++ src/cascadia/TerminalCore/Terminal.cpp | 21 ++++++++++++++++++- src/cascadia/TerminalCore/Terminal.hpp | 1 + .../TerminalSettingsModel/MTSMSettings.h | 3 ++- .../TerminalSettingsModel/Profile.idl | 1 + .../TerminalSettings.cpp | 1 + .../TerminalSettingsModel/TerminalSettings.h | 2 ++ src/cascadia/inc/ControlProperties.h | 3 ++- 8 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/cascadia/TerminalCore/ICoreSettings.idl b/src/cascadia/TerminalCore/ICoreSettings.idl index 5b05a72c05e..1f3c78aa09b 100644 --- a/src/cascadia/TerminalCore/ICoreSettings.idl +++ b/src/cascadia/TerminalCore/ICoreSettings.idl @@ -26,6 +26,9 @@ namespace Microsoft.Terminal.Core Windows.Foundation.IReference TabColor; Windows.Foundation.IReference StartingTabColor; + + Boolean AutoMarkPrompts; + }; } diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index 160dc7c53af..1d6cc6cd2e1 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -48,7 +48,8 @@ Terminal::Terminal() : _selection{ std::nullopt }, _taskbarState{ 0 }, _taskbarProgress{ 0 }, - _trimBlockSelection{ false } + _trimBlockSelection{ false }, + _autoMarkPrompts{ false } { auto dispatch = std::make_unique(*this); auto engine = std::make_unique(std::move(dispatch)); @@ -121,6 +122,7 @@ void Terminal::UpdateSettings(ICoreSettings settings) _suppressApplicationTitle = settings.SuppressApplicationTitle(); _startingTitle = settings.StartingTitle(); _trimBlockSelection = settings.TrimBlockSelection(); + _autoMarkPrompts = settings.AutoMarkPrompts(); _terminalInput->ForceDisableWin32InputMode(settings.ForceVTInput()); @@ -681,6 +683,14 @@ bool Terminal::SendKeyEvent(const WORD vkey, return false; } + //if (_autoMarkPrompts && vkey == VK_RETURN && !_inAltBuffer()) + //{ + // DispatchTypes::ScrollMark mark; + // mark.category = DispatchTypes::MarkCategory::Prompt; + // mark.color = til::color(255, 255, 255); // should this be configurable? + // AddMark(mark); + //} + KeyEvent keyEv{ keyDown, 1, vkey, sc, ch, states.Value() }; return _terminalInput->HandleKey(&keyEv); } @@ -735,6 +745,15 @@ bool Terminal::SendCharEvent(const wchar_t ch, const WORD scanCode, const Contro vkey = _VirtualKeyFromCharacter(ch); } + + if (_autoMarkPrompts && vkey == VK_RETURN && !_inAltBuffer()) + { + DispatchTypes::ScrollMark mark; + mark.category = DispatchTypes::MarkCategory::Prompt; + mark.color = til::color(255, 255, 255); // should this be configurable? + AddMark(mark); + } + // Unfortunately, the UI doesn't give us both a character down and a // character up event, only a character received event. So fake sending both // to the terminal input translator. Unless it's in win32-input-mode, it'll diff --git a/src/cascadia/TerminalCore/Terminal.hpp b/src/cascadia/TerminalCore/Terminal.hpp index 250442737f7..ab0fa972216 100644 --- a/src/cascadia/TerminalCore/Terminal.hpp +++ b/src/cascadia/TerminalCore/Terminal.hpp @@ -299,6 +299,7 @@ class Microsoft::Terminal::Core::Terminal final : bool _suppressApplicationTitle; bool _bracketedPasteMode; bool _trimBlockSelection; + bool _autoMarkPrompts; size_t _taskbarState; size_t _taskbarProgress; diff --git a/src/cascadia/TerminalSettingsModel/MTSMSettings.h b/src/cascadia/TerminalSettingsModel/MTSMSettings.h index 279237f9fba..74a6a22e563 100644 --- a/src/cascadia/TerminalSettingsModel/MTSMSettings.h +++ b/src/cascadia/TerminalSettingsModel/MTSMSettings.h @@ -77,7 +77,8 @@ Author(s): X(bool, UseAtlasEngine, "experimental.useAtlasEngine", false) \ X(Windows::Foundation::Collections::IVector, BellSound, "bellSound", nullptr) \ X(bool, Elevate, "elevate", false) \ - X(bool, VtPassthrough, "experimental.connection.passthroughMode", false) + X(bool, VtPassthrough, "experimental.connection.passthroughMode", false) \ + X(bool, AutoMarkPrompts, "experimental.autoMarkPrompts", false) // Intentionally omitted Profile settings: // * Name diff --git a/src/cascadia/TerminalSettingsModel/Profile.idl b/src/cascadia/TerminalSettingsModel/Profile.idl index f8f3dc8d1cd..31f1e22eabb 100644 --- a/src/cascadia/TerminalSettingsModel/Profile.idl +++ b/src/cascadia/TerminalSettingsModel/Profile.idl @@ -84,5 +84,6 @@ namespace Microsoft.Terminal.Settings.Model INHERITABLE_PROFILE_SETTING(Windows.Foundation.Collections.IVector, BellSound); INHERITABLE_PROFILE_SETTING(Boolean, Elevate); + INHERITABLE_PROFILE_SETTING(Boolean, AutoMarkPrompts); } } diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp index 0b56266b708..14c9c87bd2d 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp @@ -266,6 +266,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation } _Elevate = profile.Elevate(); + _AutoMarkPrompts = profile.AutoMarkPrompts(); } // Method Description: diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.h b/src/cascadia/TerminalSettingsModel/TerminalSettings.h index 40301422a8a..353c533df62 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.h +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.h @@ -155,6 +155,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation INHERITABLE_SETTING(Model::TerminalSettings, bool, Elevate, false); + INHERITABLE_SETTING(Model::TerminalSettings, bool, AutoMarkPrompts, false); + private: std::optional> _ColorTable; gsl::span _getColorTableImpl(); diff --git a/src/cascadia/inc/ControlProperties.h b/src/cascadia/inc/ControlProperties.h index 08f114eb389..ff1fbfc4fb9 100644 --- a/src/cascadia/inc/ControlProperties.h +++ b/src/cascadia/inc/ControlProperties.h @@ -46,7 +46,8 @@ X(bool, ForceVTInput, false) \ X(winrt::hstring, StartingTitle) \ X(bool, DetectURLs, true) \ - X(bool, VtPassthrough, false) + X(bool, VtPassthrough, false) \ + X(bool, AutoMarkPrompts) // --------------------------- Control Settings --------------------------- // All of these settings are defined in IControlSettings. From 928002b7402e7726e5eebb537a5740b7fc7437e6 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Thu, 24 Mar 2022 09:00:44 -0500 Subject: [PATCH 05/27] setting to enable scrollbar marks --- .../TerminalControl/IControlSettings.idl | 1 + src/cascadia/TerminalControl/TermControl.cpp | 48 +++++++++++++++++++ src/cascadia/TerminalControl/TermControl.h | 1 + .../TerminalSettingsModel/MTSMSettings.h | 3 +- .../TerminalSettingsModel/Profile.idl | 1 + .../TerminalSettings.cpp | 1 + .../TerminalSettingsModel/TerminalSettings.h | 1 + src/cascadia/inc/ControlProperties.h | 3 +- 8 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/cascadia/TerminalControl/IControlSettings.idl b/src/cascadia/TerminalControl/IControlSettings.idl index 8f0c31f58fc..ba993611e13 100644 --- a/src/cascadia/TerminalControl/IControlSettings.idl +++ b/src/cascadia/TerminalControl/IControlSettings.idl @@ -56,5 +56,6 @@ namespace Microsoft.Terminal.Control // Experimental Settings Boolean ForceFullRepaintRendering { get; }; Boolean SoftwareRendering { get; }; + Boolean ShowMarks { get; }; }; } diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 8603ecdac74..f6141536fac 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -148,6 +148,52 @@ namespace winrt::Microsoft::Terminal::Control::implementation _ApplyUISettings(); } + void TermControl::_throttledUpdateScrollbar(const ScrollBarUpdate& update) + { + // Assumptions: + // * we're already not closing + // * caller already checked weak ptr to make sure we're still alive + + _isInternalScrollBarUpdate = true; + + auto scrollBar = ScrollBar(); + if (update.newValue) + { + scrollBar.Value(*update.newValue); + } + scrollBar.Maximum(update.newMaximum); + scrollBar.Minimum(update.newMinimum); + scrollBar.ViewportSize(update.newViewportSize); + // scroll one full screen worth at a time when the scroll bar is clicked + scrollBar.LargeChange(std::max(update.newViewportSize - 1, 0.)); + + _isInternalScrollBarUpdate = false; + + if (_showMarksInScrollbar) + { + // Update scrollbar marks + ScrollBarCanvas().Children().Clear(); + const auto marks{ _core.ScrollMarks() }; + const auto fullHeight{ ScrollBarCanvas().ActualHeight() }; + const auto totalBufferRows{ update.newMaximum + update.newViewportSize }; + + for (const auto m : marks) + { + Windows::UI::Xaml::Shapes::Rectangle r; + Media::SolidColorBrush brush{}; + brush.Color(static_cast(m.Color)); + r.Fill(brush); + r.Width(16.0f / 3.0f); // pip width + r.Height(2); + const auto markRow = m.Start.Y; + const auto fractionalHeight = markRow / totalBufferRows; + const auto relativePos = fractionalHeight * fullHeight; + ScrollBarCanvas().Children().Append(r); + Windows::UI::Xaml::Controls::Canvas::SetTop(r, relativePos); + } + } + } + // Method Description: // - Loads the search box from the xaml UI and focuses it. void TermControl::CreateSearchBoxControl() @@ -383,6 +429,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation newMargin.Right, newMargin.Bottom }); } + + _showMarksInScrollbar = settings.ShowMarks(); // TODO! hot reload me } // Method Description: diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index d016c56046e..0ab8420f7c0 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -193,6 +193,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation std::optional _blinkTimer; winrt::Windows::UI::Xaml::Controls::SwapChainPanel::LayoutUpdated_revoker _layoutUpdatedRevoker; + bool _showMarksInScrollbar{ false }; inline bool _IsClosing() const noexcept { diff --git a/src/cascadia/TerminalSettingsModel/MTSMSettings.h b/src/cascadia/TerminalSettingsModel/MTSMSettings.h index 74a6a22e563..99ecb9ec1eb 100644 --- a/src/cascadia/TerminalSettingsModel/MTSMSettings.h +++ b/src/cascadia/TerminalSettingsModel/MTSMSettings.h @@ -78,7 +78,8 @@ Author(s): X(Windows::Foundation::Collections::IVector, BellSound, "bellSound", nullptr) \ X(bool, Elevate, "elevate", false) \ X(bool, VtPassthrough, "experimental.connection.passthroughMode", false) \ - X(bool, AutoMarkPrompts, "experimental.autoMarkPrompts", false) + X(bool, AutoMarkPrompts, "experimental.autoMarkPrompts", false) \ + X(bool, ShowMarks, "experimental.showMarksOnScrollbar", false) // Intentionally omitted Profile settings: // * Name diff --git a/src/cascadia/TerminalSettingsModel/Profile.idl b/src/cascadia/TerminalSettingsModel/Profile.idl index 31f1e22eabb..76357b65898 100644 --- a/src/cascadia/TerminalSettingsModel/Profile.idl +++ b/src/cascadia/TerminalSettingsModel/Profile.idl @@ -85,5 +85,6 @@ namespace Microsoft.Terminal.Settings.Model INHERITABLE_PROFILE_SETTING(Boolean, Elevate); INHERITABLE_PROFILE_SETTING(Boolean, AutoMarkPrompts); + INHERITABLE_PROFILE_SETTING(Boolean, ShowMarks); } } diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp index 14c9c87bd2d..6f17e656cb1 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp @@ -267,6 +267,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation _Elevate = profile.Elevate(); _AutoMarkPrompts = profile.AutoMarkPrompts(); + _ShowMarks = profile.ShowMarks(); } // Method Description: diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.h b/src/cascadia/TerminalSettingsModel/TerminalSettings.h index 353c533df62..c052ba536d8 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.h +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.h @@ -156,6 +156,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation INHERITABLE_SETTING(Model::TerminalSettings, bool, Elevate, false); INHERITABLE_SETTING(Model::TerminalSettings, bool, AutoMarkPrompts, false); + INHERITABLE_SETTING(Model::TerminalSettings, bool, ShowMarks, false); private: std::optional> _ColorTable; diff --git a/src/cascadia/inc/ControlProperties.h b/src/cascadia/inc/ControlProperties.h index ff1fbfc4fb9..a252109e692 100644 --- a/src/cascadia/inc/ControlProperties.h +++ b/src/cascadia/inc/ControlProperties.h @@ -69,4 +69,5 @@ X(winrt::Microsoft::Terminal::Control::TextAntialiasingMode, AntialiasingMode, winrt::Microsoft::Terminal::Control::TextAntialiasingMode::Grayscale) \ X(bool, ForceFullRepaintRendering, false) \ X(bool, SoftwareRendering, false) \ - X(bool, UseAtlasEngine, false) + X(bool, UseAtlasEngine, false) \ + X(bool, ShowMarks, false) From 036ebb18fddd24ac7da6209577ef0aaeb831df27 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Thu, 24 Mar 2022 10:11:10 -0500 Subject: [PATCH 06/27] Be able to mark a selection via the action, because that's handy! --- src/cascadia/TerminalControl/ControlCore.cpp | 14 ++++++++++- src/cascadia/TerminalCore/Terminal.cpp | 16 ++++++++++++- src/cascadia/TerminalCore/Terminal.hpp | 5 ++++ src/cascadia/TerminalCore/TerminalApi.cpp | 6 +++++ .../TerminalCore/TerminalDispatch.cpp | 23 +++++++++++++++++++ 5 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp index 2c88659c343..642d84e779b 100644 --- a/src/cascadia/TerminalControl/ControlCore.cpp +++ b/src/cascadia/TerminalControl/ControlCore.cpp @@ -1753,7 +1753,19 @@ namespace winrt::Microsoft::Terminal::Control::implementation { ::Microsoft::Console::VirtualTerminal::DispatchTypes::ScrollMark m{}; m.color = til::color{ mark.Color }; - _terminal->AddMark(m); + + if (HasSelection()) + { + m.start = til::point{ _terminal->GetSelectionAnchor() }; + m.end = til::point{ _terminal->GetSelectionEnd() }; + } + else + { + m.start = m.end = til::point{ _terminal->GetTextBuffer().GetCursor().GetPosition() }; + } + + // The version of this that only accepts a ScrollMark is buffer2 + _terminal->AddMark(m, m.start, m.end); } void ControlCore::ClearMark() { _terminal->ClearMark(); } void ControlCore::ClearAllMarks() { _terminal->ClearAllMarks(); } diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index 1d6cc6cd2e1..a6ee68208b1 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -745,7 +745,6 @@ bool Terminal::SendCharEvent(const wchar_t ch, const WORD scanCode, const Contro vkey = _VirtualKeyFromCharacter(ch); } - if (_autoMarkPrompts && vkey == VK_RETURN && !_inAltBuffer()) { DispatchTypes::ScrollMark mark; @@ -1447,6 +1446,21 @@ void Terminal::_updateUrlDetection() } } +void Terminal::AddMark(const Microsoft::Console::VirtualTerminal::DispatchTypes::ScrollMark& mark, + const til::point& start, + const til::point& end) +{ + DispatchTypes::ScrollMark m = mark; + m.start = start; + m.end = end; + // // m.timestamp = now() + + _scrollMarks.push_back(m); + + // Tell the control that the scrollbar has somehow changed. Used as a hack. + _NotifyScrollEvent(); +} + void Terminal::ClearMark() { // TODO! just look for one where the cursor is, or where the selection is diff --git a/src/cascadia/TerminalCore/Terminal.hpp b/src/cascadia/TerminalCore/Terminal.hpp index ab0fa972216..3a41b2dc634 100644 --- a/src/cascadia/TerminalCore/Terminal.hpp +++ b/src/cascadia/TerminalCore/Terminal.hpp @@ -94,6 +94,11 @@ class Microsoft::Terminal::Core::Terminal final : RenderSettings& GetRenderSettings() noexcept { return _renderSettings; }; const RenderSettings& GetRenderSettings() const noexcept { return _renderSettings; }; + const std::vector& GetScrollMarks() const; + void AddMark(const Microsoft::Console::VirtualTerminal::DispatchTypes::ScrollMark& mark, + const til::point& start, + const til::point& end); + #pragma region ITerminalApi // These methods are defined in TerminalApi.cpp void PrintString(std::wstring_view stringView) override; diff --git a/src/cascadia/TerminalCore/TerminalApi.cpp b/src/cascadia/TerminalCore/TerminalApi.cpp index 5b9dfe8e8ec..83a9576e04e 100644 --- a/src/cascadia/TerminalCore/TerminalApi.cpp +++ b/src/cascadia/TerminalCore/TerminalApi.cpp @@ -699,3 +699,9 @@ void Terminal::UseMainScreenBuffer() } CATCH_LOG(); } + +void Terminal::AddMark(const Microsoft::Console::VirtualTerminal::DispatchTypes::ScrollMark& mark) +{ + const til::point cursorPos{ _activeBuffer().GetCursor().GetPosition() }; + AddMark(mark, cursorPos, cursorPos); +} diff --git a/src/cascadia/TerminalCore/TerminalDispatch.cpp b/src/cascadia/TerminalCore/TerminalDispatch.cpp index 689e29de93a..e27215df51d 100644 --- a/src/cascadia/TerminalCore/TerminalDispatch.cpp +++ b/src/cascadia/TerminalCore/TerminalDispatch.cpp @@ -597,6 +597,29 @@ bool TerminalDispatch::DoConEmuAction(const std::wstring_view string) return false; } +bool TerminalDispatch::DoITerm2Action(const std::wstring_view string) +{ + const auto parts = Utils::SplitString(string, L';'); + + if (parts.size() < 1) + { + return false; + } + + const auto action{ parts[0] }; + + if (action == L"SetMark") + { + DispatchTypes::ScrollMark mark; + mark.category = DispatchTypes::MarkCategory::Prompt; + mark.color = til::color(255, 255, 255); // should this be configurable? + // mark.start = mark.end = til::point{ _terminalApi.GetCursorPosition() }; + _terminalApi.AddMark(mark); + return true; + } + return false; +} + // Routine Description: // - Helper to send a string reply to the input stream of the console. // - Used by various commands where the program attached would like a reply to one of the commands issued. From 958dfa38885a845e1d34c100055404ba504743bf Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 19 Apr 2022 16:56:11 -0500 Subject: [PATCH 07/27] howd i miuss this --- src/cascadia/TerminalControl/TermControl.cpp | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index f6141536fac..68b52045061 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -124,20 +124,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation [weakThis = get_weak()](const auto& update) { if (auto control{ weakThis.get() }; !control->_IsClosing()) { - control->_isInternalScrollBarUpdate = true; - - auto scrollBar = control->ScrollBar(); - if (update.newValue) - { - scrollBar.Value(*update.newValue); - } - scrollBar.Maximum(update.newMaximum); - scrollBar.Minimum(update.newMinimum); - scrollBar.ViewportSize(update.newViewportSize); - // scroll one full screen worth at a time when the scroll bar is clicked - scrollBar.LargeChange(std::max(update.newViewportSize - 1, 0.)); - - control->_isInternalScrollBarUpdate = false; + control->_throttledUpdateScrollbar(update); } }); From fb0bc53fa0760ca1be8eeac5bef236b5fbbfa708 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 22 Mar 2022 11:19:56 -0500 Subject: [PATCH 08/27] plumb iterm2 marks thru to the control, draw on scrollbar --- src/cascadia/TerminalControl/ICoreState.idl | 18 +++++++++++++++ src/cascadia/TerminalControl/TermControl.cpp | 11 +++++++++- src/cascadia/TerminalControl/TermControl.h | 1 + src/cascadia/TerminalControl/pch.h | 1 + src/cascadia/TerminalCore/ITerminalApi.hpp | 2 ++ src/cascadia/TerminalCore/Terminal.cpp | 13 +++++++++++ src/cascadia/TerminalCore/Terminal.hpp | 5 ++++- .../TerminalCore/TerminalDispatch.cpp | 7 +++++- .../TerminalCore/TerminalDispatch.hpp | 2 ++ src/terminal/adapter/DispatchTypes.hpp | 22 +++++++++++++++++++ src/terminal/adapter/ITermDispatch.hpp | 2 ++ src/terminal/adapter/adaptDispatch.cpp | 11 ++++++++++ src/terminal/adapter/adaptDispatch.hpp | 2 ++ src/terminal/adapter/termDispatch.hpp | 2 ++ .../parser/OutputStateMachineEngine.cpp | 5 +++++ .../parser/OutputStateMachineEngine.hpp | 3 ++- 16 files changed, 103 insertions(+), 4 deletions(-) diff --git a/src/cascadia/TerminalControl/ICoreState.idl b/src/cascadia/TerminalControl/ICoreState.idl index d99de02479f..d35393643e7 100644 --- a/src/cascadia/TerminalControl/ICoreState.idl +++ b/src/cascadia/TerminalControl/ICoreState.idl @@ -3,6 +3,23 @@ namespace Microsoft.Terminal.Control { + enum MarkCategory + { + Prompt = 0, + Error = 1, + Warning = 2, + Info = 3 + }; + struct ScrollMark + { + Microsoft.Terminal.Core.Color Color; + Microsoft.Terminal.Core.Point Start; + Microsoft.Terminal.Core.Point End; // exclusive + // UInt64 timestamp; + MarkCategory Category; + String Comment; + }; + // These are properties of the TerminalCore that should be queryable by the // rest of the app. interface ICoreState @@ -30,6 +47,7 @@ namespace Microsoft.Terminal.Control void AddMark(ScrollMark mark); void ClearMark(); void ClearAllMarks(); + IVector ScrollMarks { get; }; }; } diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 68b52045061..52ee59db9ac 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -2839,7 +2839,16 @@ namespace winrt::Microsoft::Terminal::Control::implementation return _core.OwningHwnd(); } - void TermControl::AddMark(const Control::ScrollMark& mark) { _core.AddMark(mark); } + void TermControl::AddMark(const Control::ScrollMark& mark) + { + _core.AddMark(mark); + } void TermControl::ClearMark() { _core.ClearMark(); } void TermControl::ClearAllMarks() { _core.ClearAllMarks(); } + + Windows::Foundation::Collections::IVector TermControl::ScrollMarks() const + { + return _core.ScrollMarks(); + } + } diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index 0ab8420f7c0..32cbb7d3978 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -286,6 +286,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation void _coreRaisedNotice(const IInspectable& s, const Control::NoticeEventArgs& args); void _coreWarningBell(const IInspectable& sender, const IInspectable& args); void _coreFoundMatch(const IInspectable& sender, const Control::FoundResultsArgs& args); + void _throttledUpdateScrollbar(const ScrollBarUpdate& update); }; } diff --git a/src/cascadia/TerminalControl/pch.h b/src/cascadia/TerminalControl/pch.h index 7d710c5b5c7..4958dac941d 100644 --- a/src/cascadia/TerminalControl/pch.h +++ b/src/cascadia/TerminalControl/pch.h @@ -45,6 +45,7 @@ #include #include #include +#include #include #include diff --git a/src/cascadia/TerminalCore/ITerminalApi.hpp b/src/cascadia/TerminalCore/ITerminalApi.hpp index 7f41e0ce71f..5f9ccba5fb7 100644 --- a/src/cascadia/TerminalCore/ITerminalApi.hpp +++ b/src/cascadia/TerminalCore/ITerminalApi.hpp @@ -72,6 +72,8 @@ namespace Microsoft::Terminal::Core virtual void UseAlternateScreenBuffer() = 0; virtual void UseMainScreenBuffer() = 0; + virtual void AddMark(const Microsoft::Console::VirtualTerminal::DispatchTypes::ScrollMark& mark) = 0; + protected: ITerminalApi() = default; }; diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index a6ee68208b1..43d4fed6ae7 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -1179,6 +1179,14 @@ void Terminal::_AdjustCursorPosition(const COORD proposedPosition) if (rowsPushedOffTopOfBuffer != 0) { + for (auto& mark : _scrollMarks) + { + mark.start.y -= rowsPushedOffTopOfBuffer; + } + _scrollMarks.erase(std::remove_if(_scrollMarks.begin(), + _scrollMarks.end(), + [](const VirtualTerminal::DispatchTypes::ScrollMark& m) { return m.start.y < 0; }), + _scrollMarks.end()); // We have to report the delta here because we might have circled the text buffer. // That didn't change the viewport and therefore the TriggerScroll(void) // method can't detect the delta on its own. @@ -1475,3 +1483,8 @@ void Terminal::ClearAllMarks() // Tell the control that the scrollbar has somehow changed. Used as a hack. _NotifyScrollEvent(); } + +const std::vector& Terminal::GetScrollMarks() const +{ + return _scrollMarks; +} diff --git a/src/cascadia/TerminalCore/Terminal.hpp b/src/cascadia/TerminalCore/Terminal.hpp index 3a41b2dc634..60cf5bc67b9 100644 --- a/src/cascadia/TerminalCore/Terminal.hpp +++ b/src/cascadia/TerminalCore/Terminal.hpp @@ -101,7 +101,8 @@ class Microsoft::Terminal::Core::Terminal final : #pragma region ITerminalApi // These methods are defined in TerminalApi.cpp - void PrintString(std::wstring_view stringView) override; + void + PrintString(std::wstring_view stringView) override; bool ReturnResponse(std::wstring_view responseString) override; TextAttribute GetTextAttributes() const override; void SetTextAttributes(const TextAttribute& attrs) override; @@ -370,6 +371,8 @@ class Microsoft::Terminal::Core::Terminal final : }; std::optional _lastKeyEventCodes; + std::vector _scrollMarks; + static WORD _ScanCodeFromVirtualKey(const WORD vkey) noexcept; static WORD _VirtualKeyFromScanCode(const WORD scanCode) noexcept; static WORD _VirtualKeyFromCharacter(const wchar_t ch) noexcept; diff --git a/src/cascadia/TerminalCore/TerminalDispatch.cpp b/src/cascadia/TerminalCore/TerminalDispatch.cpp index e27215df51d..c4107a93e51 100644 --- a/src/cascadia/TerminalCore/TerminalDispatch.cpp +++ b/src/cascadia/TerminalCore/TerminalDispatch.cpp @@ -597,6 +597,12 @@ bool TerminalDispatch::DoConEmuAction(const std::wstring_view string) return false; } +// Method Description: +// - Performs a iTerm2 action +// Arguments: +// - string: contains the parameters that define which action we do +// Return Value: +// - true bool TerminalDispatch::DoITerm2Action(const std::wstring_view string) { const auto parts = Utils::SplitString(string, L';'); @@ -613,7 +619,6 @@ bool TerminalDispatch::DoITerm2Action(const std::wstring_view string) DispatchTypes::ScrollMark mark; mark.category = DispatchTypes::MarkCategory::Prompt; mark.color = til::color(255, 255, 255); // should this be configurable? - // mark.start = mark.end = til::point{ _terminalApi.GetCursorPosition() }; _terminalApi.AddMark(mark); return true; } diff --git a/src/cascadia/TerminalCore/TerminalDispatch.hpp b/src/cascadia/TerminalCore/TerminalDispatch.hpp index 42188bc4ecf..bc10086053c 100644 --- a/src/cascadia/TerminalCore/TerminalDispatch.hpp +++ b/src/cascadia/TerminalCore/TerminalDispatch.hpp @@ -85,6 +85,8 @@ class TerminalDispatch : public Microsoft::Console::VirtualTerminal::TermDispatc bool DoConEmuAction(const std::wstring_view string) override; + bool DoITerm2Action(const std::wstring_view string) override; + bool CursorSaveState() override; bool CursorRestoreState() override; diff --git a/src/terminal/adapter/DispatchTypes.hpp b/src/terminal/adapter/DispatchTypes.hpp index 4510626f50b..3467e5fe064 100644 --- a/src/terminal/adapter/DispatchTypes.hpp +++ b/src/terminal/adapter/DispatchTypes.hpp @@ -477,4 +477,26 @@ namespace Microsoft::Console::VirtualTerminal::DispatchTypes constexpr short s_sDECCOLMSetColumns = 132; constexpr short s_sDECCOLMResetColumns = 80; + enum class MarkCategory : size_t + { + Prompt = 0, + Error = 1, + Warning = 2, + Info = 3 + }; + + struct ScrollMark + { + til::color color; + til::point start; + til::point end; // exclusive + uint64_t timestamp; + MarkCategory category; + std::wstring comment; + // shape? Does that even make sense? + // * Arrow (iterm2), + // * bracket (terminal.app prompts), + // * bar(terminal.app mark), + // * brace? + }; } diff --git a/src/terminal/adapter/ITermDispatch.hpp b/src/terminal/adapter/ITermDispatch.hpp index f0f48fa2d2f..78e1007b2e8 100644 --- a/src/terminal/adapter/ITermDispatch.hpp +++ b/src/terminal/adapter/ITermDispatch.hpp @@ -133,6 +133,8 @@ class Microsoft::Console::VirtualTerminal::ITermDispatch virtual bool DoConEmuAction(const std::wstring_view string) = 0; + virtual bool DoITerm2Action(const std::wstring_view string) = 0; + virtual StringHandler DownloadDRCS(const size_t fontNumber, const VTParameter startChar, const DispatchTypes::DrcsEraseControl eraseControl, diff --git a/src/terminal/adapter/adaptDispatch.cpp b/src/terminal/adapter/adaptDispatch.cpp index 53b54f3b5ee..ba4330aa215 100644 --- a/src/terminal/adapter/adaptDispatch.cpp +++ b/src/terminal/adapter/adaptDispatch.cpp @@ -2329,6 +2329,17 @@ bool AdaptDispatch::DoConEmuAction(const std::wstring_view /*string*/) noexcept return false; } +// Method Description: +// - Ascribes to the ITermDispatch interface +// - Not actually used in conhost +// Return Value: +// - false (so that the command gets flushed to terminal) +bool AdaptDispatch::DoITerm2Action(const std::wstring_view /*string*/) noexcept +{ + // TODO! may need to flush manually, to make sure marks end up on the right line, like alt buffer sequence. Maybe. + return false; +} + // Method Description: // - DECDLD - Downloads one or more characters of a dynamically redefinable // character set (DRCS) with a specified pixel pattern. The pixel array is diff --git a/src/terminal/adapter/adaptDispatch.hpp b/src/terminal/adapter/adaptDispatch.hpp index 89bc2eb3647..dab92d4db25 100644 --- a/src/terminal/adapter/adaptDispatch.hpp +++ b/src/terminal/adapter/adaptDispatch.hpp @@ -128,6 +128,8 @@ namespace Microsoft::Console::VirtualTerminal bool DoConEmuAction(const std::wstring_view string) noexcept override; + bool DoITerm2Action(const std::wstring_view string) noexcept override; + StringHandler DownloadDRCS(const size_t fontNumber, const VTParameter startChar, const DispatchTypes::DrcsEraseControl eraseControl, diff --git a/src/terminal/adapter/termDispatch.hpp b/src/terminal/adapter/termDispatch.hpp index 0d75258ed30..79c7c071a55 100644 --- a/src/terminal/adapter/termDispatch.hpp +++ b/src/terminal/adapter/termDispatch.hpp @@ -126,6 +126,8 @@ class Microsoft::Console::VirtualTerminal::TermDispatch : public Microsoft::Cons bool DoConEmuAction(const std::wstring_view /*string*/) override { return false; } + bool DoITerm2Action(const std::wstring_view /*string*/) override { return false; } + StringHandler DownloadDRCS(const size_t /*fontNumber*/, const VTParameter /*startChar*/, const DispatchTypes::DrcsEraseControl /*eraseControl*/, diff --git a/src/terminal/parser/OutputStateMachineEngine.cpp b/src/terminal/parser/OutputStateMachineEngine.cpp index 06eb2a7467e..b6c36a03ba0 100644 --- a/src/terminal/parser/OutputStateMachineEngine.cpp +++ b/src/terminal/parser/OutputStateMachineEngine.cpp @@ -829,6 +829,11 @@ bool OutputStateMachineEngine::ActionOscDispatch(const wchar_t /*wch*/, success = _dispatch->DoConEmuAction(string); break; } + case OscActionCodes::ITerm2Action: + { + success = _dispatch->DoITerm2Action(string); + break; + } default: // If no functions to call, overall dispatch was a failure. success = false; diff --git a/src/terminal/parser/OutputStateMachineEngine.hpp b/src/terminal/parser/OutputStateMachineEngine.hpp index 8f6305bdc7c..6c909fa39b7 100644 --- a/src/terminal/parser/OutputStateMachineEngine.hpp +++ b/src/terminal/parser/OutputStateMachineEngine.hpp @@ -184,7 +184,8 @@ namespace Microsoft::Console::VirtualTerminal SetClipboard = 52, ResetForegroundColor = 110, // Not implemented ResetBackgroundColor = 111, // Not implemented - ResetCursorColor = 112 + ResetCursorColor = 112, + ITerm2Action = 1337, }; bool _GetOscTitle(const std::wstring_view string, From b7a84456bf8105f76777221d1ee7eb4e69cf9722 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 20 Apr 2022 06:12:38 -0500 Subject: [PATCH 09/27] let the user overscroll marks to the start/end --- src/cascadia/TerminalApp/AppActionHandlers.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 0393dc74b73..e87f26f5c73 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -276,12 +276,12 @@ namespace winrt::TerminalApp::implementation const auto marks{ control.ScrollMarks() }; std::optional tgt{ std::nullopt }; - - switch (realArgs.Direction()) + const auto dir{ realArgs.Direction() }; + switch (dir) { case ScrollToMarkDirection::Last: { - int highest = 0; + int highest = currentOffset; for (const auto& mark : marks) { const auto newY = mark.Start.Y; @@ -342,6 +342,17 @@ namespace winrt::TerminalApp::implementation { control.ScrollViewport(tgt->Start.Y); } + else + { + if (dir == ScrollToMarkDirection::Last || dir == ScrollToMarkDirection::Next) + { + control.ScrollViewport(control.BufferHeight()); + } + else if (dir == ScrollToMarkDirection::First || dir == ScrollToMarkDirection::Previous) + { + control.ScrollViewport(0); + } + } }); } args.Handled(true); From df005057855702b1b7ef1fe0927925d49db56cd6 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 20 Apr 2022 07:06:03 -0500 Subject: [PATCH 10/27] clearing a selection of marks is important too --- src/cascadia/TerminalCore/Terminal.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index 43d4fed6ae7..0c0038d45db 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -1471,9 +1471,27 @@ void Terminal::AddMark(const Microsoft::Console::VirtualTerminal::DispatchTypes: void Terminal::ClearMark() { - // TODO! just look for one where the cursor is, or where the selection is + // Look for one where the cursor is, or where the selection is if we have + // one. Any mark that intersects the cursor/selection, on either side + // (inclusive), will get cleared. + const til::point cursor{ _activeBuffer().GetCursor().GetPosition() }; + til::point start{ cursor }; + til::point end{ cursor }; + + if (IsSelectionActive()) + { + start = til::point{ GetSelectionAnchor() }; + end = til::point{ GetSelectionEnd() }; + } + + _scrollMarks.erase(std::remove_if(_scrollMarks.begin(), + _scrollMarks.end(), + [&start, &end](const auto& m) { + return (m.start >= start && m.start <= end) || + (m.end >= start && m.end <= end); + }), + _scrollMarks.end()); - _scrollMarks.clear(); // Tell the control that the scrollbar has somehow changed. Used as a hack. _NotifyScrollEvent(); } From 0fa57650f729d8a8854616e0d01520c2779755d9 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 20 Apr 2022 09:21:34 -0500 Subject: [PATCH 11/27] some cleanup --- src/cascadia/TerminalControl/ICoreState.idl | 1 - src/cascadia/TerminalCore/Terminal.cpp | 19 +++++++++---------- .../TerminalCore/TerminalDispatch.cpp | 3 ++- src/terminal/adapter/DispatchTypes.hpp | 10 +++------- 4 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/cascadia/TerminalControl/ICoreState.idl b/src/cascadia/TerminalControl/ICoreState.idl index d35393643e7..5585dd90d8f 100644 --- a/src/cascadia/TerminalControl/ICoreState.idl +++ b/src/cascadia/TerminalControl/ICoreState.idl @@ -15,7 +15,6 @@ namespace Microsoft.Terminal.Control Microsoft.Terminal.Core.Color Color; Microsoft.Terminal.Core.Point Start; Microsoft.Terminal.Core.Point End; // exclusive - // UInt64 timestamp; MarkCategory Category; String Comment; }; diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index 0c0038d45db..090450df2b1 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -683,14 +683,6 @@ bool Terminal::SendKeyEvent(const WORD vkey, return false; } - //if (_autoMarkPrompts && vkey == VK_RETURN && !_inAltBuffer()) - //{ - // DispatchTypes::ScrollMark mark; - // mark.category = DispatchTypes::MarkCategory::Prompt; - // mark.color = til::color(255, 255, 255); // should this be configurable? - // AddMark(mark); - //} - KeyEvent keyEv{ keyDown, 1, vkey, sc, ch, states.Value() }; return _terminalInput->HandleKey(&keyEv); } @@ -745,11 +737,19 @@ bool Terminal::SendCharEvent(const wchar_t ch, const WORD scanCode, const Contro vkey = _VirtualKeyFromCharacter(ch); } + // GH#1527: When the user has automark prompts enabled, we're going to try + // and heuristically detect if this was the line the prompt was on. + // * If the key was an Enter keypress (Terminal.app also marks ^C keypresses + // as prompts. That's omitted for now.) + // * AND we're not in the alt buffer + // + // Then treat this line like it's a prompt mark. if (_autoMarkPrompts && vkey == VK_RETURN && !_inAltBuffer()) { DispatchTypes::ScrollMark mark; mark.category = DispatchTypes::MarkCategory::Prompt; - mark.color = til::color(255, 255, 255); // should this be configurable? + // Don't set the color - we'll automatically use the DEFAULT_FOREGROUND + // color for any MarkCategory::Prompt marks without one set. AddMark(mark); } @@ -1461,7 +1461,6 @@ void Terminal::AddMark(const Microsoft::Console::VirtualTerminal::DispatchTypes: DispatchTypes::ScrollMark m = mark; m.start = start; m.end = end; - // // m.timestamp = now() _scrollMarks.push_back(m); diff --git a/src/cascadia/TerminalCore/TerminalDispatch.cpp b/src/cascadia/TerminalCore/TerminalDispatch.cpp index c4107a93e51..edc39863a1d 100644 --- a/src/cascadia/TerminalCore/TerminalDispatch.cpp +++ b/src/cascadia/TerminalCore/TerminalDispatch.cpp @@ -599,6 +599,8 @@ bool TerminalDispatch::DoConEmuAction(const std::wstring_view string) // Method Description: // - Performs a iTerm2 action +// - Currently, the actions we support are: +// * `OSC1337;SetMark`: mark a line as a prompt line // Arguments: // - string: contains the parameters that define which action we do // Return Value: @@ -618,7 +620,6 @@ bool TerminalDispatch::DoITerm2Action(const std::wstring_view string) { DispatchTypes::ScrollMark mark; mark.category = DispatchTypes::MarkCategory::Prompt; - mark.color = til::color(255, 255, 255); // should this be configurable? _terminalApi.AddMark(mark); return true; } diff --git a/src/terminal/adapter/DispatchTypes.hpp b/src/terminal/adapter/DispatchTypes.hpp index 3467e5fe064..243811bcbde 100644 --- a/src/terminal/adapter/DispatchTypes.hpp +++ b/src/terminal/adapter/DispatchTypes.hpp @@ -487,16 +487,12 @@ namespace Microsoft::Console::VirtualTerminal::DispatchTypes struct ScrollMark { + // TODO! optional color til::color color; til::point start; til::point end; // exclusive - uint64_t timestamp; MarkCategory category; - std::wstring comment; - // shape? Does that even make sense? - // * Arrow (iterm2), - // * bracket (terminal.app prompts), - // * bar(terminal.app mark), - // * brace? + // Other things we may want to think about in the future are listed in + // GH#11000 }; } From a9a8ef97eea0da99b4b1a3c10012edae6d49ca1c Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 20 Apr 2022 10:58:31 -0500 Subject: [PATCH 12/27] allow for optional colors --- .../TerminalApp/AppActionHandlers.cpp | 3 +- src/cascadia/TerminalControl/ControlCore.cpp | 43 +++++++++++++-- src/cascadia/TerminalControl/ICoreState.idl | 8 +-- src/cascadia/TerminalControl/TermControl.cpp | 16 ++++-- src/cascadia/TerminalCore/ICoreAppearance.idl | 9 ++++ src/cascadia/TerminalCore/Terminal.cpp | 52 +++++++++++++++++-- src/cascadia/TerminalCore/Terminal.hpp | 1 + src/terminal/adapter/DispatchTypes.hpp | 6 +-- 8 files changed, 120 insertions(+), 18 deletions(-) diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index e87f26f5c73..1771dec0adf 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -364,7 +364,8 @@ namespace winrt::TerminalApp::implementation { _ApplyToActiveControls([realArgs](auto& control) { Control::ScrollMark mark; - mark.Color = realArgs.Color(); + mark.Color.Color = realArgs.Color(); + mark.Color.HasValue = true; control.AddMark(mark); }); } diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp index 642d84e779b..a1efbcf609e 100644 --- a/src/cascadia/TerminalControl/ControlCore.cpp +++ b/src/cascadia/TerminalControl/ControlCore.cpp @@ -37,6 +37,28 @@ constexpr const auto UpdatePatternLocationsInterval = std::chrono::milliseconds( namespace winrt::Microsoft::Terminal::Control::implementation { + static constexpr winrt::Microsoft::Terminal::Core::OptionalColor OptionalFromColor(const til::color& c) + { + Core::OptionalColor result; + result.Color = c; + result.HasValue = true; + return result; + } + static constexpr winrt::Microsoft::Terminal::Core::OptionalColor OptionalFromColor(const std::optional& c) + { + Core::OptionalColor result; + if (c.has_value()) + { + result.Color = *c; + result.HasValue = true; + } + else + { + result.HasValue = false; + } + return result; + } + // Helper static function to ensure that all ambiguous-width glyphs are reported as narrow. // See microsoft/terminal#2066 for more info. static bool _IsGlyphWideForceNarrowFallback(const std::wstring_view /* glyph */) @@ -1737,11 +1759,17 @@ namespace winrt::Microsoft::Terminal::Control::implementation for (const auto& mark : internalMarks) { Control::ScrollMark m{}; - m.Color = winrt::Microsoft::Terminal::Core::Color(mark.color); + + // sneaky: always evaluate the color of the mark to a real value + // before shoving it into the optional. If the mark doesn't have a + // specific color set, we'll use the value from the color table + // that's appropriate for this category of mark. If we do have a + // color set, then great we'll use that. The TermControl can then + // always use the value in the Mark regardless if it was actually + // set or not. + m.Color = OptionalFromColor(_terminal->GetColorForMark(mark)); m.Start = mark.start.to_core_point(); m.End = mark.end.to_core_point(); - // m.Category = (size_t)mark.category; // TODO! whatever - m.Comment = winrt::hstring(mark.comment); v.Append(m); } @@ -1752,7 +1780,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation void ControlCore::AddMark(const Control::ScrollMark& mark) { ::Microsoft::Console::VirtualTerminal::DispatchTypes::ScrollMark m{}; - m.color = til::color{ mark.Color }; + + if (mark.Color.HasValue) + { + m.color = til::color{ mark.Color.Color }; + } if (HasSelection()) { @@ -1764,7 +1796,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation m.start = m.end = til::point{ _terminal->GetTextBuffer().GetCursor().GetPosition() }; } - // The version of this that only accepts a ScrollMark is buffer2 + // The version of this that only accepts a ScrollMark will automatically + // set the start & end to the cursor position. _terminal->AddMark(m, m.start, m.end); } void ControlCore::ClearMark() { _terminal->ClearMark(); } diff --git a/src/cascadia/TerminalControl/ICoreState.idl b/src/cascadia/TerminalControl/ICoreState.idl index 5585dd90d8f..51cb3007e9e 100644 --- a/src/cascadia/TerminalControl/ICoreState.idl +++ b/src/cascadia/TerminalControl/ICoreState.idl @@ -10,13 +10,15 @@ namespace Microsoft.Terminal.Control Warning = 2, Info = 3 }; + struct ScrollMark { - Microsoft.Terminal.Core.Color Color; + // There are other members of DispatchTypes::ScrollMark, but these are + // all we need to expose up and set downwards currently. Additional + // members can be bubbled as necessary. Microsoft.Terminal.Core.Point Start; Microsoft.Terminal.Core.Point End; // exclusive - MarkCategory Category; - String Comment; + Microsoft.Terminal.Core.OptionalColor Color; }; // These are properties of the TerminalCore that should be queryable by the diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 52ee59db9ac..2825a2a4ad3 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -168,9 +168,14 @@ namespace winrt::Microsoft::Terminal::Control::implementation { Windows::UI::Xaml::Shapes::Rectangle r; Media::SolidColorBrush brush{}; - brush.Color(static_cast(m.Color)); + // Sneaky: technically, a mark doesn't need to have a color set, + // it might want to just use the color from the palette for that + // kind of mark. Fortunately, ControlCore is kind enough to + // pre-evaluate that for us, and shove the real value into the + // Color member, regardless if the mark has a literal value set. + brush.Color(static_cast(m.Color.Color)); r.Fill(brush); - r.Width(16.0f / 3.0f); // pip width + r.Width(16.0f / 3.0f); // pip width - 1/3rd of the scrollbar width. r.Height(2); const auto markRow = m.Start.Y; const auto fractionalHeight = markRow / totalBufferRows; @@ -417,7 +422,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation newMargin.Bottom }); } - _showMarksInScrollbar = settings.ShowMarks(); // TODO! hot reload me + _showMarksInScrollbar = settings.ShowMarks(); + // Clear out all the current marks + ScrollBarCanvas().Children().Clear(); + // When we hotreload the settings, the core will send us a scrollbar + // update. If we enabled scrollbar marks, then great, when we handle + // that message, we'll redraw them. } // Method Description: diff --git a/src/cascadia/TerminalCore/ICoreAppearance.idl b/src/cascadia/TerminalCore/ICoreAppearance.idl index 131410be780..5e5ed3ff721 100644 --- a/src/cascadia/TerminalCore/ICoreAppearance.idl +++ b/src/cascadia/TerminalCore/ICoreAppearance.idl @@ -24,6 +24,15 @@ namespace Microsoft.Terminal.Core UInt8 A; }; + // Yes, this is also just an IReference. However, IReference has some + // weird ownership semantics that just make it a pain for something as + // simple as "maybe this color doesn't have a value set". + struct OptionalColor + { + Boolean HasValue; + Microsoft.Terminal.Core.Color Color; + }; + // TerminalCore declares its own Color struct to avoid depending on // Windows.UI. Windows.Foundation.Point also exists, but it's composed of // floating-point coordinates, when we almost always need integer coordinates. diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index 090450df2b1..1dcb5e3e6c0 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -218,6 +218,11 @@ void Terminal::UpdateAppearance(const ICoreAppearance& appearance) } _defaultCursorShape = cursorShape; + + // Tell the control that the scrollbar has somehow changed. Used as a + // workaround to force the control to redraw any scrollbar marks whose color + // may have changed. + _NotifyScrollEvent(); } // Method Description: @@ -1427,6 +1432,11 @@ void Terminal::ApplyScheme(const Scheme& colorScheme) _renderSettings.SetColorTableEntry(TextColor::CURSOR_COLOR, til::color{ colorScheme.CursorColor }); _renderSettings.MakeAdjustedColorArray(); + + // Tell the control that the scrollbar has somehow changed. Used as a + // workaround to force the control to redraw any scrollbar marks whose color + // may have changed. + _NotifyScrollEvent(); } bool Terminal::_inAltBuffer() const noexcept @@ -1464,7 +1474,8 @@ void Terminal::AddMark(const Microsoft::Console::VirtualTerminal::DispatchTypes: _scrollMarks.push_back(m); - // Tell the control that the scrollbar has somehow changed. Used as a hack. + // Tell the control that the scrollbar has somehow changed. Used as a + // workaround to force the control to redraw any scrollbar marks _NotifyScrollEvent(); } @@ -1491,13 +1502,15 @@ void Terminal::ClearMark() }), _scrollMarks.end()); - // Tell the control that the scrollbar has somehow changed. Used as a hack. + // Tell the control that the scrollbar has somehow changed. Used as a + // workaround to force the control to redraw any scrollbar marks _NotifyScrollEvent(); } void Terminal::ClearAllMarks() { _scrollMarks.clear(); - // Tell the control that the scrollbar has somehow changed. Used as a hack. + // Tell the control that the scrollbar has somehow changed. Used as a + // workaround to force the control to redraw any scrollbar marks _NotifyScrollEvent(); } @@ -1505,3 +1518,36 @@ const std::vector color; til::point start; til::point end; // exclusive MarkCategory category; From 3aad0f5ee443110c24da58de8afdcb46c6f8f8e0 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 20 Apr 2022 11:11:56 -0500 Subject: [PATCH 13/27] flush that too --- src/host/outputStream.cpp | 11 +++++++++++ src/host/outputStream.hpp | 2 ++ src/terminal/adapter/adaptDispatch.cpp | 7 ++++++- src/terminal/adapter/conGetSet.hpp | 2 ++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/host/outputStream.cpp b/src/host/outputStream.cpp index e863d61ba01..906a78800fd 100644 --- a/src/host/outputStream.cpp +++ b/src/host/outputStream.cpp @@ -370,6 +370,17 @@ void ConhostInternalGetSet::NotifyAccessibilityChange(const til::rect& changedRe } } +void ConhostInternalGetSet::EndConptyFrame() +{ + auto& g = ServiceLocator::LocateGlobals(); + auto& gci = g.getConsoleInformation(); + + if (gci.IsInVtIoMode() && g.pRender) + { + g.pRender->TriggerFlush(false); + } +} + void ConhostInternalGetSet::ReparentWindow(const uint64_t handle) { // This will initialize s_interactivityFactory for us. It will also diff --git a/src/host/outputStream.hpp b/src/host/outputStream.hpp index 1fc1db2cfb1..d657b364f65 100644 --- a/src/host/outputStream.hpp +++ b/src/host/outputStream.hpp @@ -67,6 +67,8 @@ class ConhostInternalGetSet final : public Microsoft::Console::VirtualTerminal:: void NotifyAccessibilityChange(const til::rect& changedRect) override; + void EndConptyFrame() override; + void ReparentWindow(const uint64_t handle); private: diff --git a/src/terminal/adapter/adaptDispatch.cpp b/src/terminal/adapter/adaptDispatch.cpp index ba4330aa215..9b9e82566b1 100644 --- a/src/terminal/adapter/adaptDispatch.cpp +++ b/src/terminal/adapter/adaptDispatch.cpp @@ -2336,7 +2336,12 @@ bool AdaptDispatch::DoConEmuAction(const std::wstring_view /*string*/) noexcept // - false (so that the command gets flushed to terminal) bool AdaptDispatch::DoITerm2Action(const std::wstring_view /*string*/) noexcept { - // TODO! may need to flush manually, to make sure marks end up on the right line, like alt buffer sequence. Maybe. + // This is not implemented in conhost. + + // Flush the frame manually, to make sure marks end up on the right line, like the alt buffer sequence. + _pConApi->EndConptyFrame(); + + // Return false to flush sequence unmodified to ConPTY (if applicable). return false; } diff --git a/src/terminal/adapter/conGetSet.hpp b/src/terminal/adapter/conGetSet.hpp index 8c62e932c93..f3c545895e5 100644 --- a/src/terminal/adapter/conGetSet.hpp +++ b/src/terminal/adapter/conGetSet.hpp @@ -67,6 +67,8 @@ namespace Microsoft::Console::VirtualTerminal virtual void NotifyAccessibilityChange(const til::rect& changedRect) = 0; + virtual void EndConptyFrame() = 0; + virtual void ReparentWindow(const uint64_t handle) = 0; }; } From 9e2eb1a2b6dca79a56b8822864496aa9956dfa10 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 20 Apr 2022 12:06:27 -0500 Subject: [PATCH 14/27] Allow the settings to set marks with an optional color --- src/cascadia/TerminalApp/AppActionHandlers.cpp | 11 +++++++++-- .../TerminalSettingsModel/ActionArgs.cpp | 16 ++++++++++++---- src/cascadia/TerminalSettingsModel/ActionArgs.h | 2 +- .../TerminalSettingsModel/ActionArgs.idl | 3 +-- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 1771dec0adf..5c0dc3d91ff 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -364,8 +364,15 @@ namespace winrt::TerminalApp::implementation { _ApplyToActiveControls([realArgs](auto& control) { Control::ScrollMark mark; - mark.Color.Color = realArgs.Color(); - mark.Color.HasValue = true; + if (realArgs.Color()) + { + mark.Color.Color = realArgs.Color().Value(); + mark.Color.HasValue = true; + } + else + { + mark.Color.HasValue = false; + } control.AddMark(mark); }); } diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp index 4fc8201c1d6..0f3ed61aaa4 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp @@ -632,10 +632,18 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation winrt::hstring AddMarkArgs::GenerateName() const { - return winrt::hstring{ - fmt::format(std::wstring_view(RS_(L"AddMarkWithColorCommandKey")), - til::color{ Color() }.ToHexString(true)) - }; + if (Color()) + { + return winrt::hstring{ + fmt::format(std::wstring_view(RS_(L"AddMarkWithColorCommandKey")), + til::color{ Color().Value() }.ToHexString(true)) + }; + + } + else + { + return RS_(L"AddMarkCommandKey"); + } } winrt::hstring MoveTabArgs::GenerateName() const diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.h b/src/cascadia/TerminalSettingsModel/ActionArgs.h index 7dbd643765f..870de41b510 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.h +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.h @@ -188,7 +188,7 @@ private: //////////////////////////////////////////////////////////////////////////////// #define ADD_MARK_ARGS(X) \ - X(til::color, Color, "color", false, 255, 255, 255) + X(Windows::Foundation::IReference, Color, "color", false, nullptr) //////////////////////////////////////////////////////////////////////////////// #define TOGGLE_COMMAND_PALETTE_ARGS(X) \ diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.idl b/src/cascadia/TerminalSettingsModel/ActionArgs.idl index d4253df0735..3b28e2c74c8 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.idl +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.idl @@ -306,8 +306,7 @@ namespace Microsoft.Terminal.Settings.Model [default_interface] runtimeclass AddMarkArgs : IActionArgs { - Microsoft.Terminal.Core.Color Color { get; }; - // Windows.Foundation.IReference RowsToScroll { get; }; + Windows.Foundation.IReference Color { get; }; }; [default_interface] runtimeclass ToggleCommandPaletteArgs : IActionArgs From 6df37bf8125d99a549b00f66c23614ad5a02b332 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 20 Apr 2022 12:39:36 -0500 Subject: [PATCH 15/27] format ; spell --- src/cascadia/TerminalControl/TermControl.cpp | 2 +- src/cascadia/TerminalCore/Terminal.cpp | 2 +- src/cascadia/TerminalSettingsModel/ActionArgs.cpp | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 2825a2a4ad3..66a3da40062 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -425,7 +425,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation _showMarksInScrollbar = settings.ShowMarks(); // Clear out all the current marks ScrollBarCanvas().Children().Clear(); - // When we hotreload the settings, the core will send us a scrollbar + // When we hot reload the settings, the core will send us a scrollbar // update. If we enabled scrollbar marks, then great, when we handle // that message, we'll redraw them. } diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index 420f8960398..cb8dc368c9c 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -742,7 +742,7 @@ bool Terminal::SendCharEvent(const wchar_t ch, const WORD scanCode, const Contro vkey = _VirtualKeyFromCharacter(ch); } - // GH#1527: When the user has automark prompts enabled, we're going to try + // GH#1527: When the user has auto mark prompts enabled, we're going to try // and heuristically detect if this was the line the prompt was on. // * If the key was an Enter keypress (Terminal.app also marks ^C keypresses // as prompts. That's omitted for now.) diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp index 0f3ed61aaa4..46d695b473c 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp @@ -638,7 +638,6 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation fmt::format(std::wstring_view(RS_(L"AddMarkWithColorCommandKey")), til::color{ Color().Value() }.ToHexString(true)) }; - } else { From 39a08ed00692e83f3a993f9071377dcec3c5eacc Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 24 May 2022 10:21:22 -0500 Subject: [PATCH 16/27] classic --- src/terminal/adapter/ut_adapter/adapterTest.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/terminal/adapter/ut_adapter/adapterTest.cpp b/src/terminal/adapter/ut_adapter/adapterTest.cpp index ae1a926d54e..236a33661f0 100644 --- a/src/terminal/adapter/ut_adapter/adapterTest.cpp +++ b/src/terminal/adapter/ut_adapter/adapterTest.cpp @@ -232,6 +232,11 @@ class TestGetSet final : public ITerminalApi Log::Comment(L"NotifyAccessibilityChange MOCK called..."); } + void AddMark(const Microsoft::Console::VirtualTerminal::DispatchTypes::ScrollMark& /*mark*/) override + { + Log::Comment(L"AddMark MOCK called..."); + } + void PrepData() { PrepData(CursorDirection::UP); // if called like this, the cursor direction doesn't matter. From d00aadde2c7b4f7e62c323928b3a7b7e88334fed Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 24 May 2022 10:59:36 -0500 Subject: [PATCH 17/27] some rather simple misses, that I guess are only in Release & audit --- src/cascadia/TerminalControl/ControlCore.cpp | 4 ++-- src/terminal/adapter/adaptDispatch.cpp | 2 +- src/terminal/adapter/adaptDispatch.hpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp index e68a0ec21ae..35dfbbdb0b0 100644 --- a/src/cascadia/TerminalControl/ControlCore.cpp +++ b/src/cascadia/TerminalControl/ControlCore.cpp @@ -37,14 +37,14 @@ constexpr const auto UpdatePatternLocationsInterval = std::chrono::milliseconds( namespace winrt::Microsoft::Terminal::Control::implementation { - static constexpr winrt::Microsoft::Terminal::Core::OptionalColor OptionalFromColor(const til::color& c) + static winrt::Microsoft::Terminal::Core::OptionalColor OptionalFromColor(const til::color& c) { Core::OptionalColor result; result.Color = c; result.HasValue = true; return result; } - static constexpr winrt::Microsoft::Terminal::Core::OptionalColor OptionalFromColor(const std::optional& c) + static winrt::Microsoft::Terminal::Core::OptionalColor OptionalFromColor(const std::optional& c) { Core::OptionalColor result; if (c.has_value()) diff --git a/src/terminal/adapter/adaptDispatch.cpp b/src/terminal/adapter/adaptDispatch.cpp index 7c795791ab3..560897f00c2 100644 --- a/src/terminal/adapter/adaptDispatch.cpp +++ b/src/terminal/adapter/adaptDispatch.cpp @@ -2480,7 +2480,7 @@ bool AdaptDispatch::DoConEmuAction(const std::wstring_view string) // - string: contains the parameters that define which action we do // Return Value: // - false in conhost, true for the SetMark action, otherwise false. -bool AdaptDispatch::DoITerm2Action(const std::wstring_view string) noexcept +bool AdaptDispatch::DoITerm2Action(const std::wstring_view string) { // This is not implemented in conhost. if (_api.IsConsolePty()) diff --git a/src/terminal/adapter/adaptDispatch.hpp b/src/terminal/adapter/adaptDispatch.hpp index 8ca944033e3..d364d39dad0 100644 --- a/src/terminal/adapter/adaptDispatch.hpp +++ b/src/terminal/adapter/adaptDispatch.hpp @@ -130,7 +130,7 @@ namespace Microsoft::Console::VirtualTerminal bool DoConEmuAction(const std::wstring_view string) override; - bool DoITerm2Action(const std::wstring_view string) noexcept override; + bool DoITerm2Action(const std::wstring_view string) override; StringHandler DownloadDRCS(const VTInt fontNumber, From 1090b88d0e916611999b63babcf9c96a78b89130 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 24 May 2022 11:00:07 -0500 Subject: [PATCH 18/27] Cat walking over the keyboard --- src/terminal/adapter/ITermDispatch.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/terminal/adapter/ITermDispatch.hpp b/src/terminal/adapter/ITermDispatch.hpp index 21923ab06b5..a4fb1e23530 100644 --- a/src/terminal/adapter/ITermDispatch.hpp +++ b/src/terminal/adapter/ITermDispatch.hpp @@ -138,7 +138,6 @@ class Microsoft::Console::VirtualTerminal::ITermDispatch virtual bool DoITerm2Action(const std::wstring_view string) = 0; virtual StringHandler DownloadDRCS(const VTInt fontNumber, - const VTParameter startChar, const DispatchTypes::DrcsEraseControl eraseControl, const DispatchTypes::DrcsCellMatrix cellMatrix, From b4418916dcd6e52893743a5fd6642d0f5b5401d1 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Thu, 26 May 2022 15:43:06 -0500 Subject: [PATCH 19/27] make audit happy, I think --- src/cascadia/ut_app/TerminalApp.Unit.Tests.manifest | 1 + src/terminal/adapter/DispatchTypes.hpp | 2 +- src/terminal/adapter/adaptDispatch.cpp | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cascadia/ut_app/TerminalApp.Unit.Tests.manifest b/src/cascadia/ut_app/TerminalApp.Unit.Tests.manifest index 8e1afe241f0..8a61b53a59d 100644 --- a/src/cascadia/ut_app/TerminalApp.Unit.Tests.manifest +++ b/src/cascadia/ut_app/TerminalApp.Unit.Tests.manifest @@ -27,6 +27,7 @@ PerMonitorV2 true + SegmentHeap diff --git a/src/terminal/adapter/DispatchTypes.hpp b/src/terminal/adapter/DispatchTypes.hpp index 22d36ea6f22..84afc9007dc 100644 --- a/src/terminal/adapter/DispatchTypes.hpp +++ b/src/terminal/adapter/DispatchTypes.hpp @@ -498,7 +498,7 @@ namespace Microsoft::Console::VirtualTerminal::DispatchTypes std::optional color; til::point start; til::point end; // exclusive - MarkCategory category; + MarkCategory category{ MarkCategory::Info }; // Other things we may want to think about in the future are listed in // GH#11000 }; diff --git a/src/terminal/adapter/adaptDispatch.cpp b/src/terminal/adapter/adaptDispatch.cpp index 560897f00c2..05fb94141e8 100644 --- a/src/terminal/adapter/adaptDispatch.cpp +++ b/src/terminal/adapter/adaptDispatch.cpp @@ -2497,7 +2497,7 @@ bool AdaptDispatch::DoITerm2Action(const std::wstring_view string) return false; } - const auto action{ parts[0] }; + const auto& action = til::at(parts, 0); if (action == L"SetMark") { From 02132b82bd757db4bdfb2a6490d2b4434df52986 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Thu, 26 May 2022 16:46:39 -0500 Subject: [PATCH 20/27] this makes audit happy, but the interactivity tests are... flaky... in CI only? --- 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 05fb94141e8..0d58f8d5b52 100644 --- a/src/terminal/adapter/adaptDispatch.cpp +++ b/src/terminal/adapter/adaptDispatch.cpp @@ -2497,7 +2497,7 @@ bool AdaptDispatch::DoITerm2Action(const std::wstring_view string) return false; } - const auto& action = til::at(parts, 0); + const auto action = til::at(parts, 0); if (action == L"SetMark") { From a2a37719bcf1fbb04a021ce1dfad266bcc631feb Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Fri, 27 May 2022 06:22:15 -0500 Subject: [PATCH 21/27] this makes a lot more sense now doesn't it --- .../TerminalApp/AppActionHandlers.cpp | 82 +----------------- src/cascadia/TerminalControl/ControlCore.cpp | 85 +++++++++++++++++++ src/cascadia/TerminalControl/ControlCore.h | 1 + src/cascadia/TerminalControl/ControlCore.idl | 1 - src/cascadia/TerminalControl/ICoreState.idl | 9 ++ src/cascadia/TerminalControl/TermControl.cpp | 1 + src/cascadia/TerminalControl/TermControl.h | 1 + .../TerminalSettingsModel/ActionArgs.cpp | 8 +- .../TerminalSettingsModel/ActionArgs.h | 2 +- .../TerminalSettingsModel/ActionArgs.idl | 10 +-- .../TerminalSettingsSerializationHelpers.h | 2 +- 11 files changed, 105 insertions(+), 97 deletions(-) diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index dfc7cb15726..04f520c2b46 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -284,87 +284,7 @@ namespace winrt::TerminalApp::implementation if (const auto& realArgs = args.ActionArgs().try_as()) { _ApplyToActiveControls([realArgs](auto& control) { - const auto currentOffset = control.ScrollOffset(); - const auto marks{ control.ScrollMarks() }; - - std::optional tgt{ std::nullopt }; - const auto dir{ realArgs.Direction() }; - switch (dir) - { - case ScrollToMarkDirection::Last: - { - int highest = currentOffset; - for (const auto& mark : marks) - { - const auto newY = mark.Start.Y; - if (newY > highest) - { - tgt = mark; - highest = newY; - } - } - break; - } - case ScrollToMarkDirection::First: - { - int lowest = currentOffset; - for (const auto& mark : marks) - { - const auto newY = mark.Start.Y; - if (newY < lowest) - { - tgt = mark; - lowest = newY; - } - } - break; - } - case ScrollToMarkDirection::Next: - { - int minDistance = INT_MAX; - for (const auto& mark : marks) - { - const auto delta = mark.Start.Y - currentOffset; - if (delta > 0 && delta < minDistance) - { - tgt = mark; - minDistance = delta; - } - } - break; - } - case ScrollToMarkDirection::Previous: - default: - { - int minDistance = INT_MAX; - for (const auto& mark : marks) - { - const auto delta = currentOffset - mark.Start.Y; - if (delta > 0 && delta < minDistance) - { - tgt = mark; - minDistance = delta; - } - } - break; - } - } - - if (tgt.has_value()) - { - control.ScrollViewport(tgt->Start.Y); - } - else - { - if (dir == ScrollToMarkDirection::Last || dir == ScrollToMarkDirection::Next) - { - control.ScrollViewport(control.BufferHeight()); - } - else if (dir == ScrollToMarkDirection::First || dir == ScrollToMarkDirection::Previous) - { - control.ScrollViewport(0); - } - } + control.ScrollToMark(realArgs.Direction()); }); } args.Handled(true); diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp index 35dfbbdb0b0..ec7628d3bc3 100644 --- a/src/cascadia/TerminalControl/ControlCore.cpp +++ b/src/cascadia/TerminalControl/ControlCore.cpp @@ -1842,4 +1842,89 @@ namespace winrt::Microsoft::Terminal::Control::implementation } void ControlCore::ClearMark() { _terminal->ClearMark(); } void ControlCore::ClearAllMarks() { _terminal->ClearAllMarks(); } + + void ControlCore::ScrollToMark(const Control::ScrollToMarkDirection& direction) + { + const auto currentOffset = ScrollOffset(); + const auto& marks{ _terminal->GetScrollMarks() }; + + std::optional tgt; + + switch (direction) + { + case ScrollToMarkDirection::Last: + { + int highest = currentOffset; + for (const auto& mark : marks) + { + const auto newY = mark.start.y; + if (newY > highest) + { + tgt = mark; + highest = newY; + } + } + break; + } + case ScrollToMarkDirection::First: + { + int lowest = currentOffset; + for (const auto& mark : marks) + { + const auto newY = mark.start.y; + if (newY < lowest) + { + tgt = mark; + lowest = newY; + } + } + break; + } + case ScrollToMarkDirection::Next: + { + int minDistance = INT_MAX; + for (const auto& mark : marks) + { + const auto delta = mark.start.y - currentOffset; + if (delta > 0 && delta < minDistance) + { + tgt = mark; + minDistance = delta; + } + } + break; + } + case ScrollToMarkDirection::Previous: + default: + { + int minDistance = INT_MAX; + for (const auto& mark : marks) + { + const auto delta = currentOffset - mark.start.y; + if (delta > 0 && delta < minDistance) + { + tgt = mark; + minDistance = delta; + } + } + break; + } + } + + if (tgt.has_value()) + { + UserScrollViewport(tgt->start.y); + } + else + { + if (direction == ScrollToMarkDirection::Last || direction == ScrollToMarkDirection::Next) + { + UserScrollViewport(BufferHeight()); + } + else if (direction == ScrollToMarkDirection::First || direction == ScrollToMarkDirection::Previous) + { + UserScrollViewport(0); + } + } + } } diff --git a/src/cascadia/TerminalControl/ControlCore.h b/src/cascadia/TerminalControl/ControlCore.h index 5bf9e5e3901..cb8d28d8545 100644 --- a/src/cascadia/TerminalControl/ControlCore.h +++ b/src/cascadia/TerminalControl/ControlCore.h @@ -122,6 +122,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation void AddMark(const Control::ScrollMark& mark); void ClearMark(); void ClearAllMarks(); + void ScrollToMark(const Control::ScrollToMarkDirection& direction); #pragma endregion diff --git a/src/cascadia/TerminalControl/ControlCore.idl b/src/cascadia/TerminalControl/ControlCore.idl index edcb9fb69b1..a1728459693 100644 --- a/src/cascadia/TerminalControl/ControlCore.idl +++ b/src/cascadia/TerminalControl/ControlCore.idl @@ -22,7 +22,6 @@ namespace Microsoft.Terminal.Control IsRightButtonDown = 0x4 }; - enum ClearBufferType { Screen, diff --git a/src/cascadia/TerminalControl/ICoreState.idl b/src/cascadia/TerminalControl/ICoreState.idl index 51cb3007e9e..4d4d2e2e4ed 100644 --- a/src/cascadia/TerminalControl/ICoreState.idl +++ b/src/cascadia/TerminalControl/ICoreState.idl @@ -21,6 +21,14 @@ namespace Microsoft.Terminal.Control Microsoft.Terminal.Core.OptionalColor Color; }; + enum ScrollToMarkDirection + { + Previous, + Next, + First, + Last + }; + // These are properties of the TerminalCore that should be queryable by the // rest of the app. interface ICoreState @@ -48,6 +56,7 @@ namespace Microsoft.Terminal.Control void AddMark(ScrollMark mark); void ClearMark(); void ClearAllMarks(); + void ScrollToMark(ScrollToMarkDirection direction); IVector ScrollMarks { get; }; }; diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 4205f5ddd0c..03a0a0851bf 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -2909,6 +2909,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation } void TermControl::ClearMark() { _core.ClearMark(); } void TermControl::ClearAllMarks() { _core.ClearAllMarks(); } + void TermControl::ScrollToMark(const Control::ScrollToMarkDirection& direction) { _core.ScrollToMark(direction); } Windows::Foundation::Collections::IVector TermControl::ScrollMarks() const { diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index 7fde2fbde1a..619edd3796a 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -71,6 +71,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation void AddMark(const Control::ScrollMark& mark); void ClearMark(); void ClearAllMarks(); + void ScrollToMark(const Control::ScrollToMarkDirection& direction); #pragma endregion diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp index 46d695b473c..3b3c56543a1 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp @@ -617,13 +617,13 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { switch (Direction()) { - case ScrollToMarkDirection::Last: + case Microsoft::Terminal::Control::ScrollToMarkDirection::Last: return winrt::hstring{ RS_(L"ScrollToLastMarkCommandKey") }; - case ScrollToMarkDirection::First: + case Microsoft::Terminal::Control::ScrollToMarkDirection::First: return winrt::hstring{ RS_(L"ScrollToFirstMarkCommandKey") }; - case ScrollToMarkDirection::Next: + case Microsoft::Terminal::Control::ScrollToMarkDirection::Next: return winrt::hstring{ RS_(L"ScrollToNextMarkCommandKey") }; - case ScrollToMarkDirection::Previous: + case Microsoft::Terminal::Control::ScrollToMarkDirection::Previous: default: return winrt::hstring{ RS_(L"ScrollToPreviousMarkCommandKey") }; } diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.h b/src/cascadia/TerminalSettingsModel/ActionArgs.h index 870de41b510..03f69252561 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.h +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.h @@ -184,7 +184,7 @@ private: //////////////////////////////////////////////////////////////////////////////// #define SCROLL_TO_MARK_ARGS(X) \ - X(ScrollToMarkDirection, Direction, "direction", false, ScrollToMarkDirection::Previous) + X(Microsoft::Terminal::Control::ScrollToMarkDirection, Direction, "direction", false, Microsoft::Terminal::Control::ScrollToMarkDirection::Previous) //////////////////////////////////////////////////////////////////////////////// #define ADD_MARK_ARGS(X) \ diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.idl b/src/cascadia/TerminalSettingsModel/ActionArgs.idl index 3b28e2c74c8..77c817315b6 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.idl +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.idl @@ -107,14 +107,6 @@ namespace Microsoft.Terminal.Settings.Model ToMouse, }; - enum ScrollToMarkDirection - { - Previous, - Next, - First, - Last - }; - [default_interface] runtimeclass NewTerminalArgs { NewTerminalArgs(); NewTerminalArgs(Int32 profileIndex); @@ -301,7 +293,7 @@ namespace Microsoft.Terminal.Settings.Model [default_interface] runtimeclass ScrollToMarkArgs : IActionArgs { - ScrollToMarkDirection Direction { get; }; + Microsoft.Terminal.Control.ScrollToMarkDirection Direction { get; }; }; [default_interface] runtimeclass AddMarkArgs : IActionArgs diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h b/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h index 877c574b459..9dd273ee3c9 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h +++ b/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h @@ -548,7 +548,7 @@ JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Settings::Model::InfoBarMessage) }; // Possible ScrollToMarkDirection values -JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Settings::Model::ScrollToMarkDirection) +JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Control::ScrollToMarkDirection) { JSON_MAPPINGS(4) = { pair_type{ "previous", ValueType::Previous }, From 0ece836a15a5dbab99bd2fd76533c88098de78f2 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Fri, 27 May 2022 06:23:49 -0500 Subject: [PATCH 22/27] this too --- src/cascadia/TerminalApp/AppActionHandlers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 04f520c2b46..8f61b6249fa 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -283,7 +283,7 @@ namespace winrt::TerminalApp::implementation { if (const auto& realArgs = args.ActionArgs().try_as()) { - _ApplyToActiveControls([realArgs](auto& control) { + _ApplyToActiveControls([&realArgs](auto& control) { control.ScrollToMark(realArgs.Direction()); }); } From b989d00d16fcddfccffe8f9111c66784c9e1d760 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Fri, 27 May 2022 09:33:32 -0500 Subject: [PATCH 23/27] this fixes the tests, but I don't think I need the test delta --- src/cascadia/TerminalControl/ControlCore.cpp | 4 ++++ src/cascadia/TerminalCore/Terminal.cpp | 15 +++++++++------ .../ControlInteractivityTests.cpp | 13 +++++++++---- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp index ec7628d3bc3..281790c3b9e 100644 --- a/src/cascadia/TerminalControl/ControlCore.cpp +++ b/src/cascadia/TerminalControl/ControlCore.cpp @@ -1201,6 +1201,10 @@ namespace winrt::Microsoft::Terminal::Control::implementation const int viewHeight, const int bufferSize) { + if (!_initializedTerminal) + { + return; + } // Clear the regex pattern tree so the renderer does not try to render them while scrolling // We're **NOT** taking the lock here unlike _scrollbarChangeHandler because // we are already under lock (since this usually happens as a result of writing). diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index c7561a60e3e..bd0c8d796c0 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -1214,14 +1214,17 @@ void Terminal::_AdjustCursorPosition(const COORD proposedPosition) if (rowsPushedOffTopOfBuffer != 0) { - for (auto& mark : _scrollMarks) + if (_scrollMarks.size() > 0) { - mark.start.y -= rowsPushedOffTopOfBuffer; + for (auto& mark : _scrollMarks) + { + mark.start.y -= rowsPushedOffTopOfBuffer; + } + _scrollMarks.erase(std::remove_if(_scrollMarks.begin(), + _scrollMarks.end(), + [](const VirtualTerminal::DispatchTypes::ScrollMark& m) { return m.start.y < 0; }), + _scrollMarks.end()); } - _scrollMarks.erase(std::remove_if(_scrollMarks.begin(), - _scrollMarks.end(), - [](const VirtualTerminal::DispatchTypes::ScrollMark& m) { return m.start.y < 0; }), - _scrollMarks.end()); // We have to report the delta here because we might have circled the text buffer. // That didn't change the viewport and therefore the TriggerScroll(void) // method can't detect the delta on its own. diff --git a/src/cascadia/UnitTests_Control/ControlInteractivityTests.cpp b/src/cascadia/UnitTests_Control/ControlInteractivityTests.cpp index f23c42b5b4c..76cde6aa554 100644 --- a/src/cascadia/UnitTests_Control/ControlInteractivityTests.cpp +++ b/src/cascadia/UnitTests_Control/ControlInteractivityTests.cpp @@ -23,8 +23,9 @@ namespace ControlUnitTests { class ControlInteractivityTests { + BEGIN_TEST_CLASS(ControlInteractivityTests) - TEST_CLASS_PROPERTY(L"TestTimeout", L"0:0:10") // 10s timeout + // TEST_CLASS_PROPERTY(L"TestTimeout", L"0:0:10") // 10s timeout END_TEST_CLASS() TEST_METHOD(TestAdjustAcrylic); @@ -197,7 +198,7 @@ namespace ControlUnitTests TEST_METHOD_PROPERTY(L"IsolationLevel", L"Method") END_TEST_METHOD_PROPERTIES() - WEX::TestExecution::DisableVerifyExceptions disableVerifyExceptions{}; + // WEX::TestExecution::DisableVerifyExceptions disableVerifyExceptions{}; auto [settings, conn] = _createSettingsAndConnection(); auto [core, interactivity] = _createCoreAndInteractivity(*settings, *conn); @@ -661,7 +662,7 @@ namespace ControlUnitTests void ControlInteractivityTests::PointerClickOutsideActiveRegion() { // This is a test for GH#10642 - WEX::TestExecution::DisableVerifyExceptions disableVerifyExceptions{}; + // WEX::TestExecution::DisableVerifyExceptions disableVerifyExceptions{}; auto [settings, conn] = _createSettingsAndConnection(); auto [core, interactivity] = _createCoreAndInteractivity(*settings, *conn); @@ -679,8 +680,11 @@ namespace ControlUnitTests auto expectedBufferHeight = 20; auto scrollChangedHandler = [&](auto&&, const Control::ScrollPositionChangedArgs& args) mutable { + auto height = args.ViewHeight(); + // if (height == 0) + // DebugBreak(); VERIFY_ARE_EQUAL(expectedTop, args.ViewTop()); - VERIFY_ARE_EQUAL(expectedViewHeight, args.ViewHeight()); + VERIFY_ARE_EQUAL(expectedViewHeight, height); VERIFY_ARE_EQUAL(expectedBufferHeight, args.BufferSize()); }; core->ScrollPositionChanged(scrollChangedHandler); @@ -697,6 +701,7 @@ namespace ControlUnitTests } conn->WriteInput(L"Foo\r\n"); + Sleep(20); } // We printed that 40 times, but the final \r\n bumped the view down one MORE row. VERIFY_ARE_EQUAL(20, core->_terminal->GetViewport().Height()); From be6616f455c2f24bce325f16fe0fb277ba2e28bb Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Fri, 27 May 2022 09:57:05 -0500 Subject: [PATCH 24/27] That's right, I didn't --- .../UnitTests_Control/ControlInteractivityTests.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/cascadia/UnitTests_Control/ControlInteractivityTests.cpp b/src/cascadia/UnitTests_Control/ControlInteractivityTests.cpp index 76cde6aa554..f23c42b5b4c 100644 --- a/src/cascadia/UnitTests_Control/ControlInteractivityTests.cpp +++ b/src/cascadia/UnitTests_Control/ControlInteractivityTests.cpp @@ -23,9 +23,8 @@ namespace ControlUnitTests { class ControlInteractivityTests { - BEGIN_TEST_CLASS(ControlInteractivityTests) - // TEST_CLASS_PROPERTY(L"TestTimeout", L"0:0:10") // 10s timeout + TEST_CLASS_PROPERTY(L"TestTimeout", L"0:0:10") // 10s timeout END_TEST_CLASS() TEST_METHOD(TestAdjustAcrylic); @@ -198,7 +197,7 @@ namespace ControlUnitTests TEST_METHOD_PROPERTY(L"IsolationLevel", L"Method") END_TEST_METHOD_PROPERTIES() - // WEX::TestExecution::DisableVerifyExceptions disableVerifyExceptions{}; + WEX::TestExecution::DisableVerifyExceptions disableVerifyExceptions{}; auto [settings, conn] = _createSettingsAndConnection(); auto [core, interactivity] = _createCoreAndInteractivity(*settings, *conn); @@ -662,7 +661,7 @@ namespace ControlUnitTests void ControlInteractivityTests::PointerClickOutsideActiveRegion() { // This is a test for GH#10642 - // WEX::TestExecution::DisableVerifyExceptions disableVerifyExceptions{}; + WEX::TestExecution::DisableVerifyExceptions disableVerifyExceptions{}; auto [settings, conn] = _createSettingsAndConnection(); auto [core, interactivity] = _createCoreAndInteractivity(*settings, *conn); @@ -680,11 +679,8 @@ namespace ControlUnitTests auto expectedBufferHeight = 20; auto scrollChangedHandler = [&](auto&&, const Control::ScrollPositionChangedArgs& args) mutable { - auto height = args.ViewHeight(); - // if (height == 0) - // DebugBreak(); VERIFY_ARE_EQUAL(expectedTop, args.ViewTop()); - VERIFY_ARE_EQUAL(expectedViewHeight, height); + VERIFY_ARE_EQUAL(expectedViewHeight, args.ViewHeight()); VERIFY_ARE_EQUAL(expectedBufferHeight, args.BufferSize()); }; core->ScrollPositionChanged(scrollChangedHandler); @@ -701,7 +697,6 @@ namespace ControlUnitTests } conn->WriteInput(L"Foo\r\n"); - Sleep(20); } // We printed that 40 times, but the final \r\n bumped the view down one MORE row. VERIFY_ARE_EQUAL(20, core->_terminal->GetViewport().Height()); From be59a7100fe6c68c924bbc071d89a947cfbc6054 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 7 Jun 2022 06:38:11 -0500 Subject: [PATCH 25/27] put behind velocity, fix alt buffer --- src/cascadia/TerminalCore/Terminal.cpp | 12 +++++++++++- .../TerminalSettingsModel/TerminalSettings.cpp | 4 ++-- src/features.xml | 12 ++++++++++++ src/terminal/adapter/adaptDispatch.cpp | 5 +++++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index bd0c8d796c0..43189ee78f9 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -1504,6 +1504,11 @@ void Terminal::AddMark(const Microsoft::Console::VirtualTerminal::DispatchTypes: const til::point& start, const til::point& end) { + if (_inAltBuffer()) + { + return; + } + DispatchTypes::ScrollMark m = mark; m.start = start; m.end = end; @@ -1552,7 +1557,12 @@ void Terminal::ClearAllMarks() const std::vector& Terminal::GetScrollMarks() const { - return _scrollMarks; + // TODO: GH#11000 - when the marks are stored per-buffer, get rid of this. + // We want to return _no_ marks when we're in the alt buffer, to effectively + // hide them. We need to return a reference, so we can't just ctor an empty + // list here just for when we're in the alt buffer. + static std::vector _altBufferMarks{}; + return _inAltBuffer() ? _altBufferMarks : _scrollMarks; } til::color Terminal::GetColorForMark(const Microsoft::Console::VirtualTerminal::DispatchTypes::ScrollMark& mark) const diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp index a325d198cfe..0ba57857303 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp @@ -281,8 +281,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation } _Elevate = profile.Elevate(); - _AutoMarkPrompts = profile.AutoMarkPrompts(); - _ShowMarks = profile.ShowMarks(); + _AutoMarkPrompts = Feature_ScrollbarMarks::IsEnabled() && profile.AutoMarkPrompts(); + _ShowMarks = Feature_ScrollbarMarks::IsEnabled() && profile.ShowMarks(); } // Method Description: diff --git a/src/features.xml b/src/features.xml index 985297e10f4..cbe55f3a5ad 100644 --- a/src/features.xml +++ b/src/features.xml @@ -116,4 +116,16 @@ Preview + + + Feature_ScrollbarMarks + Enables the experimental scrollbar marks feature. + AlwaysDisabled + + + Dev + Preview + + + diff --git a/src/terminal/adapter/adaptDispatch.cpp b/src/terminal/adapter/adaptDispatch.cpp index 0d58f8d5b52..61e6d6d4bb8 100644 --- a/src/terminal/adapter/adaptDispatch.cpp +++ b/src/terminal/adapter/adaptDispatch.cpp @@ -2490,6 +2490,11 @@ bool AdaptDispatch::DoITerm2Action(const std::wstring_view string) return false; } + if constexpr (!Feature_ScrollbarMarks::IsEnabled()) + { + return false; + } + const auto parts = Utils::SplitString(string, L';'); if (parts.size() < 1) From 8cb9ae26cbc5a47f11146b70739e866754e448ed Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 7 Jun 2022 06:44:52 -0500 Subject: [PATCH 26/27] loc comments too --- .../TerminalSettingsModel/Resources/en-US/Resources.resw | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw index 0ce7f593751..57bda0a7a0b 100644 --- a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw @@ -385,7 +385,7 @@ Add a mark, color:{0} - {0} will be replaced with a color in hexadecimal format, like `#123456` + {Locked="color"}. "color" is a literal parameter name that shouldn't be translated. {0} will be replaced with a color in hexadecimal format, like `#123456` Clear mark @@ -554,4 +554,4 @@ Toggle mark mode A command that will toggle "mark mode". This is a mode in the application where the user can mark the text by selecting portions of the text. - \ No newline at end of file + From 7bfdc9dece57891322072f9c568e162af1f5cd5e Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Thu, 9 Jun 2022 15:05:20 -0500 Subject: [PATCH 27/27] its happening --- .../TerminalSettingsModel/Resources/en-US/Resources.resw | 4 ++-- src/terminal/adapter/adaptDispatch.hpp | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw index 856319b7d29..9b7e6fbe661 100644 --- a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw @@ -381,10 +381,10 @@ Scroll to the last mark - Add a mark + Add a scroll mark - Add a mark, color:{0} + Add a scroll mark, color:{0} {Locked="color"}. "color" is a literal parameter name that shouldn't be translated. {0} will be replaced with a color in hexadecimal format, like `#123456` diff --git a/src/terminal/adapter/adaptDispatch.hpp b/src/terminal/adapter/adaptDispatch.hpp index ef3e8464f08..ca6a221fc76 100644 --- a/src/terminal/adapter/adaptDispatch.hpp +++ b/src/terminal/adapter/adaptDispatch.hpp @@ -133,7 +133,6 @@ namespace Microsoft::Console::VirtualTerminal bool DoITerm2Action(const std::wstring_view string) override; StringHandler DownloadDRCS(const VTInt fontNumber, - const VTParameter startChar, const DispatchTypes::DrcsEraseControl eraseControl, const DispatchTypes::DrcsCellMatrix cellMatrix,