From 4a0e045905ee15b78edc3141ca2f15e73675a9d2 Mon Sep 17 00:00:00 2001 From: HelloThisWorld Date: Fri, 24 Jul 2026 20:16:07 +0800 Subject: [PATCH] fix: align pane divider visuals for v1.1.2 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. --- CHANGELOG.md | 24 +++ README.md | 8 +- docs/current-progress.md | 43 +++--- docs/releases/1.1.2.md | 55 +++++++ scripts/winterm/package-shell-assets.ps1 | 4 +- scripts/winterm/test-pane-resizing.ps1 | 145 +++++++++++++++++- scripts/winterm/test.ps1 | 2 +- scripts/winterm/verify-branding.ps1 | 2 +- scripts/winterm/verify-version.ps1 | 18 +-- .../winTerm.Shell/winTerm.Shell.psd1 | 2 +- .../winTerm.Shell/winTerm.Shell.psm1 | 2 +- shell/shared/version.json | 4 +- .../Package-winTerm.appxmanifest | 2 +- src/cascadia/TerminalApp/Pane.cpp | 11 +- .../WindowsTerminal/WindowsTerminal.rc | 8 +- src/winterm/Branding/ReleaseMetadata.h | 2 +- src/winterm/Branding/version.json | 8 +- .../Workspaces/Model/WorkspaceDescriptor.h | 2 +- .../Persistence/WorkspaceSerializer.cpp | 2 +- 19 files changed, 289 insertions(+), 55 deletions(-) create mode 100644 docs/releases/1.1.2.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f3c8d959..4b3538dee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,29 @@ # Changelog +## 1.1.2 - 2026-07-24 + +### Fixed + +- Pane divider visuals no longer draw ghost lines away from the actual split + boundary. The visible divider previously used a primary-axis Center + alignment with a leading-edge margin, which re-centered the line in the + space remaining after the margin; it now shares the leading-edge coordinate + system of its pointer target, so exactly one line renders at each logical + split position and nested dividers stay inside their owning split node. +- Added source-level regression coverage that locks the visible divider, the + pointer target, and the logical split position to one shared leading-edge + alignment model and keeps divider visuals reattached across split, close, + swap, restore, and workspace rebuild paths. + +### Distribution + +- Publishes the corrected pane-divider rendering as the verified x64 Setup EXE + and Portable ZIP. +- Workspace schema 2, docking model 1, shell protocol 1, and theme schema 1 + are unchanged. +- The Setup EXE is not code-signed unless a trusted Authenticode certificate + is configured at publication; verify it with `SHA256SUMS.txt`. + ## 1.1.1 - 2026-07-24 ### Fixed diff --git a/README.md b/README.md index 84b64c629..65ce75f03 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ application downloads are: - `winTerm--setup-x64.exe` — current-user or all-users installation; - `winTerm--portable-x64.zip` — extract and run without installation. -The current source version is `1.1.1`. See the +The current source version is `1.1.2`. See the [latest official Release](https://github.com/HelloThisWorld/winTerm/releases/latest) for the complete published asset list and checksums. @@ -39,7 +39,7 @@ Release. No MSIX certificate, Developer Mode, Visual Studio, Windows SDK, or `Add-AppxPackage` is required to install a release EXE. See [installation guidance](docs/user/installation.md) and the -[1.1.1 release notes](docs/releases/1.1.1.md). +[1.1.2 release notes](docs/releases/1.1.2.md). ## Core features @@ -84,8 +84,8 @@ Use PowerShell 7 and the Microsoft Terminal toolchain described in .\scripts\winterm\build.ps1 -Configuration Release -Platform x64 -IncludeTests .\scripts\winterm\test.ps1 -Suite Relevant -Configuration Release -Platform x64 .\scripts\winterm\build-unpackaged.ps1 -Configuration Release -Platform x64 -.\scripts\winterm\build-installer.ps1 -Version 1.1.1 -Platform x64 -.\scripts\winterm\build-portable.ps1 -Version 1.1.1 -Platform x64 +.\scripts\winterm\build-installer.ps1 -Version 1.1.2 -Platform x64 +.\scripts\winterm\build-portable.ps1 -Version 1.1.2 -Platform x64 ``` The unpackaged generator uses an unsigned MSIX only as an upstream build diff --git a/docs/current-progress.md b/docs/current-progress.md index 2f7885d3b..0b25c4421 100644 --- a/docs/current-progress.md +++ b/docs/current-progress.md @@ -4,31 +4,36 @@ Last updated: 2026-07-24 ## Repository state -- Branch: `codex/release-v1.1.1` -- Starting commit: `a503b8dfaee05c533ba5981d83d22e92e31b3e20` +- Branch: `codex/fix-v1.1.2-ghost-divider-lines` +- Starting commit: `031f403a1bf7bd36a1df0e9ab1024e2aa78df262` - Microsoft Terminal upstream revision: `1cea42d433253d95c4487a3037db48197b5e72f4` -- Application and module version: `1.1.1` -- Package version: `1.1.1.0` -- Intended tag: `v1.1.1` +- Application and module version: `1.1.2` +- Package version: `1.1.2.0` +- Intended tag: `v1.1.2` - Supported release target: Windows 11 x64 ## Implemented in the working tree -- Removed winTerm pane repositioning sources, overlay/target/session models, - settings, menus, command-line entry point, keyboard mode, and tests. -- Added branch-local border resize transactions, minimum-size filtering, - common-ratio snapping, 8/14-pixel hysteresis, Alt bypass, rollback, - one-entry history, undo/redo, and Balance Panes. -- Added native Settings controls, centralized design tokens, and website-aligned - titlebar, tab, pane-header, divider, and terminal-shell resources. -- Updated version metadata, source validation, migration guidance, user - documentation, acceptance matrix, release notes, and website handoff. +- Fixed the 1.1.1 ghost pane-divider rendering: the visible divider now uses + the same owner-local, leading-edge alignment model as its pointer target + (vertical dividers align Left, horizontal dividers align Top, offset by the + split position minus half the visible thickness). +- Extended the pane-resize source validation with divider-placement + invariants: shared leading-edge alignment across the visible line and + pointer targets, half-thickness centering on the split position, a guard + against reintroducing the primary-axis Center alignment, a wider pointer + target than the visible line, and divider reattachment across the split, + swap, close, restore, and workspace rebuild paths. +- Updated application, package, shell module, About, workspace-fallback, and + release metadata to `1.1.2` with intended tag `v1.1.2`. +- Added the 1.1.2 changelog entry and release notes; the README points to the + 1.1.2 release notes while downloads keep the stable `/releases/latest` URL. ## Evidence -The directed-split/pane-control and pane-resize source validations pass in -Windows PowerShell. Compiled native tests, Release application launch, visual -inspection, manual DPI/accessibility/rendering/shell scenarios, and 1.1 -installer/Portable creation remain release gates until their results are -recorded. +The pane-resize and Smoke source validations pass in Windows PowerShell on +this branch. Compiled native tests, Release application launch, the manual +divider acceptance matrix (split ratios, nesting, DPI scales, High Contrast), +and 1.1.2 installer/Portable creation run through the pull-request GitHub +Actions workflows and remain release gates until their results are recorded. diff --git a/docs/releases/1.1.2.md b/docs/releases/1.1.2.md new file mode 100644 index 000000000..9f8f195d0 --- /dev/null +++ b/docs/releases/1.1.2.md @@ -0,0 +1,55 @@ +# winTerm 1.1.2 + +winTerm 1.1.2 fixes the ghost pane-divider lines visible in 1.1.1 while +preserving the complete border-drag pane-resize feature set. + +## Fixed + +- In 1.1.1 the visible pane divider could render away from the actual split + boundary — for example a full-height vertical line inside the larger pane + while the real vertical split sat farther left. The visible line used a + primary-axis Center alignment combined with a leading-edge margin, so XAML + re-centered it in the space remaining after the margin while the drag hit + target stayed on the real boundary. +- The visible divider, the pointer target, and the logical split position now + share one owner-local, leading-edge coordinate system: vertical dividers + align Left and horizontal dividers align Top, offset by the split position + minus half the line's own thickness. +- Exactly one divider line renders at each logical split boundary, and a + nested divider stays visually confined to its owning split node instead of + crossing unrelated sibling panes. + +## Preserved behavior + +- One logical-pixel idle divider with a centered 12-logical-pixel pointer + target and east-west / north-south resize cursors. +- Continuous live resize with minimum-size clamping and snapping at 25%, + 33.333%, 50%, 66.667%, and 75%; holding Alt bypasses snapping. +- Escape and pointer-cancellation rollback, one history record per committed + drag, Undo, Redo, and Balance Panes. +- High Contrast divider brushes, hover and active-resize feedback, and compact + pane headers. + +## Compatibility + +Workspace schema remains version 2, the docking model remains version 1, the +shell protocol remains version 1, and the theme schema remains version 1. +Existing settings and workspaces load unchanged, and no pane session restarts +during a resize. Package identity, the `winterm.exe` alias, privacy +boundaries, and Microsoft Terminal coexistence are unchanged. + +## Distribution + +Primary x64 assets: + +- `winTerm-1.1.2-setup-x64.exe` +- `winTerm-1.1.2-portable-x64.zip` + +Publisher: `helloThisWorld`. Tag: `v1.1.2`. + +## Signing + +Unless a trusted Authenticode certificate is configured in the release +workflow at publication time, the v1.1.2 Setup EXE is not code-signed. Windows +may display a SmartScreen warning; verify the downloaded file against +`SHA256SUMS.txt` before running it. diff --git a/scripts/winterm/package-shell-assets.ps1 b/scripts/winterm/package-shell-assets.ps1 index a784fbcce..af31eac69 100644 --- a/scripts/winterm/package-shell-assets.ps1 +++ b/scripts/winterm/package-shell-assets.ps1 @@ -32,9 +32,9 @@ foreach ($relativePath in $sourceAssets) } $version = Get-Content -LiteralPath (Join-Path $repositoryRoot 'shell\shared\version.json') -Raw | ConvertFrom-Json -if ($version.moduleVersion -ne '1.1.1' -or +if ($version.moduleVersion -ne '1.1.2' -or $version.modulePrerelease -ne '' -or - $version.applicationVersion -ne '1.1.1' -or + $version.applicationVersion -ne '1.1.2' -or $version.protocolVersion -ne 1) { throw 'The winTerm Shell asset version metadata is invalid.' diff --git a/scripts/winterm/test-pane-resizing.ps1 b/scripts/winterm/test-pane-resizing.ps1 index 803c09a2d..6053ec0f2 100644 --- a/scripts/winterm/test-pane-resizing.ps1 +++ b/scripts/winterm/test-pane-resizing.ps1 @@ -97,6 +97,149 @@ try throw 'Divider visuals are not reattached across all branch rebuild paths.' } + # Divider visuals are reattached through every branch rebuild path: + # split creation/workspace restore (the split-parent constructor), swap, + # close/collapse, and zoom restore. Attribute each call site to its + # enclosing column-0 definition instead of relying on line numbers. + $dividerRebuildOwners = [System.Collections.Generic.HashSet[string]]::new() + $currentFunction = '' + foreach ($line in ($runtime -split "`r?`n")) + { + if ($line -match '^(?=\S).*\bPane::([A-Za-z_~]+)\s*\(') + { + $currentFunction = $Matches[1] + } + if ($line -match '_CreateDividerVisual\(\);') + { + [void]$dividerRebuildOwners.Add($currentFunction) + } + } + foreach ($required in @('Pane', 'SwapPanes', '_CloseChild', '_Split', 'Restore')) + { + if (-not $dividerRebuildOwners.Contains($required)) + { + throw "Divider visuals are not reattached in the '$required' rebuild path." + } + } + + # v1.1.2 ghost-divider regression: the visible divider, the pointer/hit + # targets, and the logical split position must share one leading-edge + # coordinate system inside Pane::_UpdateDividerPlacement. A primary-axis + # Center alignment re-centers the visual in the space left after its + # margin and paints a ghost line away from the real split boundary. + $placementMarker = 'void Pane::_UpdateDividerPlacement' + $placementStart = $runtime.IndexOf($placementMarker) + if ($placementStart -lt 0) + { + throw 'Divider placement routine could not be located.' + } + $nextDefinition = [regex]::Match( + $runtime.Substring($placementStart + $placementMarker.Length), + '(?m)^(?=\S).*\bPane::[A-Za-z_~]+\s*\(') + $placement = if ($nextDefinition.Success) + { + $runtime.Substring($placementStart, $placementMarker.Length + $nextDefinition.Index) + } + else + { + $runtime.Substring($placementStart) + } + + $verticalStart = $placement.IndexOf('SplitState::Vertical') + if ($verticalStart -lt 0) + { + throw 'Divider placement vertical branch could not be located.' + } + $elseMatch = [regex]::Match($placement.Substring($verticalStart), '(?m)^\s*else\b') + if (-not $elseMatch.Success) + { + throw 'Divider placement horizontal branch could not be located.' + } + $verticalBranch = $placement.Substring($verticalStart, $elseMatch.Index) + $horizontalBranch = $placement.Substring($verticalStart + $elseMatch.Index) + + $alignmentOf = { + param([string]$branch, [string]$element, [string]$axis) + $match = [regex]::Match( + $branch, + [string]::Format('{0}\s*\.\s*{1}Alignment\s*\(\s*{1}Alignment::(\w+)', $element, $axis)) + if (-not $match.Success) + { + throw "Divider placement does not set the $axis alignment of $element." + } + $match.Groups[1].Value + } + + # Vertical split: every divider element shares the leading-edge (Left) + # primary-axis alignment model of the hit target. + $verticalHit = & $alignmentOf $verticalBranch '_dividerHitTarget' 'Horizontal' + $verticalPointer = & $alignmentOf $verticalBranch '_dividerPointerTarget' 'Horizontal' + $verticalVisual = & $alignmentOf $verticalBranch '_dividerVisual' 'Horizontal' + if ($verticalHit -ne 'Left') + { + throw "Vertical divider hit target must use leading-edge Left alignment, found '$verticalHit'." + } + if ($verticalPointer -ne $verticalHit -or $verticalVisual -ne $verticalHit) + { + throw "Vertical divider visuals must share the hit target's leading-edge alignment (hit '$verticalHit', pointer '$verticalPointer', visible '$verticalVisual')." + } + + # Horizontal split: same invariant on the vertical (Top) primary axis. + $horizontalHit = & $alignmentOf $horizontalBranch '_dividerHitTarget' 'Vertical' + $horizontalPointer = & $alignmentOf $horizontalBranch '_dividerPointerTarget' 'Vertical' + $horizontalVisual = & $alignmentOf $horizontalBranch '_dividerVisual' 'Vertical' + if ($horizontalHit -ne 'Top') + { + throw "Horizontal divider hit target must use leading-edge Top alignment, found '$horizontalHit'." + } + if ($horizontalPointer -ne $horizontalHit -or $horizontalVisual -ne $horizontalHit) + { + throw "Horizontal divider visuals must share the hit target's leading-edge alignment (hit '$horizontalHit', pointer '$horizontalPointer', visible '$horizontalVisual')." + } + + # The visible line stays centered on the split position by subtracting + # half of its own thickness inside the leading-edge margin. + if (-not [regex]::IsMatch( + $verticalBranch, + '_dividerVisual\s*\.\s*Margin\s*\(\s*ThicknessHelper::FromLengths\s*\(\s*dividerPosition\s*-\s*\(\s*visibleThickness\s*/\s*2\.0\s*\)')) + { + throw 'Vertical visible divider margin is not centered on dividerPosition by half its thickness.' + } + if (-not [regex]::IsMatch( + $horizontalBranch, + '_dividerVisual\s*\.\s*Margin\s*\(\s*ThicknessHelper::FromLengths\s*\(\s*0\s*,\s*dividerPosition\s*-\s*\(\s*visibleThickness\s*/\s*2\.0\s*\)')) + { + throw 'Horizontal visible divider margin is not centered on dividerPosition by half its thickness.' + } + + # The primary-axis Center alignment that produced the v1.1.1 ghost line + # must not silently return on any divider element. + foreach ($element in @('_dividerVisual', '_dividerPointerTarget', '_dividerHitTarget')) + { + foreach ($axis in @('Horizontal', 'Vertical')) + { + if ([regex]::IsMatch( + $placement, + [string]::Format('{0}\s*\.\s*{1}Alignment\s*\(\s*{1}Alignment::Center', $element, $axis))) + { + throw "Divider placement re-introduced the $axis Center alignment on $element." + } + } + } + + # The pointer target must stay wider than the visible line so the drag + # acquisition area keeps surrounding the rendered divider. + $visibleTokenMatch = [regex]::Match($tokens, 'DividerVisibleThickness\s*\{\s*([0-9.]+)') + $hitTokenMatch = [regex]::Match($tokens, 'DividerPointerHitThickness\s*\{\s*([0-9.]+)') + if (-not $visibleTokenMatch.Success -or -not $hitTokenMatch.Success) + { + throw 'Divider thickness tokens could not be parsed.' + } + if ([double]$hitTokenMatch.Groups[1].Value -le [double]$visibleTokenMatch.Groups[1].Value) + { + throw 'Divider pointer target must remain wider than the visible line.' + } + $moveStart = $runtime.IndexOf('void Pane::_DividerPointerMoved') $moveEnd = $runtime.IndexOf('void Pane::_DividerPointerReleased', $moveStart) if ($moveStart -lt 0 -or $moveEnd -le $moveStart) @@ -150,7 +293,7 @@ try Write-Host 'SKIP: compiled pane resize tests are unavailable.' -ForegroundColor Yellow } - Write-Host 'PASS: pane resize snapping, cancellation, DPI, and history source boundaries.' -ForegroundColor Green + Write-Host 'PASS: pane resize snapping, cancellation, DPI, history, and divider placement source boundaries.' -ForegroundColor Green } catch { diff --git a/scripts/winterm/test.ps1 b/scripts/winterm/test.ps1 index 954d41b7c..0fa6a691e 100644 --- a/scripts/winterm/test.ps1 +++ b/scripts/winterm/test.ps1 @@ -101,7 +101,7 @@ function Test-ShellExperienceFoundations } $manifest = Import-PowerShellDataFile -LiteralPath $moduleManifest - if ($manifest.ModuleVersion -ne '1.1.1' -or + if ($manifest.ModuleVersion -ne '1.1.2' -or $manifest.PrivateData.PSData.Prerelease -ne '' -or $manifest.PowerShellVersion -ne '5.1') { diff --git a/scripts/winterm/verify-branding.ps1 b/scripts/winterm/verify-branding.ps1 index e2a468de0..74e0407a9 100644 --- a/scripts/winterm/verify-branding.ps1 +++ b/scripts/winterm/verify-branding.ps1 @@ -126,7 +126,7 @@ function Test-Manifest Test-Requirement -Condition ($null -ne $identity -and $identity.Name -eq 'HelloThisWorld.winTerm') -Message "$Path uses package identity HelloThisWorld.winTerm" Test-Requirement -Condition ($null -ne $identity -and $identity.Name -notmatch '^Microsoft\.') -Message "$Path does not use a Microsoft package name" Test-Requirement -Condition ($null -ne $identity -and $identity.Publisher -ceq $ExpectedPublisher) -Message "$Path uses the expected non-Microsoft publisher" - Test-Requirement -Condition ($null -ne $identity -and $identity.Version -eq '1.1.1.0') -Message "$Path uses package version 1.1.1.0" + Test-Requirement -Condition ($null -ne $identity -and $identity.Version -eq '1.1.2.0') -Message "$Path uses package version 1.1.2.0" Test-Requirement -Condition ($null -ne $properties -and $properties.DisplayName -eq 'winTerm') -Message "$Path package display name is winTerm" Test-Requirement -Condition ($null -ne $application -and $application.Id -eq 'winTerm') -Message "$Path application ID is winTerm" Test-Requirement -Condition ($null -ne $visualElements -and $visualElements.DisplayName -eq 'winTerm') -Message "$Path application display name is winTerm" diff --git a/scripts/winterm/verify-version.ps1 b/scripts/winterm/verify-version.ps1 index 44e85de79..41074ed2d 100644 --- a/scripts/winterm/verify-version.ps1 +++ b/scripts/winterm/verify-version.ps1 @@ -49,12 +49,12 @@ try $versionPath = Join-Path $repositoryRoot 'src\winterm\Branding\version.json' $version = Get-Content -LiteralPath $versionPath -Raw | ConvertFrom-Json - Assert-Condition ($version.applicationVersion -eq '1.1.1') 'Application version is 1.1.1' - Assert-Condition ($version.packageVersion -eq '1.1.1.0') 'Package version is 1.1.1.0' - Assert-Condition ($version.moduleVersion -eq '1.1.1') 'PowerShell module version is 1.1.1' + Assert-Condition ($version.applicationVersion -eq '1.1.2') 'Application version is 1.1.2' + Assert-Condition ($version.packageVersion -eq '1.1.2.0') 'Package version is 1.1.2.0' + Assert-Condition ($version.moduleVersion -eq '1.1.2') 'PowerShell module version is 1.1.2' Assert-Condition ($version.modulePrerelease -eq '') 'PowerShell module has no prerelease suffix' Assert-Condition ($version.channel -eq 'stable') 'Release channel is stable' - Assert-Condition ($version.tag -eq 'v1.1.1') 'Stable tag is v1.1.1' + Assert-Condition ($version.tag -eq 'v1.1.2') 'Stable tag is v1.1.2' Assert-Condition ($version.workspaceSchemaVersion -eq 2) 'Workspace Schema version remains 2' Assert-Condition ($version.dockingModelVersion -eq 1) 'Docking Model version remains 1' Assert-Condition ($version.shellProtocolVersion -eq 1) 'Shell Protocol version remains 1' @@ -78,7 +78,7 @@ try $moduleManifest = Import-PowerShellDataFile -LiteralPath (Join-Path $repositoryRoot 'shell\powershell\winTerm.Shell\winTerm.Shell.psd1') Assert-Condition ($moduleManifest.ModuleVersion.ToString() -eq $version.moduleVersion) 'PowerShell manifest version matches release metadata' Assert-Condition ($moduleManifest.PrivateData.PSData.Prerelease -eq $version.modulePrerelease) 'PowerShell manifest prerelease matches release metadata' - Assert-Condition ((Get-Text 'shell\powershell\winTerm.Shell\winTerm.Shell.psm1').Contains("`$script:WinTermModuleVersion = '1.1.1'")) 'PowerShell module runtime version matches release metadata' + Assert-Condition ((Get-Text 'shell\powershell\winTerm.Shell\winTerm.Shell.psm1').Contains("`$script:WinTermModuleVersion = '1.1.2'")) 'PowerShell module runtime version matches release metadata' $shellVersion = Get-Text 'shell\shared\version.json' | ConvertFrom-Json Assert-Condition ($shellVersion.applicationVersion -eq $version.applicationVersion) 'Shell asset application version matches release metadata' @@ -86,7 +86,7 @@ try Assert-Condition ($shellVersion.protocolVersion -eq $version.shellProtocolVersion) 'Shell asset protocol version matches release metadata' $releaseHeader = Get-Text 'src\winterm\Branding\ReleaseMetadata.h' - Assert-Condition ($releaseHeader.Contains('ApplicationVersion{ L"1.1.1" }')) 'About metadata application version is 1.1.1' + Assert-Condition ($releaseHeader.Contains('ApplicationVersion{ L"1.1.2" }')) 'About metadata application version is 1.1.2' Assert-Condition ($releaseHeader.Contains('ReleaseChannel{ L"Stable" }')) 'About metadata channel is Stable' Assert-Condition ($releaseHeader.Contains($version.microsoftTerminalUpstreamRevision)) 'About metadata contains the Microsoft Terminal upstream revision' Assert-Condition ($releaseHeader.Contains('WorkspaceSchemaVersion{ 2 }')) 'About metadata contains Workspace Schema version 2' @@ -105,19 +105,19 @@ try Assert-Condition ((Get-Text 'src\winterm\Workspaces\Model\WorkspaceDescriptor.h').Contains('DockingModelVersion{ 1 }')) 'Workspace model remains at Docking version 1' Assert-Condition ((Get-Text 'src\winterm\Shell\Protocol\ShellIntegrationProtocol.h').Contains('ShellProtocolVersion{ 1 }')) 'Shell protocol remains at version 1' Assert-Condition ((Get-Text 'src\winterm\Appearance\Themes\ThemeDescriptor.h').Contains('CurrentThemeSchemaVersion{ 1 }')) 'Theme Schema remains at version 1' - Assert-Condition ((Get-Text 'src\winterm\Workspaces\Persistence\WorkspaceSerializer.cpp').Contains('"1.1.1"')) 'Workspace application-version fallback is 1.1.1' + Assert-Condition ((Get-Text 'src\winterm\Workspaces\Persistence\WorkspaceSerializer.cpp').Contains('"1.1.2"')) 'Workspace application-version fallback is 1.1.2' $releaseWorkflow = Get-Text '.github\workflows\release.yml' Assert-Condition ($releaseWorkflow.Contains("- 'v*'")) 'Release workflow accepts version tags through a generic guarded trigger' Assert-Condition ($releaseWorkflow.Contains("`$expectedTag = `"v`$(`$metadata.applicationVersion)`"")) 'Release workflow derives the expected tag from version.json' Assert-Condition ($releaseWorkflow.Contains("`$metadata.tag -cne `$expectedTag")) 'Release workflow rejects a version metadata tag mismatch' - Assert-Condition ((Get-Text 'CHANGELOG.md').Contains('## 1.1.1 - 2026-07-24')) 'Changelog contains 1.1.1' + Assert-Condition ((Get-Text 'CHANGELOG.md').Contains('## 1.1.2 - 2026-07-24')) 'Changelog contains 1.1.2' if ($RequireTag) { $tag = (& git describe --tags --exact-match 2>$null).Trim() - Assert-Condition ($LASTEXITCODE -eq 0 -and $tag -eq $version.tag) 'Checked-out commit is exactly tagged v1.1.1' + Assert-Condition ($LASTEXITCODE -eq 0 -and $tag -eq $version.tag) 'Checked-out commit is exactly tagged v1.1.2' } Write-Host 'winTerm version consistency verification passed.' -ForegroundColor Green diff --git a/shell/powershell/winTerm.Shell/winTerm.Shell.psd1 b/shell/powershell/winTerm.Shell/winTerm.Shell.psd1 index f181e225d..e7e4a6eb1 100644 --- a/shell/powershell/winTerm.Shell/winTerm.Shell.psd1 +++ b/shell/powershell/winTerm.Shell/winTerm.Shell.psd1 @@ -1,6 +1,6 @@ @{ RootModule = 'winTerm.Shell.psm1' - ModuleVersion = '1.1.1' + ModuleVersion = '1.1.2' GUID = 'f65cd8f4-5d25-4a2a-a0d4-58df1ab3dc5a' Author = 'winTerm contributors' CompanyName = 'winTerm' diff --git a/shell/powershell/winTerm.Shell/winTerm.Shell.psm1 b/shell/powershell/winTerm.Shell/winTerm.Shell.psm1 index 5b3df46b8..9e513f78a 100644 --- a/shell/powershell/winTerm.Shell/winTerm.Shell.psm1 +++ b/shell/powershell/winTerm.Shell/winTerm.Shell.psm1 @@ -3,7 +3,7 @@ Set-StrictMode -Version Latest -$script:WinTermModuleVersion = '1.1.1' +$script:WinTermModuleVersion = '1.1.2' $script:WinTermProtocolVersion = 1 $script:WinTermIntegrationEnabled = $false $script:WinTermPromptWrapped = $false diff --git a/shell/shared/version.json b/shell/shared/version.json index b6e947a6f..468a87303 100644 --- a/shell/shared/version.json +++ b/shell/shared/version.json @@ -1,6 +1,6 @@ { - "applicationVersion": "1.1.1", - "moduleVersion": "1.1.1", + "applicationVersion": "1.1.2", + "moduleVersion": "1.1.2", "modulePrerelease": "", "protocolVersion": 1 } diff --git a/src/cascadia/CascadiaPackage/Package-winTerm.appxmanifest b/src/cascadia/CascadiaPackage/Package-winTerm.appxmanifest index 3e3c73baf..8678ea112 100644 --- a/src/cascadia/CascadiaPackage/Package-winTerm.appxmanifest +++ b/src/cascadia/CascadiaPackage/Package-winTerm.appxmanifest @@ -18,7 +18,7 @@ + Version="1.1.2.0" /> winTerm diff --git a/src/cascadia/TerminalApp/Pane.cpp b/src/cascadia/TerminalApp/Pane.cpp index c6b350e7f..617c2dc9b 100644 --- a/src/cascadia/TerminalApp/Pane.cpp +++ b/src/cascadia/TerminalApp/Pane.cpp @@ -2441,7 +2441,12 @@ void Pane::_UpdateDividerPlacement() _dividerPointerTarget.VerticalAlignment(VerticalAlignment::Stretch); _dividerVisual.Width(visibleThickness); _dividerVisual.Height(std::numeric_limits::quiet_NaN()); - _dividerVisual.HorizontalAlignment(HorizontalAlignment::Center); + // The visible line must use the same leading-edge coordinate system as + // the hit/pointer targets: a Left alignment whose margin is the split + // position minus half the element's own thickness. A Center alignment + // would re-center the line inside the remaining space after the margin, + // drawing a ghost divider away from the actual split boundary. + _dividerVisual.HorizontalAlignment(HorizontalAlignment::Left); _dividerVisual.VerticalAlignment(VerticalAlignment::Stretch); const auto dividerPosition = _desiredSplitPosition * _root.ActualWidth(); @@ -2492,7 +2497,9 @@ void Pane::_UpdateDividerPlacement() _dividerVisual.Width(std::numeric_limits::quiet_NaN()); _dividerVisual.Height(visibleThickness); _dividerVisual.HorizontalAlignment(HorizontalAlignment::Stretch); - _dividerVisual.VerticalAlignment(VerticalAlignment::Center); + // Same leading-edge coordinate system as the hit/pointer targets; see + // the vertical branch above for why Center would draw a ghost line. + _dividerVisual.VerticalAlignment(VerticalAlignment::Top); const auto dividerPosition = _desiredSplitPosition * _root.ActualHeight(); _dividerHitTarget.Margin(ThicknessHelper::FromLengths( diff --git a/src/cascadia/WindowsTerminal/WindowsTerminal.rc b/src/cascadia/WindowsTerminal/WindowsTerminal.rc index f6fc8985a..a0152449b 100644 --- a/src/cascadia/WindowsTerminal/WindowsTerminal.rc +++ b/src/cascadia/WindowsTerminal/WindowsTerminal.rc @@ -83,8 +83,8 @@ IDI_APPICON_HC_WHITE ICON "..\\..\\..\\res\\terminal\\imag #if defined(WT_BRANDING_WINTERM) 1 VERSIONINFO - FILEVERSION 1,1,1,0 - PRODUCTVERSION 1,1,1,0 + FILEVERSION 1,1,2,0 + PRODUCTVERSION 1,1,2,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG @@ -101,12 +101,12 @@ BEGIN BEGIN VALUE "CompanyName", "helloThisWorld\0" VALUE "FileDescription", "winTerm Terminal Host\0" - VALUE "FileVersion", "1.1.1.0\0" + VALUE "FileVersion", "1.1.2.0\0" VALUE "InternalName", "WindowsTerminal\0" VALUE "LegalCopyright", "Copyright (c) winTerm contributors. Portions copyright Microsoft Corporation.\0" VALUE "OriginalFilename", "WindowsTerminal.exe\0" VALUE "ProductName", "winTerm\0" - VALUE "ProductVersion", "1.1.1\0" + VALUE "ProductVersion", "1.1.2\0" END END BLOCK "VarFileInfo" diff --git a/src/winterm/Branding/ReleaseMetadata.h b/src/winterm/Branding/ReleaseMetadata.h index 3e1537375..d85f59d46 100644 --- a/src/winterm/Branding/ReleaseMetadata.h +++ b/src/winterm/Branding/ReleaseMetadata.h @@ -25,7 +25,7 @@ namespace winTerm::Branding { inline constexpr std::wstring_view Publisher{ L"helloThisWorld" }; - inline constexpr std::wstring_view ApplicationVersion{ L"1.1.1" }; + inline constexpr std::wstring_view ApplicationVersion{ L"1.1.2" }; inline constexpr std::wstring_view ReleaseChannel{ L"Stable" }; inline constexpr std::wstring_view CommitSha{ WINTERM_BUILD_COMMIT_SHA }; inline constexpr std::wstring_view BuildTimestamp{ WINTERM_BUILD_TIMESTAMP }; diff --git a/src/winterm/Branding/version.json b/src/winterm/Branding/version.json index 3edbbefa8..3e70eb035 100644 --- a/src/winterm/Branding/version.json +++ b/src/winterm/Branding/version.json @@ -1,10 +1,10 @@ { - "applicationVersion": "1.1.1", - "packageVersion": "1.1.1.0", - "moduleVersion": "1.1.1", + "applicationVersion": "1.1.2", + "packageVersion": "1.1.2.0", + "moduleVersion": "1.1.2", "modulePrerelease": "", "channel": "stable", - "tag": "v1.1.1", + "tag": "v1.1.2", "workspaceSchemaVersion": 2, "dockingModelVersion": 1, "shellProtocolVersion": 1, diff --git a/src/winterm/Workspaces/Model/WorkspaceDescriptor.h b/src/winterm/Workspaces/Model/WorkspaceDescriptor.h index e28d36ebe..3d3d76f30 100644 --- a/src/winterm/Workspaces/Model/WorkspaceDescriptor.h +++ b/src/winterm/Workspaces/Model/WorkspaceDescriptor.h @@ -219,7 +219,7 @@ namespace winTerm::Workspaces std::string createdAt; std::string updatedAt; WorkspaceSource source{ WorkspaceSource::User }; - std::string applicationVersion{ "1.1.1" }; + std::string applicationVersion{ "1.1.2" }; uint32_t protocolVersion{ 1 }; uint32_t dockingModelVersion{ DockingModelVersion }; WorkspaceStartupBehavior startupBehavior; diff --git a/src/winterm/Workspaces/Persistence/WorkspaceSerializer.cpp b/src/winterm/Workspaces/Persistence/WorkspaceSerializer.cpp index 3adfa3960..4d27df053 100644 --- a/src/winterm/Workspaces/Persistence/WorkspaceSerializer.cpp +++ b/src/winterm/Workspaces/Persistence/WorkspaceSerializer.cpp @@ -618,7 +618,7 @@ WorkspaceDescriptor WorkspaceSerializer::FromJson(const Json::Value& json, const throw std::runtime_error("The workspace source is not supported."); } workspace.source = *source; - workspace.applicationVersion = StringOrDefault(json, "applicationVersion", "1.1.1"); + workspace.applicationVersion = StringOrDefault(json, "applicationVersion", "1.1.2"); workspace.protocolVersion = UIntOrDefault(json, "protocolVersion", 1); workspace.dockingModelVersion = UIntOrDefault(json, "dockingModelVersion", DockingModelVersion); if (const auto& startup = json["startupBehavior"]; !startup.isNull())