From e13a1aafd726039c27722dcbccfc8fc8688317f4 Mon Sep 17 00:00:00 2001 From: Carlos Zamora Date: Thu, 2 Jun 2022 11:56:31 -0700 Subject: [PATCH] Introduce `toggleBlockSelection` action --- src/cascadia/TerminalApp/AppActionHandlers.cpp | 10 ++++++++++ src/cascadia/TerminalControl/ControlCore.cpp | 12 ++++++++++++ src/cascadia/TerminalControl/ControlCore.h | 1 + src/cascadia/TerminalControl/ControlCore.idl | 1 + src/cascadia/TerminalControl/TermControl.cpp | 5 +++++ src/cascadia/TerminalControl/TermControl.h | 1 + src/cascadia/TerminalControl/TermControl.idl | 1 + src/cascadia/TerminalCore/TerminalSelection.cpp | 1 + src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp | 2 ++ .../TerminalSettingsModel/AllShortcutActions.h | 3 ++- .../Resources/en-US/Resources.resw | 3 +++ src/cascadia/TerminalSettingsModel/defaults.json | 1 + 12 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 0cc395287a3..6db40713c9a 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -1053,4 +1053,14 @@ namespace winrt::TerminalApp::implementation args.Handled(true); } } + + void TerminalPage::_HandleToggleBlockSelection(const IInspectable& /*sender*/, + const ActionEventArgs& args) + { + if (const auto& control{ _GetActiveControl() }) + { + const auto handled = control.ToggleBlockSelection(); + args.Handled(handled); + } + } } diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp index a224ca22c4d..96f4105d3a1 100644 --- a/src/cascadia/TerminalControl/ControlCore.cpp +++ b/src/cascadia/TerminalControl/ControlCore.cpp @@ -1015,6 +1015,18 @@ namespace winrt::Microsoft::Terminal::Control::implementation _renderer->TriggerSelection(); } + bool ControlCore::ToggleBlockSelection() + { + auto lock = _terminal->LockForWriting(); + if (_terminal->IsSelectionActive()) + { + _terminal->SetBlockSelection(!_terminal->IsBlockSelection()); + _renderer->TriggerSelection(); + return true; + } + return false; + } + void ControlCore::ToggleMarkMode() { auto lock = _terminal->LockForWriting(); diff --git a/src/cascadia/TerminalControl/ControlCore.h b/src/cascadia/TerminalControl/ControlCore.h index 9cf4355a6ce..734482bcc34 100644 --- a/src/cascadia/TerminalControl/ControlCore.h +++ b/src/cascadia/TerminalControl/ControlCore.h @@ -82,6 +82,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation void PasteText(const winrt::hstring& hstr); bool CopySelectionToClipboard(bool singleLine, const Windows::Foundation::IReference& formats); void SelectAll(); + bool ToggleBlockSelection(); void ToggleMarkMode(); bool IsInMarkMode() const; diff --git a/src/cascadia/TerminalControl/ControlCore.idl b/src/cascadia/TerminalControl/ControlCore.idl index edcb9fb69b1..ac47a729554 100644 --- a/src/cascadia/TerminalControl/ControlCore.idl +++ b/src/cascadia/TerminalControl/ControlCore.idl @@ -66,6 +66,7 @@ namespace Microsoft.Terminal.Control void SendInput(String text); void PasteText(String text); void SelectAll(); + Boolean ToggleBlockSelection(); void ToggleMarkMode(); void ClearBuffer(ClearBufferType clearType); Boolean IsInMarkMode(); diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 37e4ad8096e..093c67dc7f1 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -1859,6 +1859,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation _core.SelectAll(); } + bool TermControl::ToggleBlockSelection() + { + return _core.ToggleBlockSelection(); + } + void TermControl::ToggleMarkMode() { _core.ToggleMarkMode(); diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index b8d70e7741f..8816472e016 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -38,6 +38,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation bool CopySelectionToClipboard(bool singleLine, const Windows::Foundation::IReference& formats); void PasteTextFromClipboard(); void SelectAll(); + bool ToggleBlockSelection(); void ToggleMarkMode(); void Close(); Windows::Foundation::Size CharacterDimensions() const; diff --git a/src/cascadia/TerminalControl/TermControl.idl b/src/cascadia/TerminalControl/TermControl.idl index f208046dd90..f2aadf16934 100644 --- a/src/cascadia/TerminalControl/TermControl.idl +++ b/src/cascadia/TerminalControl/TermControl.idl @@ -51,6 +51,7 @@ namespace Microsoft.Terminal.Control Boolean CopySelectionToClipboard(Boolean singleLine, Windows.Foundation.IReference formats); void PasteTextFromClipboard(); void SelectAll(); + Boolean ToggleBlockSelection(); void ToggleMarkMode(); void ClearBuffer(ClearBufferType clearType); void Close(); diff --git a/src/cascadia/TerminalCore/TerminalSelection.cpp b/src/cascadia/TerminalCore/TerminalSelection.cpp index 6d75d6d20c5..cbc4df79f32 100644 --- a/src/cascadia/TerminalCore/TerminalSelection.cpp +++ b/src/cascadia/TerminalCore/TerminalSelection.cpp @@ -258,6 +258,7 @@ void Terminal::ToggleMarkMode() _selection->end = cursorPos; _selection->pivot = cursorPos; _markMode = true; + _blockSelection = false; } } diff --git a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp index 517c85551df..148d77fb376 100644 --- a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp @@ -77,6 +77,7 @@ static constexpr std::string_view AdjustOpacityKey{ "adjustOpacity" }; static constexpr std::string_view RestoreLastClosedKey{ "restoreLastClosed" }; static constexpr std::string_view SelectAllKey{ "selectAll" }; static constexpr std::string_view MarkModeKey{ "markMode" }; +static constexpr std::string_view ToggleBlockSelectionKey{ "toggleBlockSelection" }; static constexpr std::string_view ActionKey{ "action" }; @@ -390,6 +391,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { ShortcutAction::RestoreLastClosed, RS_(L"RestoreLastClosedCommandKey") }, { ShortcutAction::SelectAll, RS_(L"SelectAllCommandKey") }, { ShortcutAction::MarkMode, RS_(L"MarkModeCommandKey") }, + { ShortcutAction::ToggleBlockSelection, RS_(L"ToggleBlockSelectionCommandKey") }, }; }(); diff --git a/src/cascadia/TerminalSettingsModel/AllShortcutActions.h b/src/cascadia/TerminalSettingsModel/AllShortcutActions.h index 24f04b232a1..d6a23dc203d 100644 --- a/src/cascadia/TerminalSettingsModel/AllShortcutActions.h +++ b/src/cascadia/TerminalSettingsModel/AllShortcutActions.h @@ -90,7 +90,8 @@ ON_ALL_ACTIONS(AdjustOpacity) \ ON_ALL_ACTIONS(RestoreLastClosed) \ ON_ALL_ACTIONS(SelectAll) \ - ON_ALL_ACTIONS(MarkMode) + ON_ALL_ACTIONS(MarkMode) \ + ON_ALL_ACTIONS(ToggleBlockSelection) #define ALL_SHORTCUT_ACTIONS_WITH_ARGS \ ON_ALL_ACTIONS_WITH_ARGS(AdjustFontSize) \ diff --git a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw index 7a23d7a111e..7a6278be036 100644 --- a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw @@ -529,4 +529,7 @@ 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. + + Toggle block selection + \ No newline at end of file diff --git a/src/cascadia/TerminalSettingsModel/defaults.json b/src/cascadia/TerminalSettingsModel/defaults.json index 95118b5d884..e6d68bb2af1 100644 --- a/src/cascadia/TerminalSettingsModel/defaults.json +++ b/src/cascadia/TerminalSettingsModel/defaults.json @@ -386,6 +386,7 @@ { "command": "paste", "keys": "shift+insert" }, { "command": "selectAll", "keys": "ctrl+shift+a" }, { "command": "markMode", "keys": "ctrl+shift+m" }, + { "command": "toggleBlockSelection" }, // Scrollback { "command": "scrollDown", "keys": "ctrl+shift+down" },