diff --git a/src/terminal/adapter/ut_adapter/MouseInputTest.cpp b/src/terminal/adapter/ut_adapter/MouseInputTest.cpp index c8823e9097e..e740467cc5a 100644 --- a/src/terminal/adapter/ut_adapter/MouseInputTest.cpp +++ b/src/terminal/adapter/ut_adapter/MouseInputTest.cpp @@ -593,4 +593,44 @@ class MouseInputTest NoThrowString().Format(L"(x,y)=(%d,%d)", Coord.X, Coord.Y)); } } + + TEST_METHOD(AlternateScrollModeTests) + { + Log::Comment(L"Starting test..."); + std::unique_ptr mouseInput = std::make_unique(s_MouseInputTestCallback); + const short noModifierKeys = 0; + + Log::Comment(L"Enable alternate scroll mode in the alt screen buffer"); + mouseInput->UseAlternateScreenBuffer(); + mouseInput->EnableAlternateScroll(true); + + Log::Comment(L"Test mouse wheel scrolling up"); + s_pwszInputExpected = L"\x1B[A"; + VERIFY_IS_TRUE(mouseInput->HandleMouse({ 0, 0 }, WM_MOUSEWHEEL, noModifierKeys, 1)); + + Log::Comment(L"Test mouse wheel scrolling down"); + s_pwszInputExpected = L"\x1B[B"; + VERIFY_IS_TRUE(mouseInput->HandleMouse({ 0, 0 }, WM_MOUSEWHEEL, noModifierKeys, -1)); + + Log::Comment(L"Enable cursor keys mode"); + mouseInput->ChangeCursorKeysMode(true); + + Log::Comment(L"Test mouse wheel scrolling up"); + s_pwszInputExpected = L"\x1BOA"; + VERIFY_IS_TRUE(mouseInput->HandleMouse({ 0, 0 }, WM_MOUSEWHEEL, noModifierKeys, 1)); + + Log::Comment(L"Test mouse wheel scrolling down"); + s_pwszInputExpected = L"\x1BOB"; + VERIFY_IS_TRUE(mouseInput->HandleMouse({ 0, 0 }, WM_MOUSEWHEEL, noModifierKeys, -1)); + + Log::Comment(L"Confirm no effect when scroll mode is disabled"); + mouseInput->UseAlternateScreenBuffer(); + mouseInput->EnableAlternateScroll(false); + VERIFY_IS_FALSE(mouseInput->HandleMouse({ 0, 0 }, WM_MOUSEWHEEL, noModifierKeys, 1)); + + Log::Comment(L"Confirm no effect when using the main buffer"); + mouseInput->UseMainScreenBuffer(); + mouseInput->EnableAlternateScroll(true); + VERIFY_IS_FALSE(mouseInput->HandleMouse({ 0, 0 }, WM_MOUSEWHEEL, noModifierKeys, 1)); + } }; diff --git a/src/terminal/input/mouseInput.cpp b/src/terminal/input/mouseInput.cpp index 769b6405ff4..c215c810146 100644 --- a/src/terminal/input/mouseInput.cpp +++ b/src/terminal/input/mouseInput.cpp @@ -19,6 +19,8 @@ static constexpr short KeyPressed{ gsl::narrow_cast(0x8000) }; // Alternate scroll sequences static constexpr std::wstring_view CursorUpSequence{ L"\x1b[A" }; static constexpr std::wstring_view CursorDownSequence{ L"\x1b[B" }; +static constexpr std::wstring_view ApplicationUpSequence{ L"\x1bOA" }; +static constexpr std::wstring_view ApplicationDownSequence{ L"\x1bOB" }; // Routine Description: // - Determines if the input windows message code describes a button event @@ -523,11 +525,11 @@ bool TerminalInput::_SendAlternateScroll(const short delta) const noexcept { if (delta > 0) { - _SendInputSequence(CursorUpSequence); + _SendInputSequence(_cursorApplicationMode ? ApplicationUpSequence : CursorUpSequence); } else { - _SendInputSequence(CursorDownSequence); + _SendInputSequence(_cursorApplicationMode ? ApplicationDownSequence : CursorDownSequence); } return true; }