Skip to content

Commit 45d133a

Browse files
committed
fix some search highlights scenarios
1 parent 13de7c6 commit 45d133a

File tree

3 files changed

+39
-7
lines changed

3 files changed

+39
-7
lines changed

src/cascadia/TerminalControl/SearchBoxControl.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
154154
// search box remains in Visible state (though not really *visible*) during the
155155
// first load. So, we only need to apply this check here (after checking that
156156
// we're done initializing).
157-
if (Visibility() == Visibility::Visible)
157+
if(IsOpen())
158158
{
159159
callback();
160160
return;
@@ -195,6 +195,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation
195195
}
196196
}
197197

198+
bool SearchBoxControl::IsOpen()
199+
{
200+
return Visibility() == Visibility::Visible && CloseAnimation().GetCurrentState() != Media::Animation::ClockState::Active;
201+
}
202+
198203
winrt::hstring SearchBoxControl::Text()
199204
{
200205
return TextBox().Text();

src/cascadia/TerminalControl/SearchBoxControl.h

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
3434
void TextBoxKeyDown(const winrt::Windows::Foundation::IInspectable& /*sender*/, const winrt::Windows::UI::Xaml::Input::KeyRoutedEventArgs& e);
3535
void Open(std::function<void()> callback);
3636
void Close();
37+
bool IsOpen();
3738

3839
winrt::hstring Text();
3940
bool GoForward();

src/cascadia/TerminalControl/TermControl.cpp

+32-6
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
493493
}
494494
}
495495

496-
if (_searchBox && _searchBox->Visibility() == Visibility::Visible)
496+
if (_searchBox && _searchBox->IsOpen())
497497
{
498498
const auto core = winrt::get_self<ControlCore>(_core);
499499
const auto& searchMatches = core->SearchResultRows();
@@ -538,6 +538,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
538538
// but since code paths differ, extra work is required to ensure correctness.
539539
if (!_core.HasMultiLineSelection())
540540
{
541+
_core.SnapSearchResultToSelection(true);
541542
const auto selectedLine{ _core.SelectedText(true) };
542543
_searchBox->PopulateTextbox(selectedLine);
543544
}
@@ -554,13 +555,14 @@ namespace winrt::Microsoft::Terminal::Control::implementation
554555
}
555556
}
556557

558+
// This is called when a Find Next/Previous Match action is triggered.
557559
void TermControl::SearchMatch(const bool goForward)
558560
{
559561
if (_IsClosing())
560562
{
561563
return;
562564
}
563-
if (!_searchBox || _searchBox->Visibility() != Visibility::Visible)
565+
if (!_searchBox || !_searchBox->IsOpen())
564566
{
565567
CreateSearchBoxControl();
566568
}
@@ -601,7 +603,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
601603
}
602604

603605
// Method Description:
604-
// - The handler for the "search criteria changed" event. Clears selection and initiates a new search.
606+
// - The handler for the "search criteria changed" event. Initiates a new search.
605607
// Arguments:
606608
// - text: the text to search
607609
// - goForward: indicates whether the search should be performed forward (if set to true) or backward
@@ -614,7 +616,10 @@ namespace winrt::Microsoft::Terminal::Control::implementation
614616
{
615617
if (_searchBox && _searchBox->Visibility() == Visibility::Visible)
616618
{
617-
_handleSearchResults(_core.Search(text, goForward, caseSensitive, false));
619+
// We only want to update the search results based on the new text. Set
620+
// `resetOnly` to true so we don't accidentally update the current match index.
621+
const auto result = _core.Search(text, goForward, caseSensitive, true);
622+
_handleSearchResults(result);
618623
}
619624
}
620625

@@ -632,6 +637,19 @@ namespace winrt::Microsoft::Terminal::Control::implementation
632637
_searchBox->Close();
633638
_core.ClearSearch();
634639

640+
// Clear search highlights scrollmarks (by triggering an update after closing the search box)
641+
if (_showMarksInScrollbar)
642+
{
643+
const auto scrollBar = ScrollBar();
644+
ScrollBarUpdate update{
645+
.newValue = scrollBar.Value(),
646+
.newMaximum = scrollBar.Maximum(),
647+
.newMinimum = scrollBar.Minimum(),
648+
.newViewportSize = scrollBar.ViewportSize(),
649+
};
650+
_updateScrollBar->Run(update);
651+
}
652+
635653
// Set focus back to terminal control
636654
this->Focus(FocusState::Programmatic);
637655
}
@@ -3593,7 +3611,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
35933611

35943612
void TermControl::_refreshSearch()
35953613
{
3596-
if (!_searchBox || _searchBox->Visibility() != Visibility::Visible)
3614+
if (!_searchBox || !_searchBox->IsOpen())
35973615
{
35983616
return;
35993617
}
@@ -3616,7 +3634,15 @@ namespace winrt::Microsoft::Terminal::Control::implementation
36163634
return;
36173635
}
36183636

3619-
_searchBox->SetStatus(results.TotalMatches, results.CurrentMatch);
3637+
// Only show status when we have a search term
3638+
if (_searchBox->Text().empty())
3639+
{
3640+
_searchBox->ClearStatus();
3641+
}
3642+
else
3643+
{
3644+
_searchBox->SetStatus(results.TotalMatches, results.CurrentMatch);
3645+
}
36203646

36213647
if (results.SearchInvalidated)
36223648
{

0 commit comments

Comments
 (0)