From c083fb00c20e99f41da219ca9fc221c3647ab4c3 Mon Sep 17 00:00:00 2001 From: nogunumo Date: Mon, 21 Dec 2020 22:01:51 +0900 Subject: [PATCH 01/10] Hook up with TerminalPage --- .../TerminalApp/AppActionHandlers.cpp | 14 ++++++++ .../TerminalApp/ShortcutActionDispatch.cpp | 10 ++++++ .../TerminalApp/ShortcutActionDispatch.h | 2 ++ .../TerminalApp/ShortcutActionDispatch.idl | 2 ++ src/cascadia/TerminalApp/TerminalPage.cpp | 15 ++++++++ src/cascadia/TerminalApp/TerminalPage.h | 4 +++ src/cascadia/TerminalControl/TermControl.cpp | 34 ++++++++++++++++++- src/cascadia/TerminalControl/TermControl.h | 4 +++ src/cascadia/TerminalControl/TermControl.idl | 3 ++ .../TerminalSettingsModel/ActionAndArgs.cpp | 6 ++++ .../TerminalSettingsModel/KeyMapping.idl | 4 ++- .../Resources/en-US/Resources.resw | 6 ++++ .../TerminalSettingsModel/defaults.json | 2 ++ 13 files changed, 104 insertions(+), 2 deletions(-) diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 4aab54c9254..a17e1548400 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -185,6 +185,20 @@ namespace winrt::TerminalApp::implementation args.Handled(true); } + void TerminalPage::_HandleNextSearchMatch(const IInspectable& /*sender*/, + const ActionEventArgs& args) + { + _GoForward(); + args.Handled(true); + } + + void TerminalPage::_HandlePrevSearchMatch(const IInspectable& /*sender*/, + const ActionEventArgs& args) + { + _GoBackward(); + args.Handled(true); + } + void TerminalPage::_HandleOpenSettings(const IInspectable& /*sender*/, const ActionEventArgs& args) { diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp b/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp index 839d36d4e5f..ed3c414bf65 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp @@ -256,6 +256,16 @@ namespace winrt::TerminalApp::implementation _BreakIntoDebuggerHandlers(*this, eventArgs); break; } + case ShortcutAction::NextSearchMatch: + { + _NextSearchMatchHandlers(*this, eventArgs); + break; + } + case ShortcutAction::PrevSearchMatch: + { + _PrevSearchMatchHandlers(*this, eventArgs); + break; + } default: return false; } diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.h b/src/cascadia/TerminalApp/ShortcutActionDispatch.h index 787bc4d6ce2..f3745d360b5 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.h +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.h @@ -65,6 +65,8 @@ namespace winrt::TerminalApp::implementation TYPED_EVENT(TabSearch, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); TYPED_EVENT(MoveTab, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); TYPED_EVENT(BreakIntoDebugger, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); + TYPED_EVENT(NextSearchMatch, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); + TYPED_EVENT(PrevSearchMatch, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); // clang-format on private: diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.idl b/src/cascadia/TerminalApp/ShortcutActionDispatch.idl index c4e8780e6b6..3056bd6ddd3 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.idl +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.idl @@ -51,5 +51,7 @@ namespace TerminalApp event Windows.Foundation.TypedEventHandler TabSearch; event Windows.Foundation.TypedEventHandler MoveTab; event Windows.Foundation.TypedEventHandler BreakIntoDebugger; + event Windows.Foundation.TypedEventHandler NextSearchMatch; + event Windows.Foundation.TypedEventHandler PrevSearchMatch; } } diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 3f9b5ee83ff..c7d20e028ec 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -946,6 +946,7 @@ namespace winrt::TerminalApp::implementation auto setting = AppLogic::CurrentAppSettings(); auto keymap = setting.GlobalSettings().KeyMap(); const auto actionAndArgs = keymap.TryLookup(kc); + if (actionAndArgs) { if (CommandPalette().Visibility() == Visibility::Visible && actionAndArgs.Action() != ShortcutAction::ToggleCommandPalette) @@ -1022,6 +1023,8 @@ namespace winrt::TerminalApp::implementation _actionDispatch->TabSearch({ this, &TerminalPage::_HandleOpenTabSearch }); _actionDispatch->MoveTab({ this, &TerminalPage::_HandleMoveTab }); _actionDispatch->BreakIntoDebugger({ this, &TerminalPage::_HandleBreakIntoDebugger }); + _actionDispatch->NextSearchMatch({ this, &TerminalPage::_HandleNextSearchMatch }); + _actionDispatch->PrevSearchMatch({ this, &TerminalPage::_HandlePrevSearchMatch }); } // Method Description: @@ -2541,6 +2544,18 @@ namespace winrt::TerminalApp::implementation termControl.CreateSearchBoxControl(); } + void TerminalPage::_GoForward() + { + const auto termControl = _GetActiveControl(); + termControl.SearchNextMatch(); + } + + void TerminalPage::_GoBackward() + { + const auto termControl = _GetActiveControl(); + termControl.SearchPrevMatch(); + } + // Method Description: // - Toggles borderless mode. Hides the tab row, and raises our // FocusModeChanged event. diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index e80549cee5a..fd73125b37a 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -235,6 +235,8 @@ namespace winrt::TerminalApp::implementation void _OnSwitchToTabRequested(const IInspectable& sender, const winrt::TerminalApp::TabBase& tab); void _Find(); + void _GoForward(); + void _GoBackward(); winrt::fire_and_forget _RefreshUIForSettingsReload(); @@ -305,6 +307,8 @@ namespace winrt::TerminalApp::implementation void _HandleOpenTabSearch(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); void _HandleMoveTab(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); void _HandleBreakIntoDebugger(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); + void _HandleNextSearchMatch(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); + void _HandlePrevSearchMatch(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); // Make sure to hook new actions up in _RegisterActionCallbacks! #pragma endregion diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 85f878b2097..a19e7ee20f7 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -224,6 +224,26 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation } } + void TermControl::SearchNextMatch() + { + if (!_searchBox) + { + return; + } + keyBindingSearch = true; + _Search(_searchBox->TextBox().Text(), true, false); + } + + void TermControl::SearchPrevMatch() + { + if (!_searchBox) + { + return; + } + keyBindingSearch = true; + _Search(_searchBox->TextBox().Text(), false, false); + } + // Method Description: // - Search text in text buffer. This is triggered if the user click // search button or press enter. @@ -938,13 +958,24 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation void TermControl::_KeyHandler(Input::KeyRoutedEventArgs const& e, const bool keyDown) { + if (e.OriginalKey() == VirtualKey::Enter) + { + return; + } + // If the current focused element is a child element of searchbox, // we do not send this event up to terminal - if (_searchBox && _searchBox->ContainsFocus()) + if (_searchBox && _searchBox->ContainsFocus() && _searchBox->TextBox().Text().empty()) { return; } + if (keyBindingSearch) + { + keyBindingSearch = false; + return; + } + // Mark the event as handled and do nothing if we're closing, or the key // was the Windows key. // @@ -1916,6 +1947,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation return; } + _focused = true; InputPane::GetForCurrentView().TryShow(); diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index a90bea21cc5..3e2c5702f57 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -132,6 +132,9 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation void CreateSearchBoxControl(); + void SearchNextMatch(); + void SearchPrevMatch(); + bool OnDirectKeyEvent(const uint32_t vkey, const uint8_t scanCode, const bool down); bool OnMouseWheel(const Windows::Foundation::Point location, const int32_t delta, const bool leftButtonDown, const bool midButtonDown, const bool rightButtonDown); @@ -187,6 +190,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation bool _initializedTerminal; winrt::com_ptr _searchBox; + bool keyBindingSearch = true; event_token _connectionOutputEventToken; TerminalConnection::ITerminalConnection::StateChanged_revoker _connectionStateChangedRevoker; diff --git a/src/cascadia/TerminalControl/TermControl.idl b/src/cascadia/TerminalControl/TermControl.idl index bbce2174815..f6ab97f1d31 100644 --- a/src/cascadia/TerminalControl/TermControl.idl +++ b/src/cascadia/TerminalControl/TermControl.idl @@ -100,6 +100,9 @@ namespace Microsoft.Terminal.TerminalControl void CreateSearchBoxControl(); + void SearchNextMatch(); + void SearchPrevMatch(); + void AdjustFontSize(Int32 fontSizeDelta); void ResetFontSize(); diff --git a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp index 479c404dc2d..ce3776325b1 100644 --- a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp @@ -51,6 +51,8 @@ static constexpr std::string_view LegacyToggleRetroEffectKey{ "toggleRetroEffect static constexpr std::string_view ToggleShaderEffectsKey{ "toggleShaderEffects" }; static constexpr std::string_view MoveTabKey{ "moveTab" }; static constexpr std::string_view BreakIntoDebuggerKey{ "breakIntoDebugger" }; +static constexpr std::string_view NextSearchMatchKey{ "nextSearchMatchKey" }; +static constexpr std::string_view PrevSearchMatchKey{ "prevSearchMatchKey" }; static constexpr std::string_view ActionKey{ "action" }; @@ -115,6 +117,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { MoveTabKey, ShortcutAction::MoveTab }, { BreakIntoDebuggerKey, ShortcutAction::BreakIntoDebugger }, { UnboundKey, ShortcutAction::Invalid }, + { NextSearchMatchKey, ShortcutAction::NextSearchMatch }, + { PrevSearchMatchKey, ShortcutAction::PrevSearchMatch }, }; using ParseResult = std::tuple>; @@ -314,6 +318,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { ShortcutAction::ToggleShaderEffects, RS_(L"ToggleShaderEffectsCommandKey") }, { ShortcutAction::MoveTab, L"" }, // Intentionally omitted, must be generated by GenerateName { ShortcutAction::BreakIntoDebugger, RS_(L"BreakIntoDebuggerCommandKey") }, + { ShortcutAction::NextSearchMatch, RS_(L"NextSearchMatchCommandKey") }, + { ShortcutAction::PrevSearchMatch, RS_(L"PrevSearchMatchCommandKey") }, }; }(); diff --git a/src/cascadia/TerminalSettingsModel/KeyMapping.idl b/src/cascadia/TerminalSettingsModel/KeyMapping.idl index f28e0c467e0..20b6ae49772 100644 --- a/src/cascadia/TerminalSettingsModel/KeyMapping.idl +++ b/src/cascadia/TerminalSettingsModel/KeyMapping.idl @@ -52,7 +52,9 @@ namespace Microsoft.Terminal.Settings.Model CloseTabsAfter, TabSearch, MoveTab, - BreakIntoDebugger + BreakIntoDebugger, + NextSearchMatch, + PrevSearchMatch }; [default_interface] runtimeclass ActionAndArgs { diff --git a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw index da183b249dc..827d89d2a09 100644 --- a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw @@ -215,6 +215,12 @@ Find + + Next search match + + + Previous search match + Increase font size diff --git a/src/cascadia/TerminalSettingsModel/defaults.json b/src/cascadia/TerminalSettingsModel/defaults.json index 1d3226f2707..450da9f9501 100644 --- a/src/cascadia/TerminalSettingsModel/defaults.json +++ b/src/cascadia/TerminalSettingsModel/defaults.json @@ -285,6 +285,8 @@ { "command": "openSettings", "keys": "ctrl+," }, { "command": { "action": "openSettings", "target": "defaultsFile" }, "keys": "ctrl+alt+," }, { "command": "find", "keys": "ctrl+shift+f" }, + { "command": "nextSearchMatchKey", "keys": "ctrl+shift+n" }, + { "command": "prevSearchMatchKey", "keys": "ctrl+shift+k" }, { "command": "toggleShaderEffects" }, { "command": "openTabColorPicker" }, { "command": "renameTab" }, From 694d07a95196a90d13e745520ad67783835fa863 Mon Sep 17 00:00:00 2001 From: nogunumo Date: Mon, 21 Dec 2020 22:06:41 +0900 Subject: [PATCH 02/10] code format --- src/cascadia/TerminalApp/AppActionHandlers.cpp | 4 ++-- src/cascadia/TerminalControl/TermControl.cpp | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index a17e1548400..0dffd04c373 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -186,14 +186,14 @@ namespace winrt::TerminalApp::implementation } void TerminalPage::_HandleNextSearchMatch(const IInspectable& /*sender*/, - const ActionEventArgs& args) + const ActionEventArgs& args) { _GoForward(); args.Handled(true); } void TerminalPage::_HandlePrevSearchMatch(const IInspectable& /*sender*/, - const ActionEventArgs& args) + const ActionEventArgs& args) { _GoBackward(); args.Handled(true); diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index a19e7ee20f7..a06bd6ea195 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -970,7 +970,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation return; } - if (keyBindingSearch) + if (keyBindingSearch) { keyBindingSearch = false; return; @@ -1947,7 +1947,6 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation return; } - _focused = true; InputPane::GetForCurrentView().TryShow(); From 494aa4ba50b23a414957726c4d92ee1ec6a89b20 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 27 Jan 2021 15:02:04 -0600 Subject: [PATCH 03/10] Trying to revers engineer some of this weird logic. I think we can get away with only dismissing selection on key _down_. Otherwise keyups will dismiss the selection you just made --- src/cascadia/TerminalControl/TermControl.cpp | 25 +++++++++++--------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 6b6d07a69de..ab301dfd2f0 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -960,23 +960,23 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation void TermControl::_KeyHandler(Input::KeyRoutedEventArgs const& e, const bool keyDown) { - if (e.OriginalKey() == VirtualKey::Enter) - { - return; - } + // if (e.OriginalKey() == VirtualKey::Enter) + // { + // return; + // } // If the current focused element is a child element of searchbox, // we do not send this event up to terminal - if (_searchBox && _searchBox->ContainsFocus() && _searchBox->TextBox().Text().empty()) + if (_searchBox && _searchBox->ContainsFocus() /* && _searchBox->TextBox().Text().empty()*/) { return; } - if (keyBindingSearch) - { - keyBindingSearch = false; - return; - } + // if (keyBindingSearch) + // { + // keyBindingSearch = false; + // return; + // } // Mark the event as handled and do nothing if we're closing, or the key // was the Windows key. @@ -1118,7 +1118,10 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // modifier key. We'll wait for a real keystroke to dismiss the // GH #7395 - don't dismiss selection when taking PrintScreen // selection. - if (_terminal->IsSelectionActive() && !KeyEvent::IsModifierKey(vkey) && vkey != VK_SNAPSHOT) + if (_terminal->IsSelectionActive() && + !KeyEvent::IsModifierKey(vkey) && + vkey != VK_SNAPSHOT && + keyDown) { _terminal->ClearSelection(); _renderer->TriggerSelection(); From 0b9bfc86480a24f046b98b23939931e293d5b42e Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 27 Jan 2021 15:29:25 -0600 Subject: [PATCH 04/10] I'm shocked that this works --- src/cascadia/TerminalControl/TermControl.cpp | 29 +++++++++++++++++--- src/cascadia/TerminalControl/TermControl.h | 3 +- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index ab301dfd2f0..0f611ffe696 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -203,7 +203,8 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // get at its private implementation _searchBox.copy_from(winrt::get_self(searchBox)); _searchBox->Visibility(Visibility::Visible); - + // TODO: just do this in XAML + _searchBox->PreviewKeyDown({ this, &TermControl::_searchKeyHandler }); // If a text is selected inside terminal, use it to populate the search box. // If the search box already contains a value, it will be overridden. if (_terminal->IsSelectionActive()) @@ -249,11 +250,12 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // search button or press enter. // Arguments: // - text: the text to search - // - goForward: boolean that represents if the current search direction is forward // - caseSensitive: boolean that represents if the current search is case sensitive // Return Value: // - - void TermControl::_Search(const winrt::hstring& text, const bool goForward, const bool caseSensitive) + void TermControl::_Search(const winrt::hstring& text, + const bool goForward, + const bool caseSensitive) { if (text.size() == 0 || _closing) { @@ -286,7 +288,8 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // - RoutedEventArgs: not used // Return Value: // - - void TermControl::_CloseSearchBoxControl(const winrt::Windows::Foundation::IInspectable& /*sender*/, RoutedEventArgs const& /*args*/) + void TermControl::_CloseSearchBoxControl(const winrt::Windows::Foundation::IInspectable& /*sender*/, + RoutedEventArgs const& /*args*/) { _searchBox->Visibility(Visibility::Collapsed); @@ -294,6 +297,24 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation this->Focus(FocusState::Programmatic); } + // Method Description: + // - This event handler works to give the search box an attempt to process + // keybindings. Most notably, we need this for the findPrevious and + // findNext actions to be actionable from within the search box. + void TermControl::_searchKeyHandler(Windows::Foundation::IInspectable const& /*sender*/, + Input::KeyRoutedEventArgs const& e) + { + auto modifiers = _GetPressedModifierKeys(); + const auto vkey = gsl::narrow_cast(e.OriginalKey()); + const auto scanCode = gsl::narrow_cast(e.KeyStatus().ScanCode); + + if (!modifiers.IsAltGrPressed() && + _TryHandleKeyBinding(vkey, scanCode, modifiers)) + { + e.Handled(true); + } + } + // Method Description: // - Given new settings for this profile, applies the settings to the current terminal. // Arguments: diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index 58d99b6394b..31cef3a50c1 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -339,7 +339,8 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation void _CompositionCompleted(winrt::hstring text); void _CurrentCursorPositionHandler(const IInspectable& sender, const CursorPositionEventArgs& eventArgs); void _FontInfoHandler(const IInspectable& sender, const FontInfoEventArgs& eventArgs); - + void _searchKeyHandler(Windows::Foundation::IInspectable const& sender, + Windows::UI::Xaml::Input::KeyRoutedEventArgs const& e); winrt::fire_and_forget _AsyncCloseConnection(); }; } From 4ff17c514e3683da4dd67460cebb6773b848ca19 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 27 Jan 2021 16:44:34 -0600 Subject: [PATCH 05/10] cleanup for review --- .../TerminalApp/AppActionHandlers.cpp | 22 +++++++++++------- .../TerminalApp/ShortcutActionDispatch.cpp | 8 +++---- .../TerminalApp/ShortcutActionDispatch.h | 4 ++-- .../TerminalApp/ShortcutActionDispatch.idl | 4 ++-- src/cascadia/TerminalApp/TerminalPage.cpp | 16 ++----------- src/cascadia/TerminalApp/TerminalPage.h | 6 ++--- src/cascadia/TerminalControl/TermControl.cpp | 23 +++++-------------- src/cascadia/TerminalControl/TermControl.h | 3 +-- src/cascadia/TerminalControl/TermControl.xaml | 1 + .../TerminalSettingsModel/ActionAndArgs.cpp | 12 +++++----- .../TerminalSettingsModel/KeyMapping.idl | 4 ++-- .../Resources/en-US/Resources.resw | 4 ++-- .../TerminalSettingsModel/defaults.json | 4 ++-- 13 files changed, 46 insertions(+), 65 deletions(-) diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 2e8fdca74ea..843287e5de7 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -182,18 +182,24 @@ namespace winrt::TerminalApp::implementation args.Handled(true); } - void TerminalPage::_HandleNextSearchMatch(const IInspectable& /*sender*/, - const ActionEventArgs& args) + void TerminalPage::_HandleFindNext(const IInspectable& /*sender*/, + const ActionEventArgs& args) { - _GoForward(); - args.Handled(true); + if (const auto& control{ _GetActiveControl() }) + { + control.SearchNextMatch(); + args.Handled(true); + } } - void TerminalPage::_HandlePrevSearchMatch(const IInspectable& /*sender*/, - const ActionEventArgs& args) + void TerminalPage::_HandleFindPrev(const IInspectable& /*sender*/, + const ActionEventArgs& args) { - _GoBackward(); - args.Handled(true); + if (const auto& control{ _GetActiveControl() }) + { + control.SearchPrevMatch(); + args.Handled(true); + } } void TerminalPage::_HandleOpenSettings(const IInspectable& /*sender*/, diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp b/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp index ed3c414bf65..2721f6438c9 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp @@ -256,14 +256,14 @@ namespace winrt::TerminalApp::implementation _BreakIntoDebuggerHandlers(*this, eventArgs); break; } - case ShortcutAction::NextSearchMatch: + case ShortcutAction::FindNext: { - _NextSearchMatchHandlers(*this, eventArgs); + _FindNextHandlers(*this, eventArgs); break; } - case ShortcutAction::PrevSearchMatch: + case ShortcutAction::FindPrev: { - _PrevSearchMatchHandlers(*this, eventArgs); + _FindPrevHandlers(*this, eventArgs); break; } default: diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.h b/src/cascadia/TerminalApp/ShortcutActionDispatch.h index f3745d360b5..4d4c5b216ca 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.h +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.h @@ -65,8 +65,8 @@ namespace winrt::TerminalApp::implementation TYPED_EVENT(TabSearch, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); TYPED_EVENT(MoveTab, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); TYPED_EVENT(BreakIntoDebugger, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); - TYPED_EVENT(NextSearchMatch, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); - TYPED_EVENT(PrevSearchMatch, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); + TYPED_EVENT(FindNext, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); + TYPED_EVENT(FindPrev, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); // clang-format on private: diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.idl b/src/cascadia/TerminalApp/ShortcutActionDispatch.idl index 3056bd6ddd3..946ff387e7c 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.idl +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.idl @@ -51,7 +51,7 @@ namespace TerminalApp event Windows.Foundation.TypedEventHandler TabSearch; event Windows.Foundation.TypedEventHandler MoveTab; event Windows.Foundation.TypedEventHandler BreakIntoDebugger; - event Windows.Foundation.TypedEventHandler NextSearchMatch; - event Windows.Foundation.TypedEventHandler PrevSearchMatch; + event Windows.Foundation.TypedEventHandler FindNext; + event Windows.Foundation.TypedEventHandler FindPrev; } } diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 79e6d8beee0..a56c6c01843 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -1053,8 +1053,8 @@ namespace winrt::TerminalApp::implementation _actionDispatch->TabSearch({ this, &TerminalPage::_HandleOpenTabSearch }); _actionDispatch->MoveTab({ this, &TerminalPage::_HandleMoveTab }); _actionDispatch->BreakIntoDebugger({ this, &TerminalPage::_HandleBreakIntoDebugger }); - _actionDispatch->NextSearchMatch({ this, &TerminalPage::_HandleNextSearchMatch }); - _actionDispatch->PrevSearchMatch({ this, &TerminalPage::_HandlePrevSearchMatch }); + _actionDispatch->FindNext({ this, &TerminalPage::_HandleFindNext }); + _actionDispatch->FindPrev({ this, &TerminalPage::_HandleFindPrev }); } // Method Description: @@ -2554,18 +2554,6 @@ namespace winrt::TerminalApp::implementation termControl.CreateSearchBoxControl(); } - void TerminalPage::_GoForward() - { - const auto termControl = _GetActiveControl(); - termControl.SearchNextMatch(); - } - - void TerminalPage::_GoBackward() - { - const auto termControl = _GetActiveControl(); - termControl.SearchPrevMatch(); - } - // Method Description: // - Toggles borderless mode. Hides the tab row, and raises our // FocusModeChanged event. diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index e1c9c6ba0ec..d64b3250df9 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -239,8 +239,6 @@ namespace winrt::TerminalApp::implementation void _OnSwitchToTabRequested(const IInspectable& sender, const winrt::TerminalApp::TabBase& tab); void _Find(); - void _GoForward(); - void _GoBackward(); winrt::fire_and_forget _RefreshUIForSettingsReload(); @@ -314,8 +312,8 @@ namespace winrt::TerminalApp::implementation void _HandleOpenTabSearch(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); void _HandleMoveTab(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); void _HandleBreakIntoDebugger(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); - void _HandleNextSearchMatch(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); - void _HandlePrevSearchMatch(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); + void _HandleFindNext(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); + void _HandleFindPrev(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); // Make sure to hook new actions up in _RegisterActionCallbacks! #pragma endregion diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 0f611ffe696..58148f145fc 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -203,8 +203,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // get at its private implementation _searchBox.copy_from(winrt::get_self(searchBox)); _searchBox->Visibility(Visibility::Visible); - // TODO: just do this in XAML - _searchBox->PreviewKeyDown({ this, &TermControl::_searchKeyHandler }); + // If a text is selected inside terminal, use it to populate the search box. // If the search box already contains a value, it will be overridden. if (_terminal->IsSelectionActive()) @@ -231,7 +230,6 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation { return; } - keyBindingSearch = true; _Search(_searchBox->TextBox().Text(), true, false); } @@ -241,7 +239,6 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation { return; } - keyBindingSearch = true; _Search(_searchBox->TextBox().Text(), false, false); } @@ -301,7 +298,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // - This event handler works to give the search box an attempt to process // keybindings. Most notably, we need this for the findPrevious and // findNext actions to be actionable from within the search box. - void TermControl::_searchKeyHandler(Windows::Foundation::IInspectable const& /*sender*/, + void TermControl::_SearchKeyHandler(Windows::Foundation::IInspectable const& /*sender*/, Input::KeyRoutedEventArgs const& e) { auto modifiers = _GetPressedModifierKeys(); @@ -981,24 +978,13 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation void TermControl::_KeyHandler(Input::KeyRoutedEventArgs const& e, const bool keyDown) { - // if (e.OriginalKey() == VirtualKey::Enter) - // { - // return; - // } - // If the current focused element is a child element of searchbox, // we do not send this event up to terminal - if (_searchBox && _searchBox->ContainsFocus() /* && _searchBox->TextBox().Text().empty()*/) + if (_searchBox && _searchBox->ContainsFocus()) { return; } - // if (keyBindingSearch) - // { - // keyBindingSearch = false; - // return; - // } - // Mark the event as handled and do nothing if we're closing, or the key // was the Windows key. // @@ -1139,6 +1125,9 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // modifier key. We'll wait for a real keystroke to dismiss the // GH #7395 - don't dismiss selection when taking PrintScreen // selection. + // GH#8522, GH#3758 - Only dismiss the selection on key _down_. If we + // dismiss on key up, then there's chance that we'll immediately dismiss + // a selection created by an action bound to a keydown. if (_terminal->IsSelectionActive() && !KeyEvent::IsModifierKey(vkey) && vkey != VK_SNAPSHOT && diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index 31cef3a50c1..8b9e4dca837 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -193,7 +193,6 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation bool _initializedTerminal; winrt::com_ptr _searchBox; - bool keyBindingSearch = true; event_token _connectionOutputEventToken; TerminalConnection::ITerminalConnection::StateChanged_revoker _connectionStateChangedRevoker; @@ -339,7 +338,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation void _CompositionCompleted(winrt::hstring text); void _CurrentCursorPositionHandler(const IInspectable& sender, const CursorPositionEventArgs& eventArgs); void _FontInfoHandler(const IInspectable& sender, const FontInfoEventArgs& eventArgs); - void _searchKeyHandler(Windows::Foundation::IInspectable const& sender, + void _SearchKeyHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs const& e); winrt::fire_and_forget _AsyncCloseConnection(); }; diff --git a/src/cascadia/TerminalControl/TermControl.xaml b/src/cascadia/TerminalControl/TermControl.xaml index 8ef1d8f835a..fe83aa7236b 100644 --- a/src/cascadia/TerminalControl/TermControl.xaml +++ b/src/cascadia/TerminalControl/TermControl.xaml @@ -76,6 +76,7 @@ HorizontalAlignment="Right" VerticalAlignment="Top" Search="_Search" + PreviewKeyDown="_SearchKeyHandler" Closed="_CloseSearchBoxControl" /> diff --git a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp index ce3776325b1..2cc6f89689f 100644 --- a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp @@ -51,8 +51,8 @@ static constexpr std::string_view LegacyToggleRetroEffectKey{ "toggleRetroEffect static constexpr std::string_view ToggleShaderEffectsKey{ "toggleShaderEffects" }; static constexpr std::string_view MoveTabKey{ "moveTab" }; static constexpr std::string_view BreakIntoDebuggerKey{ "breakIntoDebugger" }; -static constexpr std::string_view NextSearchMatchKey{ "nextSearchMatchKey" }; -static constexpr std::string_view PrevSearchMatchKey{ "prevSearchMatchKey" }; +static constexpr std::string_view FindNextKey{ "findNext" }; +static constexpr std::string_view FindPrevKey{ "findPrev" }; static constexpr std::string_view ActionKey{ "action" }; @@ -117,8 +117,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { MoveTabKey, ShortcutAction::MoveTab }, { BreakIntoDebuggerKey, ShortcutAction::BreakIntoDebugger }, { UnboundKey, ShortcutAction::Invalid }, - { NextSearchMatchKey, ShortcutAction::NextSearchMatch }, - { PrevSearchMatchKey, ShortcutAction::PrevSearchMatch }, + { FindNextKey, ShortcutAction::FindNext }, + { FindPrevKey, ShortcutAction::FindPrev }, }; using ParseResult = std::tuple>; @@ -318,8 +318,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { ShortcutAction::ToggleShaderEffects, RS_(L"ToggleShaderEffectsCommandKey") }, { ShortcutAction::MoveTab, L"" }, // Intentionally omitted, must be generated by GenerateName { ShortcutAction::BreakIntoDebugger, RS_(L"BreakIntoDebuggerCommandKey") }, - { ShortcutAction::NextSearchMatch, RS_(L"NextSearchMatchCommandKey") }, - { ShortcutAction::PrevSearchMatch, RS_(L"PrevSearchMatchCommandKey") }, + { ShortcutAction::FindNext, RS_(L"FindNextCommandKey") }, + { ShortcutAction::FindPrev, RS_(L"FindPrevCommandKey") }, }; }(); diff --git a/src/cascadia/TerminalSettingsModel/KeyMapping.idl b/src/cascadia/TerminalSettingsModel/KeyMapping.idl index 20b6ae49772..9c9fb42ea10 100644 --- a/src/cascadia/TerminalSettingsModel/KeyMapping.idl +++ b/src/cascadia/TerminalSettingsModel/KeyMapping.idl @@ -53,8 +53,8 @@ namespace Microsoft.Terminal.Settings.Model TabSearch, MoveTab, BreakIntoDebugger, - NextSearchMatch, - PrevSearchMatch + FindNext, + FindPrev }; [default_interface] runtimeclass ActionAndArgs { diff --git a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw index 3595295c017..d7ab4c93b26 100644 --- a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw @@ -215,10 +215,10 @@ Find - + Next search match - + Previous search match diff --git a/src/cascadia/TerminalSettingsModel/defaults.json b/src/cascadia/TerminalSettingsModel/defaults.json index 1c9f1f62a6b..4f580dd03ce 100644 --- a/src/cascadia/TerminalSettingsModel/defaults.json +++ b/src/cascadia/TerminalSettingsModel/defaults.json @@ -286,8 +286,8 @@ { "command": "openSettings", "keys": "ctrl+," }, { "command": { "action": "openSettings", "target": "defaultsFile" }, "keys": "ctrl+alt+," }, { "command": "find", "keys": "ctrl+shift+f" }, - { "command": "nextSearchMatchKey", "keys": "ctrl+shift+n" }, - { "command": "prevSearchMatchKey", "keys": "ctrl+shift+k" }, + { "command": "findNext" }, + { "command": "findPrev" }, { "command": "toggleShaderEffects" }, { "command": "openTabColorPicker" }, { "command": "renameTab" }, From 01d7ef3b1464683b25dd83c0b83ad91e9fc58224 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Wed, 3 Feb 2021 16:56:57 -0600 Subject: [PATCH 06/10] address carlos's suggestions --- doc/cascadia/profiles.schema.json | 26 +++++++++++ .../TerminalApp/AppActionHandlers.cpp | 24 ++++------ .../TerminalApp/ShortcutActionDispatch.cpp | 9 +--- .../TerminalApp/ShortcutActionDispatch.h | 3 +- .../TerminalApp/ShortcutActionDispatch.idl | 3 +- src/cascadia/TerminalApp/TerminalPage.cpp | 3 +- src/cascadia/TerminalApp/TerminalPage.h | 3 +- src/cascadia/TerminalControl/TermControl.cpp | 17 +++---- src/cascadia/TerminalControl/TermControl.h | 3 +- src/cascadia/TerminalControl/TermControl.idl | 3 +- .../TerminalSettingsModel/ActionAndArgs.cpp | 10 ++-- .../TerminalSettingsModel/ActionArgs.cpp | 13 ++++++ .../TerminalSettingsModel/ActionArgs.h | 46 +++++++++++++++++++ .../TerminalSettingsModel/ActionArgs.idl | 13 ++++++ .../TerminalSettingsModel/KeyMapping.idl | 3 +- .../Resources/en-US/Resources.resw | 4 +- .../TerminalSettingsSerializationHelpers.h | 8 ++++ .../TerminalSettingsModel/defaults.json | 4 +- 18 files changed, 137 insertions(+), 58 deletions(-) diff --git a/doc/cascadia/profiles.schema.json b/doc/cascadia/profiles.schema.json index bf1bad790fb..febbd977a34 100644 --- a/doc/cascadia/profiles.schema.json +++ b/doc/cascadia/profiles.schema.json @@ -76,6 +76,7 @@ "copy", "duplicateTab", "find", + "findMatch", "moveFocus", "moveTab", "newTab", @@ -137,6 +138,13 @@ ], "type": "string" }, + "FindMatchDirection": { + "enum": [ + "next", + "prev" + ], + "type": "string" + }, "SplitState": { "enum": [ "vertical", @@ -558,6 +566,23 @@ } ] }, + "FindMatchAction": { + "description": "Arguments corresponding to a Find Match Action", + "allOf": [ + { "$ref": "#/definitions/ShortcutAction" }, + { + "properties": { + "action": { "type": "string", "pattern": "findMatch" }, + "direction": { + "$ref": "#/definitions/FindMatchDirection", + "default": "prev", + "description": "The direction to search in. \"prev\" will search upwards in the buffer, and \"next\" will search downwards." + } + } + } + ], + "required": [ "direction" ] + }, "Keybinding": { "additionalProperties": false, "properties": { @@ -582,6 +607,7 @@ { "$ref": "#/definitions/ScrollUpAction" }, { "$ref": "#/definitions/ScrollDownAction" }, { "$ref": "#/definitions/MoveTabAction" }, + { "$ref": "#/definitions/FindMatchAction" }, { "type": "null" } ] }, diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 843287e5de7..b1b134be68b 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -182,26 +182,18 @@ namespace winrt::TerminalApp::implementation args.Handled(true); } - void TerminalPage::_HandleFindNext(const IInspectable& /*sender*/, - const ActionEventArgs& args) - { - if (const auto& control{ _GetActiveControl() }) - { - control.SearchNextMatch(); - args.Handled(true); - } - } - - void TerminalPage::_HandleFindPrev(const IInspectable& /*sender*/, - const ActionEventArgs& args) + void TerminalPage::_HandleFindMatch(const IInspectable& /*sender*/, + const ActionEventArgs& args) { - if (const auto& control{ _GetActiveControl() }) + if (const auto& realArgs = args.ActionArgs().try_as()) { - control.SearchPrevMatch(); - args.Handled(true); + if (const auto& control{ _GetActiveControl() }) + { + control.SearchMatch(realArgs.Direction() == FindMatchDirection::Next); + args.Handled(true); + } } } - void TerminalPage::_HandleOpenSettings(const IInspectable& /*sender*/, const ActionEventArgs& args) { diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp b/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp index 2721f6438c9..64efef477bb 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp @@ -256,14 +256,9 @@ namespace winrt::TerminalApp::implementation _BreakIntoDebuggerHandlers(*this, eventArgs); break; } - case ShortcutAction::FindNext: + case ShortcutAction::FindMatch: { - _FindNextHandlers(*this, eventArgs); - break; - } - case ShortcutAction::FindPrev: - { - _FindPrevHandlers(*this, eventArgs); + _FindMatchHandlers(*this, eventArgs); break; } default: diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.h b/src/cascadia/TerminalApp/ShortcutActionDispatch.h index 4d4c5b216ca..84f1cb32d82 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.h +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.h @@ -65,8 +65,7 @@ namespace winrt::TerminalApp::implementation TYPED_EVENT(TabSearch, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); TYPED_EVENT(MoveTab, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); TYPED_EVENT(BreakIntoDebugger, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); - TYPED_EVENT(FindNext, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); - TYPED_EVENT(FindPrev, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); + TYPED_EVENT(FindMatch, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs); // clang-format on private: diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.idl b/src/cascadia/TerminalApp/ShortcutActionDispatch.idl index 946ff387e7c..7291dff7dfb 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.idl +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.idl @@ -51,7 +51,6 @@ namespace TerminalApp event Windows.Foundation.TypedEventHandler TabSearch; event Windows.Foundation.TypedEventHandler MoveTab; event Windows.Foundation.TypedEventHandler BreakIntoDebugger; - event Windows.Foundation.TypedEventHandler FindNext; - event Windows.Foundation.TypedEventHandler FindPrev; + event Windows.Foundation.TypedEventHandler FindMatch; } } diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 538c6bbece6..e33a79dddb5 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -1053,8 +1053,7 @@ namespace winrt::TerminalApp::implementation _actionDispatch->TabSearch({ this, &TerminalPage::_HandleOpenTabSearch }); _actionDispatch->MoveTab({ this, &TerminalPage::_HandleMoveTab }); _actionDispatch->BreakIntoDebugger({ this, &TerminalPage::_HandleBreakIntoDebugger }); - _actionDispatch->FindNext({ this, &TerminalPage::_HandleFindNext }); - _actionDispatch->FindPrev({ this, &TerminalPage::_HandleFindPrev }); + _actionDispatch->FindMatch({ this, &TerminalPage::_HandleFindMatch }); } // Method Description: diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index d64b3250df9..32673527333 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -312,8 +312,7 @@ namespace winrt::TerminalApp::implementation void _HandleOpenTabSearch(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); void _HandleMoveTab(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); void _HandleBreakIntoDebugger(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); - void _HandleFindNext(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); - void _HandleFindPrev(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); + void _HandleFindMatch(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args); // Make sure to hook new actions up in _RegisterActionCallbacks! #pragma endregion diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index b4c19206e9d..08e92e4c1f1 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -224,22 +224,16 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation } } - void TermControl::SearchNextMatch() + void TermControl::SearchMatch(const bool goForward) { if (!_searchBox) { - return; + CreateSearchBoxControl(); } - _Search(_searchBox->TextBox().Text(), true, false); - } - - void TermControl::SearchPrevMatch() - { - if (!_searchBox) + else { - return; + _Search(_searchBox->TextBox().Text(), goForward, false); } - _Search(_searchBox->TextBox().Text(), false, false); } // Method Description: @@ -247,6 +241,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation // search button or press enter. // Arguments: // - text: the text to search + // - goForward: boolean that represents if the current search direction is forward // - caseSensitive: boolean that represents if the current search is case sensitive // Return Value: // - @@ -301,7 +296,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation void TermControl::_SearchKeyHandler(Windows::Foundation::IInspectable const& /*sender*/, Input::KeyRoutedEventArgs const& e) { - auto modifiers = _GetPressedModifierKeys(); + const auto modifiers = _GetPressedModifierKeys(); const auto vkey = gsl::narrow_cast(e.OriginalKey()); const auto scanCode = gsl::narrow_cast(e.KeyStatus().ScanCode); diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index 8b9e4dca837..cd3f141e3d9 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -133,8 +133,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation void CreateSearchBoxControl(); - void SearchNextMatch(); - void SearchPrevMatch(); + void SearchMatch(const bool goForward); bool OnDirectKeyEvent(const uint32_t vkey, const uint8_t scanCode, const bool down); diff --git a/src/cascadia/TerminalControl/TermControl.idl b/src/cascadia/TerminalControl/TermControl.idl index 61fe2b7aa98..537ef4f04d1 100644 --- a/src/cascadia/TerminalControl/TermControl.idl +++ b/src/cascadia/TerminalControl/TermControl.idl @@ -102,8 +102,7 @@ namespace Microsoft.Terminal.TerminalControl void CreateSearchBoxControl(); - void SearchNextMatch(); - void SearchPrevMatch(); + void SearchMatch(Boolean goForward); void AdjustFontSize(Int32 fontSizeDelta); void ResetFontSize(); diff --git a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp index 2cc6f89689f..d876cc4fa9d 100644 --- a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp @@ -51,8 +51,7 @@ static constexpr std::string_view LegacyToggleRetroEffectKey{ "toggleRetroEffect static constexpr std::string_view ToggleShaderEffectsKey{ "toggleShaderEffects" }; static constexpr std::string_view MoveTabKey{ "moveTab" }; static constexpr std::string_view BreakIntoDebuggerKey{ "breakIntoDebugger" }; -static constexpr std::string_view FindNextKey{ "findNext" }; -static constexpr std::string_view FindPrevKey{ "findPrev" }; +static constexpr std::string_view FindMatchKey{ "findMatch" }; static constexpr std::string_view ActionKey{ "action" }; @@ -117,8 +116,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { MoveTabKey, ShortcutAction::MoveTab }, { BreakIntoDebuggerKey, ShortcutAction::BreakIntoDebugger }, { UnboundKey, ShortcutAction::Invalid }, - { FindNextKey, ShortcutAction::FindNext }, - { FindPrevKey, ShortcutAction::FindPrev }, + { FindMatchKey, ShortcutAction::FindMatch }, }; using ParseResult = std::tuple>; @@ -149,6 +147,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { ShortcutAction::ScrollDown, ScrollDownArgs::FromJson }, { ShortcutAction::MoveTab, MoveTabArgs::FromJson }, { ShortcutAction::ToggleCommandPalette, ToggleCommandPaletteArgs::FromJson }, + { ShortcutAction::FindMatch, FindMatchArgs::FromJson }, { ShortcutAction::Invalid, nullptr }, }; @@ -318,8 +317,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { ShortcutAction::ToggleShaderEffects, RS_(L"ToggleShaderEffectsCommandKey") }, { ShortcutAction::MoveTab, L"" }, // Intentionally omitted, must be generated by GenerateName { ShortcutAction::BreakIntoDebugger, RS_(L"BreakIntoDebuggerCommandKey") }, - { ShortcutAction::FindNext, RS_(L"FindNextCommandKey") }, - { ShortcutAction::FindPrev, RS_(L"FindPrevCommandKey") }, + { ShortcutAction::FindMatch, L"" }, // Intentionally omitted, must be generated by GenerateName }; }(); diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp index 22744cacfad..218368125d5 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp @@ -23,6 +23,7 @@ #include "CloseOtherTabsArgs.g.cpp" #include "CloseTabsAfterArgs.g.cpp" #include "MoveTabArgs.g.cpp" +#include "FindMatchArgs.g.cpp" #include "ToggleCommandPaletteArgs.g.cpp" #include @@ -431,4 +432,16 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation } return RS_(L"ToggleCommandPaletteCommandKey"); } + + winrt::hstring FindMatchArgs::GenerateName() const + { + switch (_Direction) + { + case FindMatchDirection::Next: + return winrt::hstring{ RS_(L"FindNextCommandKey") }; + case FindMatchDirection::Previous: + return winrt::hstring{ RS_(L"FindPrevCommandKey") }; + } + return L""; + } } diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.h b/src/cascadia/TerminalSettingsModel/ActionArgs.h index 7a249330cf0..31898031cdc 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.h +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.h @@ -26,6 +26,7 @@ #include "ScrollDownArgs.g.h" #include "MoveTabArgs.g.h" #include "ToggleCommandPaletteArgs.g.h" +#include "FindMatchArgs.g.h" #include "../../cascadia/inc/cppwinrt_utils.h" #include "JsonUtils.h" @@ -838,6 +839,50 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation return *copy; } }; + + struct FindMatchArgs : public FindMatchArgsT + { + FindMatchArgs() = default; + FindMatchArgs(FindMatchDirection direction) : + _Direction{ direction } {}; + GETSET_PROPERTY(FindMatchDirection, Direction, FindMatchDirection::None); + + static constexpr std::string_view DirectionKey{ "direction" }; + + public: + hstring GenerateName() const; + + bool Equals(const IActionArgs& other) + { + auto otherAsUs = other.try_as(); + if (otherAsUs) + { + return otherAsUs->_Direction == _Direction; + } + return false; + }; + static FromJsonResult FromJson(const Json::Value& json) + { + // LOAD BEARING: Not using make_self here _will_ break you in the future! + auto args = winrt::make_self(); + JsonUtils::GetValueForKey(json, DirectionKey, args->_Direction); + if (args->_Direction == FindMatchDirection::None) + { + return { nullptr, { SettingsLoadWarnings::MissingRequiredParameter } }; + } + else + { + return { *args, {} }; + } + } + IActionArgs Copy() const + { + auto copy{ winrt::make_self() }; + copy->_Direction = _Direction; + return *copy; + } + }; + } namespace winrt::Microsoft::Terminal::Settings::Model::factory_implementation @@ -853,4 +898,5 @@ namespace winrt::Microsoft::Terminal::Settings::Model::factory_implementation BASIC_FACTORY(CloseTabsAfterArgs); BASIC_FACTORY(MoveTabArgs); BASIC_FACTORY(OpenSettingsArgs); + BASIC_FACTORY(FindMatchArgs); } diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.idl b/src/cascadia/TerminalSettingsModel/ActionArgs.idl index e4413fbd452..498cc475db3 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.idl +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.idl @@ -64,6 +64,13 @@ namespace Microsoft.Terminal.Settings.Model Backward }; + enum FindMatchDirection + { + None = 0, + Next, + Previous + }; + enum CommandPaletteLaunchMode { Action = 0, @@ -204,4 +211,10 @@ namespace Microsoft.Terminal.Settings.Model { CommandPaletteLaunchMode LaunchMode { get; }; }; + + [default_interface] runtimeclass FindMatchArgs : IActionArgs + { + FindMatchArgs(FindMatchDirection direction); + FindMatchDirection Direction { get; }; + }; } diff --git a/src/cascadia/TerminalSettingsModel/KeyMapping.idl b/src/cascadia/TerminalSettingsModel/KeyMapping.idl index 9c9fb42ea10..b42a89cb38f 100644 --- a/src/cascadia/TerminalSettingsModel/KeyMapping.idl +++ b/src/cascadia/TerminalSettingsModel/KeyMapping.idl @@ -53,8 +53,7 @@ namespace Microsoft.Terminal.Settings.Model TabSearch, MoveTab, BreakIntoDebugger, - FindNext, - FindPrev + FindMatch }; [default_interface] runtimeclass ActionAndArgs { diff --git a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw index d7ab4c93b26..abb0999d668 100644 --- a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw @@ -216,10 +216,10 @@ Find - Next search match + Find next search match - Previous search match + Find previous search match Increase font size diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h b/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h index 82b16cdefb0..c71e858d06b 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h +++ b/src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h @@ -431,3 +431,11 @@ JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Settings::Model::CommandPaletteLa pair_type{ "commandLine", ValueType::CommandLine }, }; }; + +JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Settings::Model::FindMatchDirection) +{ + JSON_MAPPINGS(2) = { + pair_type{ "next", ValueType::Next }, + pair_type{ "prev", ValueType::Previous }, + }; +}; diff --git a/src/cascadia/TerminalSettingsModel/defaults.json b/src/cascadia/TerminalSettingsModel/defaults.json index 4f580dd03ce..fe194284352 100644 --- a/src/cascadia/TerminalSettingsModel/defaults.json +++ b/src/cascadia/TerminalSettingsModel/defaults.json @@ -286,8 +286,8 @@ { "command": "openSettings", "keys": "ctrl+," }, { "command": { "action": "openSettings", "target": "defaultsFile" }, "keys": "ctrl+alt+," }, { "command": "find", "keys": "ctrl+shift+f" }, - { "command": "findNext" }, - { "command": "findPrev" }, + { "command": { "action": "findMatch", "direction": "next" } }, + { "command": { "action": "findMatch", "direction": "prev" } }, { "command": "toggleShaderEffects" }, { "command": "openTabColorPicker" }, { "command": "renameTab" }, From ba0c029b8e4a985aba13490f41456b6a3c6e9d74 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Thu, 11 Feb 2021 10:18:43 -0600 Subject: [PATCH 07/10] I'm a GENIUS --- src/cascadia/TerminalControl/TermControl.cpp | 14 +++++++------- src/cascadia/TerminalControl/TermControl.xaml | 1 - 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 08e92e4c1f1..c62e9aab12d 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -973,13 +973,6 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation void TermControl::_KeyHandler(Input::KeyRoutedEventArgs const& e, const bool keyDown) { - // If the current focused element is a child element of searchbox, - // we do not send this event up to terminal - if (_searchBox && _searchBox->ContainsFocus()) - { - return; - } - // Mark the event as handled and do nothing if we're closing, or the key // was the Windows key. // @@ -1032,6 +1025,13 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation return; } + // If the current focused element is a child element of searchbox, + // we do not send this event up to terminal + if (_searchBox && _searchBox->ContainsFocus()) + { + return; + } + if (_TrySendKeyEvent(vkey, scanCode, modifiers, keyDown)) { e.Handled(true); diff --git a/src/cascadia/TerminalControl/TermControl.xaml b/src/cascadia/TerminalControl/TermControl.xaml index fe83aa7236b..8ef1d8f835a 100644 --- a/src/cascadia/TerminalControl/TermControl.xaml +++ b/src/cascadia/TerminalControl/TermControl.xaml @@ -76,7 +76,6 @@ HorizontalAlignment="Right" VerticalAlignment="Top" Search="_Search" - PreviewKeyDown="_SearchKeyHandler" Closed="_CloseSearchBoxControl" /> From b4545e0e0a9e3beda192fb21aaa9742d24477c9b Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Thu, 11 Feb 2021 10:21:41 -0600 Subject: [PATCH 08/10] cleanup --- src/cascadia/TerminalControl/TermControl.cpp | 24 ++++---------------- src/cascadia/TerminalControl/TermControl.h | 2 -- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index c62e9aab12d..175a18ecf6a 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -289,24 +289,6 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation this->Focus(FocusState::Programmatic); } - // Method Description: - // - This event handler works to give the search box an attempt to process - // keybindings. Most notably, we need this for the findPrevious and - // findNext actions to be actionable from within the search box. - void TermControl::_SearchKeyHandler(Windows::Foundation::IInspectable const& /*sender*/, - Input::KeyRoutedEventArgs const& e) - { - const auto modifiers = _GetPressedModifierKeys(); - const auto vkey = gsl::narrow_cast(e.OriginalKey()); - const auto scanCode = gsl::narrow_cast(e.KeyStatus().ScanCode); - - if (!modifiers.IsAltGrPressed() && - _TryHandleKeyBinding(vkey, scanCode, modifiers)) - { - e.Handled(true); - } - } - // Method Description: // - Given new settings for this profile, applies the settings to the current terminal. // Arguments: @@ -1025,8 +1007,10 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation return; } - // If the current focused element is a child element of searchbox, - // we do not send this event up to terminal + // If the current focused element is a child element of searchbox, we do + // not send this event up to terminal. Do this _AFTER_ the call to + // _TryHandleKeyBinding, so that keybindings (esp. findMatch) will still + // work when the search box is open. if (_searchBox && _searchBox->ContainsFocus()) { return; diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index cd3f141e3d9..43cfcf7854c 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -337,8 +337,6 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation void _CompositionCompleted(winrt::hstring text); void _CurrentCursorPositionHandler(const IInspectable& sender, const CursorPositionEventArgs& eventArgs); void _FontInfoHandler(const IInspectable& sender, const FontInfoEventArgs& eventArgs); - void _SearchKeyHandler(Windows::Foundation::IInspectable const& sender, - Windows::UI::Xaml::Input::KeyRoutedEventArgs const& e); winrt::fire_and_forget _AsyncCloseConnection(); }; } From 428c22a7d752ff382c9e832a51e80af3b5c7275f Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Thu, 11 Feb 2021 17:03:11 -0600 Subject: [PATCH 09/10] Nevermind, I am _not_ a genius --- src/cascadia/TerminalControl/TermControl.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 071307fe5e9..735a009a8c2 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -958,6 +958,15 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation void TermControl::_KeyHandler(Input::KeyRoutedEventArgs const& e, const bool keyDown) { + // If the current focused element is a child element of searchbox, we do + // not send this event up to terminal. Do this _AFTER_ the call to + // _TryHandleKeyBinding, so that keybindings (esp. findMatch) will still + // work when the search box is open. + if (_searchBox && _searchBox->ContainsFocus()) + { + return; + } + // Mark the event as handled and do nothing if we're closing, or the key // was the Windows key. // @@ -1018,15 +1027,6 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation return; } - // If the current focused element is a child element of searchbox, we do - // not send this event up to terminal. Do this _AFTER_ the call to - // _TryHandleKeyBinding, so that keybindings (esp. findMatch) will still - // work when the search box is open. - if (_searchBox && _searchBox->ContainsFocus()) - { - return; - } - if (_TrySendKeyEvent(vkey, scanCode, modifiers, keyDown)) { e.Handled(true); From 0dfc4e91d16487ee78e11e22f2edce90e3b86baa Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Thu, 18 Feb 2021 04:24:33 -0600 Subject: [PATCH 10/10] Update src/cascadia/TerminalControl/TermControl.cpp --- src/cascadia/TerminalControl/TermControl.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 735a009a8c2..6a12a40533c 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -958,10 +958,8 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation void TermControl::_KeyHandler(Input::KeyRoutedEventArgs const& e, const bool keyDown) { - // If the current focused element is a child element of searchbox, we do - // not send this event up to terminal. Do this _AFTER_ the call to - // _TryHandleKeyBinding, so that keybindings (esp. findMatch) will still - // work when the search box is open. + // If the current focused element is a child element of searchbox, + // we do not send this event up to terminal if (_searchBox && _searchBox->ContainsFocus()) { return;