From 0c64b8a1050d3962fd02340ce6e69e86915ec2bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Garc=C3=ADa?= Date: Thu, 6 Jul 2023 18:37:59 +0200 Subject: [PATCH] Added: Copy text without dismissing the selection (#15552) ## Summary of the Pull Request Adds a dismiss selection option to the "copy" action. ## PR Checklist - [x] Closes #15371 - [x] Tests added/passed - [x] Documentation updated - If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/terminal) and link it here: MicrosoftDocs/terminal#686 - [x] Schema updated (if necessary) --------- Co-authored-by: Carlos Zamora --- doc/cascadia/profiles.schema.json | 5 +++++ src/cascadia/TerminalApp/AppActionHandlers.cpp | 2 +- src/cascadia/TerminalApp/TerminalPage.cpp | 5 +++-- src/cascadia/TerminalApp/TerminalPage.h | 2 +- src/cascadia/TerminalControl/TermControl.cpp | 10 ++++++++-- src/cascadia/TerminalControl/TermControl.h | 2 +- src/cascadia/TerminalControl/TermControl.idl | 2 +- src/cascadia/TerminalSettingsModel/ActionArgs.cpp | 5 +++++ src/cascadia/TerminalSettingsModel/ActionArgs.h | 5 +++-- src/cascadia/TerminalSettingsModel/ActionArgs.idl | 1 + 10 files changed, 29 insertions(+), 10 deletions(-) diff --git a/doc/cascadia/profiles.schema.json b/doc/cascadia/profiles.schema.json index 41a671626b..d3ccfa8d12 100644 --- a/doc/cascadia/profiles.schema.json +++ b/doc/cascadia/profiles.schema.json @@ -799,6 +799,11 @@ "default": false, "description": "If true, the copied content will be copied as a single line (even if there are hard line breaks present in the text). If false, newlines persist from the selected text." }, + "dismissSelection": { + "type": "boolean", + "default": true, + "description": "If false, the copied content will be copied and the selection will not be dismissed. If true, the selection will be dismissed." + }, "copyFormatting": { "default": null, "description": "When set to `true`, the color and font formatting of selected text is also copied to your clipboard. When set to `false`, only plain text is copied to your clipboard. An array of specific formats can also be used. Supported array values include `html` and `rtf`. Plain text is always copied. Not setting this value inherits the behavior of the `copyFormatting` global setting.", diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index aa912fd22d..74ae4cdbb6 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -512,7 +512,7 @@ namespace winrt::TerminalApp::implementation { if (const auto& realArgs = args.ActionArgs().try_as()) { - const auto handled = _CopyText(realArgs.SingleLine(), realArgs.CopyFormatting()); + const auto handled = _CopyText(realArgs.DismissSelection(), realArgs.SingleLine(), realArgs.CopyFormatting()); args.Handled(handled); } } diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index dd960999b4..c0b3f0d594 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -2748,15 +2748,16 @@ namespace winrt::TerminalApp::implementation // Method Description: // - Copy text from the focused terminal to the Windows Clipboard // Arguments: + // - dismissSelection: if not enabled, copying text doesn't dismiss the selection // - singleLine: if enabled, copy contents as a single line of text // - formats: dictate which formats need to be copied // Return Value: // - true iff we we able to copy text (if a selection was active) - bool TerminalPage::_CopyText(const bool singleLine, const Windows::Foundation::IReference& formats) + bool TerminalPage::_CopyText(const bool dismissSelection, const bool singleLine, const Windows::Foundation::IReference& formats) { if (const auto& control{ _GetActiveControl() }) { - return control.CopySelectionToClipboard(singleLine, formats); + return control.CopySelectionToClipboard(dismissSelection, singleLine, formats); } return false; } diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index 276f6687ba..bde39cca45 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -410,7 +410,7 @@ namespace winrt::TerminalApp::implementation bool _IsUriSupported(const winrt::Windows::Foundation::Uri& parsedUri); void _ShowCouldNotOpenDialog(winrt::hstring reason, winrt::hstring uri); - bool _CopyText(const bool singleLine, const Windows::Foundation::IReference& formats); + bool _CopyText(const bool dismissSelection, const bool singleLine, const Windows::Foundation::IReference& formats); winrt::fire_and_forget _SetTaskbarProgressHandler(const IInspectable sender, const IInspectable eventArgs); diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 215d8ee134..37ded61dd2 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -2066,10 +2066,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation // Windows Clipboard (CascadiaWin32:main.cpp). // - CopyOnSelect does NOT clear the selection // Arguments: + // - dismissSelection: dismiss the text selection after copy // - singleLine: collapse all of the text to one line // - formats: which formats to copy (defined by action's CopyFormatting arg). nullptr // if we should defer which formats are copied to the global setting - bool TermControl::CopySelectionToClipboard(bool singleLine, const Windows::Foundation::IReference& formats) + bool TermControl::CopySelectionToClipboard(bool dismissSelection, bool singleLine, const Windows::Foundation::IReference& formats) { if (_IsClosing()) { @@ -2077,7 +2078,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation } const auto successfulCopy = _interactivity.CopySelectionToClipboard(singleLine, formats); - _core.ClearSelection(); + + if (dismissSelection) + { + _core.ClearSelection(); + } + return successfulCopy; } diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index f177c816ab..827c0d29a4 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -39,7 +39,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation hstring GetProfileName() const; - bool CopySelectionToClipboard(bool singleLine, const Windows::Foundation::IReference& formats); + bool CopySelectionToClipboard(bool dismissSelection, bool singleLine, const Windows::Foundation::IReference& formats); void PasteTextFromClipboard(); void SelectAll(); bool ToggleBlockSelection(); diff --git a/src/cascadia/TerminalControl/TermControl.idl b/src/cascadia/TerminalControl/TermControl.idl index f9f5b3ea45..b52cfea794 100644 --- a/src/cascadia/TerminalControl/TermControl.idl +++ b/src/cascadia/TerminalControl/TermControl.idl @@ -67,7 +67,7 @@ namespace Microsoft.Terminal.Control event Windows.Foundation.TypedEventHandler CloseTerminalRequested; event Windows.Foundation.TypedEventHandler RestartTerminalRequested; - Boolean CopySelectionToClipboard(Boolean singleLine, Windows.Foundation.IReference formats); + Boolean CopySelectionToClipboard(Boolean dismissSelection, Boolean singleLine, Windows.Foundation.IReference formats); void PasteTextFromClipboard(); void SelectAll(); Boolean ToggleBlockSelection(); diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp index b002f7d0b7..64f7bd13b0 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp @@ -197,6 +197,11 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation ss << RS_(L"CopyTextCommandKey").c_str(); } + if (!DismissSelection()) + { + ss << L", dismissSelection: false"; + } + if (CopyFormatting()) { ss << L", copyFormatting: "; diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.h b/src/cascadia/TerminalSettingsModel/ActionArgs.h index 0cf0eb4d59..99f52ad991 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.h +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.h @@ -100,8 +100,9 @@ private: \ // false, if we don't really care if the parameter is required or not. //////////////////////////////////////////////////////////////////////////////// -#define COPY_TEXT_ARGS(X) \ - X(bool, SingleLine, "singleLine", false, false) \ +#define COPY_TEXT_ARGS(X) \ + X(bool, DismissSelection, "dismissSelection", false, true) \ + X(bool, SingleLine, "singleLine", false, false) \ X(Windows::Foundation::IReference, CopyFormatting, "copyFormatting", false, nullptr) //////////////////////////////////////////////////////////////////////////////// diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.idl b/src/cascadia/TerminalSettingsModel/ActionArgs.idl index d2127922dc..a5daa935ec 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.idl +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.idl @@ -155,6 +155,7 @@ namespace Microsoft.Terminal.Settings.Model [default_interface] runtimeclass CopyTextArgs : IActionArgs { CopyTextArgs(); + Boolean DismissSelection { get; }; Boolean SingleLine { get; }; Windows.Foundation.IReference CopyFormatting { get; }; };