@@ -547,6 +547,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
547547 _searchBox->Open ([weakThis = get_weak ()]() {
548548 if (const auto self = weakThis.get (); self && !self->_IsClosing ())
549549 {
550+ self->_searchScrollOffset = self->_calculateSearchScrollOffset ();
550551 self->_searchBox ->SetFocusOnTextbox ();
551552 self->_refreshSearch ();
552553 }
@@ -568,7 +569,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
568569 }
569570 else
570571 {
571- _handleSearchResults (_core.Search (_searchBox->Text (), goForward, _searchBox->CaseSensitive (), _searchBox->RegularExpression (), false ));
572+ const auto request = SearchRequest{ _searchBox->Text (), goForward, _searchBox->CaseSensitive (), _searchBox->RegularExpression (), false , _searchScrollOffset };
573+ _handleSearchResults (_core.Search (request));
572574 }
573575 }
574576
@@ -602,7 +604,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
602604 {
603605 if (_searchBox && _searchBox->IsOpen ())
604606 {
605- _handleSearchResults (_core.Search (text, goForward, caseSensitive, regularExpression, false ));
607+ const auto request = SearchRequest{ text, goForward, caseSensitive, regularExpression, false , _searchScrollOffset };
608+ _handleSearchResults (_core.Search (request));
606609 }
607610 }
608611
@@ -623,7 +626,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
623626 {
624627 // We only want to update the search results based on the new text. Set
625628 // `resetOnly` to true so we don't accidentally update the current match index.
626- const auto result = _core.Search (text, goForward, caseSensitive, regularExpression, true );
629+ const auto request = SearchRequest{ text, goForward, caseSensitive, regularExpression, true , _searchScrollOffset };
630+ const auto result = _core.Search (request);
627631 _handleSearchResults (result);
628632 }
629633 }
@@ -3629,6 +3633,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
36293633 };
36303634 scaleMarker (SelectionStartMarker ());
36313635 scaleMarker (SelectionEndMarker ());
3636+
3637+ _searchScrollOffset = _calculateSearchScrollOffset ();
36323638 }
36333639
36343640 void TermControl::_coreRaisedNotice (const IInspectable& /* sender*/ ,
@@ -3750,7 +3756,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
37503756 const auto goForward = _searchBox->GoForward ();
37513757 const auto caseSensitive = _searchBox->CaseSensitive ();
37523758 const auto regularExpression = _searchBox->RegularExpression ();
3753- _handleSearchResults (_core.Search (text, goForward, caseSensitive, regularExpression, true ));
3759+ const auto request = SearchRequest{ text, goForward, caseSensitive, regularExpression, true , _calculateSearchScrollOffset () };
3760+ _handleSearchResults (_core.Search (request));
37543761 }
37553762
37563763 void TermControl::_handleSearchResults (SearchResults results)
@@ -3919,6 +3926,19 @@ namespace winrt::Microsoft::Terminal::Control::implementation
39193926 _showContextMenuAt (_toControlOrigin (cursorPos));
39203927 }
39213928
3929+ til::CoordType TermControl::_calculateSearchScrollOffset () const
3930+ {
3931+ auto result = 0 ;
3932+ if (_searchBox)
3933+ {
3934+ const auto displayInfo = DisplayInformation::GetForCurrentView ();
3935+ const auto scaleFactor = _core.FontSize ().Height / displayInfo.RawPixelsPerViewPixel ();
3936+ const auto searchBoxRows = _searchBox->ActualHeight () / scaleFactor;
3937+ result = static_cast <int32_t >(std::ceil (searchBoxRows));
3938+ }
3939+ return result;
3940+ }
3941+
39223942 void TermControl::_PasteCommandHandler (const IInspectable& /* sender*/ ,
39233943 const IInspectable& /* args*/ )
39243944 {
0 commit comments