fix: remove ghost pane dividers and prepare winTerm 1.1.2#17
Merged
Conversation
The visible pane divider used a primary-axis Center alignment with a leading-edge margin, so XAML re-centered it in the space remaining after the margin and painted a ghost line away from the real split boundary while the drag hit target stayed correct. The visible divider now shares the leading-edge coordinate system of its pointer target: vertical dividers align Left, horizontal dividers align Top, offset by the split position minus half the visible thickness. Adds divider-placement regression coverage to test-pane-resizing.ps1, bumps version metadata to 1.1.2 (package 1.1.2.0, tag v1.1.2), and adds the 1.1.2 changelog entry and release notes.
HelloThisWorld
marked this pull request as ready for review
July 24, 2026 12:31
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes the ghost pane-divider lines visible in winTerm v1.1.1 and prepares the
v1.1.2 stable patch release.
Symptom: a visible divider line could render away from the actual pane
boundary — for example a full-height vertical line inside the larger
right-hand pane while the real vertical split sat farther left. Horizontal
divider overlays could likewise appear outside the split node that owns them.
Root cause: in
Pane::_UpdateDividerPlacement()the drag hit target andpointer target use a leading-edge coordinate system
(
HorizontalAlignment::Left/VerticalAlignment::Topplus a margin ofdividerPosition - thickness / 2), but the visible_dividerVisualused aprimary-axis
Centeralignment with the same leading-edge margin. XAMLre-centers a
Center-aligned element inside the space remaining after itsmargin, so the visible line landed near
(container + dividerPosition) / 2instead ofdividerPosition— a ghostline — while dragging still worked at the real boundary.
Fix (2 lines plus comments): the visible divider now uses the same
leading-edge alignment model as the pointer target — vertical dividers align
Left, horizontal dividers alignTop— and stays centered on the splitposition by subtracting half its own thickness in the margin. One divider now
renders exactly on each logical split boundary for all layouts, ratios, and
nesting depths; nested dividers stay confined to their owning split node.
Related issues
None filed; defect observed in the v1.1.1 release build.
Detailed changes
src/cascadia/TerminalApp/Pane.cpp—_UpdateDividerPlacement(): verticalvisible divider
HorizontalAlignment::Center→Left; horizontal visibledivider
VerticalAlignment::Center→Top; explanatory comments. No otherruntime change.
scripts/winterm/test-pane-resizing.ps1— new divider-placement regressionboundary that isolates
Pane::_UpdateDividerPlacement()without fixed linenumbers and asserts: (1) vertical and (2) horizontal visible dividers share
the hit target's leading-edge alignment; (3) the visible line is centered on
dividerPositionby half its thickness; (4) the primary-axisCenterpattern cannot silently return on any divider element; (5) the pointer
target stays wider than the visible line; (6)
_CreateDividerVisual()isreattached in the split-parent constructor,
SwapPanes,_CloseChild,_Split, andRestorerebuild paths. The assertions were validated to failagainst the v1.1.1 sources and pass against this branch.
v1.1.2, channelstable):src/winterm/Branding/version.json,ReleaseMetadata.h,Package-winTerm.appxmanifest,WindowsTerminal.rc,shell/shared/version.json,winTerm.Shell.psd1/.psm1,package-shell-assets.ps1,test.ps1,verify-branding.ps1,verify-version.ps1,WorkspaceDescriptor.h,WorkspaceSerializer.cpp.docs/releases/1.1.2.md(symptom, alignmentfix, preserved behavior, unchanged schemas, 1.1.2 asset names, publisher,
tag, and the unsigned-installer disclosure required unless a trusted
Authenticode certificate is configured at publication); dated 1.1.2
CHANGELOG.mdentry;README.mdcurrent source version, release-notelink, and build examples now 1.1.2 (stable
/releases/latestURL anddynamic badge unchanged);
docs/current-progress.mdrefreshed. The 1.1.1changelog entry,
docs/releases/1.1.1.md, and historical references arepreserved;
StyleCop.Analyzers 1.1.118is an unrelated NuGet version andwas not touched.
v*trigger is unchanged; theexpected tag continues to derive from
version.json.Preserved behavior: 1-logical-pixel idle divider, centered 12-logical-pixel
pointer target, east-west/north-south cursors, continuous live resize,
minimum-size clamping, 25/33.333/50/66.667/75% snapping, Alt bypass, Escape
and pointer-cancellation rollback, one history record per committed drag,
Undo/Redo/Balance Panes, High Contrast brushes, compact pane headers.
PaneBorderSize,DividerVisibleThickness, andDividerPointerHitThicknessare unchanged. ConPTY, the VT parser, text buffer, renderer core, Unicode
width handling, input protocols, and OpenConsole internals are untouched.
Workspace schema 2, docking model 1, shell protocol 1, theme schema 1,
package identity,
winterm.exealias, privacy boundaries, and MicrosoftTerminal coexistence are unchanged.
Validation performed
Local (Windows 11 x64, Windows PowerShell; no native MSBuild/VS toolchain on
this host):
powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File .\scripts\winterm\test-pane-resizing.ps1 -Configuration Release -Platform x64 -SourceOnly— PASS(compiled pane-resize tests reported SKIP as handled by the parent suite).
powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File .\scripts\winterm\test.ps1 -Suite Smoke -Configuration Release -Platform x64— PASS(includes
verify-version.ps1with all 1.1.2 assertions, branding,shell-asset, workspace, and privacy source boundaries; compiled unit tests
reported SKIP as not part of the Smoke suite).
unmodified v1.1.1
Pane.cppand correctly failed withvisible 'Center'; they pass on this branch.git diff --check— clean.Not available locally (no Visual Studio/MSBuild/Windows SDK toolchain on this
host): native Debug/Release compilation, compiled Relevant suite, packaging,
installer/Portable lifecycle, and the manual divider acceptance matrix
(split ratios, nesting, DPI scales, High Contrast states). These are
delegated to the pull-request GitHub Actions runs of
winterm-validation.ymlandwinterm-full-build.yml; no manual acceptancecase is claimed here.
Release boundary
This PR only updates the intended tag metadata to
v1.1.2. The actualv1.1.2Git tag and Release must be created only after this PR issquash-merged, on the exact resulting
maincommit, so.github/workflows/release.ymlcan validate the tag againstversion.json. No tag is created from this branch, and no existing tag orRelease is moved or replaced.
Checklist
winterm.exe, and Microsoft Terminal coexistence remain isolated.