diff --git a/.gitignore b/.gitignore index 9e8281ee5dc..3711d5e19da 100644 --- a/.gitignore +++ b/.gitignore @@ -285,4 +285,5 @@ profiles.json *.swp # MSBuildCache -/MSBuildCacheLogs/ \ No newline at end of file +/MSBuildCacheLogs/ +enc_temp_folder/ diff --git a/src/cascadia/QueryExtension/ExtensionPalette.cpp b/src/cascadia/QueryExtension/ExtensionPalette.cpp index ee693299d00..2bd6bb11f1b 100644 --- a/src/cascadia/QueryExtension/ExtensionPalette.cpp +++ b/src/cascadia/QueryExtension/ExtensionPalette.cpp @@ -7,6 +7,8 @@ #include "LibraryResources.h" #include +#include + #include "ExtensionPalette.g.cpp" #include "ChatMessage.g.cpp" #include "GroupedChatMessages.g.cpp" @@ -16,6 +18,7 @@ using namespace winrt::Windows::Foundation::Collections; using namespace winrt::Windows::UI::Core; using namespace winrt::Windows::UI::Xaml; using namespace winrt::Windows::UI::Xaml::Controls; +using namespace winrt::Windows::UI::Xaml::Controls::Primitives; using namespace winrt::Windows::System; namespace WWH = ::winrt::Windows::Web::Http; namespace WSS = ::winrt::Windows::Storage::Streams; @@ -340,6 +343,14 @@ namespace winrt::Microsoft::Terminal::Query::Extension::implementation void ExtensionPalette::_lostFocusHandler(const Windows::Foundation::IInspectable& /*sender*/, const Windows::UI::Xaml::RoutedEventArgs& /*args*/) { + const auto focusedElement = Input::FocusManager::GetFocusedElement(this->XamlRoot()); + if (focusedElement && (focusedElement.try_as() || focusedElement.try_as() || focusedElement.try_as())) + { + // The context menu for the message doesn't seem to be found when the VisualTreeHelper walks the visual tree. So we check here + // if one of the focused elements is a message or a context menu of one of those messages and return early to support + // copy and select all using a mouse + return; + } const auto flyout = _queryBox().ContextFlyout(); if (flyout && flyout.IsOpen()) { @@ -404,7 +415,17 @@ namespace winrt::Microsoft::Terminal::Query::Extension::implementation } else if (key == VirtualKey::C && ctrlDown) { - _queryBox().CopySelectionToClipboard(); + // Get the focused element. If it is a chat message copy its selection (if any) to the clipboard. + const auto focusedElement = Input::FocusManager::GetFocusedElement(this->XamlRoot()); + if (focusedElement && focusedElement.try_as()) + { + const auto textBlock = focusedElement.as(); + textBlock.CopySelectionToClipboard(); + } + else + { + _queryBox().CopySelectionToClipboard(); + } e.Handled(true); } else if (key == VirtualKey::V && ctrlDown) diff --git a/src/cascadia/QueryExtension/ExtensionPalette.h b/src/cascadia/QueryExtension/ExtensionPalette.h index 0b4abee122f..fd423f9750b 100644 --- a/src/cascadia/QueryExtension/ExtensionPalette.h +++ b/src/cascadia/QueryExtension/ExtensionPalette.h @@ -56,7 +56,6 @@ namespace winrt::Microsoft::Terminal::Query::Extension::implementation void _previewKeyDownHandler(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::KeyRoutedEventArgs& e); void _setUpAIProviderInSettings(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& args); - void _close(); }; @@ -67,7 +66,6 @@ namespace winrt::Microsoft::Terminal::Query::Extension::implementation bool IsQuery() const { return _isQuery; }; winrt::hstring MessageContent() const { return _messageContent; }; winrt::Windows::UI::Xaml::Controls::RichTextBlock RichBlock() const { return _richBlock; }; - TYPED_EVENT(RunCommandClicked, winrt::Microsoft::Terminal::Query::Extension::ChatMessage, winrt::hstring); private: diff --git a/src/cascadia/QueryExtension/ExtensionPalette.xaml b/src/cascadia/QueryExtension/ExtensionPalette.xaml index 1cf33725200..3764f693384 100644 --- a/src/cascadia/QueryExtension/ExtensionPalette.xaml +++ b/src/cascadia/QueryExtension/ExtensionPalette.xaml @@ -318,6 +318,11 @@ diff --git a/src/cascadia/QueryExtension/Resources/en-US/Resources.resw b/src/cascadia/QueryExtension/Resources/en-US/Resources.resw index e93fcbcd159..53659e3b933 100644 --- a/src/cascadia/QueryExtension/Resources/en-US/Resources.resw +++ b/src/cascadia/QueryExtension/Resources/en-US/Resources.resw @@ -197,4 +197,4 @@ GitHub Copilot The metadata string to display whenever a response is received from the GitHub Copilot service provider - + \ No newline at end of file