terminal icon indicating copy to clipboard operation
terminal copied to clipboard

feat: VT margins are meant to be tracked separetly for each page

Open raunak0400 opened this issue 3 weeks ago • 6 comments

Fix: Per-Page Scroll Margins (DECSTBM/DECSLRM)

Issue #19625

Scroll margins were tracked globally instead of per-page, causing margins set on one page to incorrectly affect other pages.

Bug Scenario:

printf "\e#8\e[2 P\e[9;15r\e[1 P\e[999B\n\n\n\n\n\n\n"
  • Fill screen with DECALN
  • Switch to page 2 → Set margins 9-15
  • Switch to page 1 → Scroll with linefeeds
  • Problem: Page 2's margins affected page 1's scrolling

Root Cause

_scrollMargins was a single member variable in AdaptDispatch, shared across all pages. VT spec requires margins to be tracked per-page.

Solution

1. Added Per-Page Storage (PageManager.hpp/cpp)

  • Added std::array<til::inclusive_rect, MAX_PAGES> _scrollMargins{}
  • Added GetScrollMargins(pageNumber) and SetScrollMargins(pageNumber, margins)
  • Reset margins when PageManager resets

2. Updated Margin Management (adaptDispatch.hpp/cpp)

  • Removed global _scrollMargins variable
  • Updated _GetVerticalMargins() and _GetHorizontalMargins() to use page-specific margins
  • Updated _DoSetTopBottomScrollingMargins() and _DoSetLeftRightScrollingMargins() to store margins per-page

3. Updated Tests (adapterTest.cpp)

  • Modified ScrollMarginsTest to access margins via PageManager
  • Added PerPageScrollMarginsTest to verify page isolation

Files Modified

  • src/terminal/adapter/PageManager.hpp
  • src/terminal/adapter/PageManager.cpp
  • src/terminal/adapter/adaptDispatch.hpp
  • src/terminal/adapter/adaptDispatch.cpp
  • src/terminal/adapter/ut_adapter/adapterTest.cpp

Result

Each page now maintains independent scroll margins
Margins set on page 2 no longer affect page 1
Margins persist correctly when switching between pages
Complies with VT programmer's reference specification

raunak0400 avatar Dec 06 '25 18:12 raunak0400

@microsoft-github-policy-service agree

raunak0400 avatar Dec 06 '25 19:12 raunak0400

what should i supposed to do now

raunak0400 avatar Dec 06 '25 19:12 raunak0400

Was this code written by an LLM by any chance?

j4james avatar Dec 07 '25 09:12 j4james

@j4james No, its completely written by me . can you tell me if there's any change ? Or can you merge it please

raunak0400 avatar Dec 07 '25 10:12 raunak0400

It can't be merged until it has been reviewed and approved by someone at Microsoft, and that's not something I can do. But my suggestion to you would be to get the code to compile first, because I suspect you'll find there's a lot more work you need to do.

j4james avatar Dec 07 '25 10:12 j4james

what should i supposed to do now

Can you send a screenshot of your development environment showing all the tests passing?

Thanks!

DHowett avatar Dec 10 '25 20:12 DHowett