Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,27 @@
# Changelog

## 0.7.0-beta.1 - Unreleased

### Added

- Directed split planning for Top, Bottom, Left, and Right relative to the focused pane.
- Compact pane-header, drag-handle, capability-aware pane-menu, and Snap-layout presentation models.
- Transaction-ready Move Pane to New Tab and Move Pane to New Window plans that retain the existing pane and session identity.
- Keyboard pane-move target cycling, accessible announcements, and configurable pane-control settings.
- Unit and source-boundary coverage for directed splits, pane menus, pane headers, handle input isolation, drag previews, moves, and keyboard movement.

### Changed

- Development metadata now identifies `0.7.0-beta.1`; the numeric MSIX version is `0.7.0.1`.
- Same-tab pane dragging now uses the existing `LayoutTransformer` to remove, normalize, and reinsert the pane relative to the selected target.
- Pane movement previews are derived from the proposed layout and must validate before a drop can be requested.

### Release status

- The existing Stable workflow remains isolated from this Beta tag.
- No `v0.7.0-beta.1` tag or Beta Release is created until the v0.7 acceptance report is complete.
- No new Stable Release is produced from this development branch.

## 1.0.2 - Stable

### Fixed
Expand Down
4 changes: 2 additions & 2 deletions custom.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
<PropertyGroup Label="Version">
<XesUseOneStoreVersioning>true</XesUseOneStoreVersioning>
<XesBaseYearForStoreVersion>2026</XesBaseYearForStoreVersion>
<VersionMajor>1</VersionMajor>
<VersionMinor>0</VersionMinor>
<VersionMajor>0</VersionMajor>
<VersionMinor>7</VersionMinor>
<VersionInfoProductName Condition="'$(WindowsTerminalBranding)'=='WinTerm'">winTerm</VersionInfoProductName>
<VersionInfoProductName Condition="'$(VersionInfoProductName)'==''">Windows Terminal</VersionInfoProductName>
<VersionInfoCulture>1033</VersionInfoCulture>
Expand Down
18 changes: 18 additions & 0 deletions docs/accessibility.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Pane Control Accessibility

Pane controls expose a named pane header, a Button-role drag grip, focused state, visible status text, context-menu action, drag action, and keyboard alternatives.

Examples:

- `Move PowerShell pane`
- `Open pane menu`
- `Split pane above`
- `Split pane below`
- `Split pane to the left`
- `Split pane to the right`

Internal pane IDs, session pointers, and Layout node IDs are never included in announcements.

Keyboard move mode announces the source, selected target and zone, and commit/cancel instructions. For example: `Moving PowerShell pane. Target: top of Command Prompt pane. Press Enter to move. Press Escape to cancel.`

High Contrast presentation uses system colors and retains labels/borders. Focus, running, failed-command, and read-only states are not conveyed only by color.
33 changes: 33 additions & 0 deletions docs/directed-split.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Directed Split

winTerm 0.7 replaces an implicit universal split direction with four explicit choices:

| Command | Result relative to the focused pane |
|---|---|
| Split Pane Top | The new pane is placed above the focused pane. |
| Split Pane Bottom | The new pane is placed below the focused pane. |
| Split Pane Left | The new pane is placed to the left of the focused pane. |
| Split Pane Right | The new pane is placed to the right of the focused pane. |

The operation targets the currently focused pane node, including when that pane is nested. It never splits the complete tab root unless the root is itself the focused pane.

## Planning and commit

`DirectedSplitAction` validates the requested edge, focused-pane identity, profile selection, DPI, minimum dimensions, and final geometry before a shell is launched. It then asks the existing `LayoutTransformer` for the proposed tree:

- Top: horizontal split, new pane first.
- Bottom: horizontal split, focused pane first.
- Left: vertical split, new pane first.
- Right: vertical split, focused pane first.

The default ratio is 0.5. A valid plan is committed through a layout transaction and recorded in layout history. A rejected plan leaves the current layout unchanged and does not create a shell session.

## Profiles

Every direction retains profile selection. The pane-control setting can use the current default profile, the current pane profile, or require an explicit selection. The Ask Every Time mode cannot produce a split plan until a profile is selected.

The existing Terminal action schema continues to represent the four directions with `SplitDirection::Up`, `Down`, `Left`, and `Right`. Configurable keybindings and Command Palette entries use the same action path.

## Focus

By default, focus moves to the new pane after a successful split. The Pane Controls setting can retain focus on the existing pane.
19 changes: 19 additions & 0 deletions docs/keyboard-shortcuts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Keyboard Pane Commands

winTerm exposes configurable command IDs without assigning unconditional default shortcuts:

| Command ID | Command |
|---|---|
| `splitPaneTop` | Split Pane Top |
| `splitPaneBottom` | Split Pane Bottom |
| `splitPaneLeft` | Split Pane Left |
| `splitPaneRight` | Split Pane Right |
| `movePaneToNewTab` | Move Pane to New Tab |
| `movePaneToNewWindow` | Move Pane to New Window |
| `closeFocusedPane` | Close Focused Pane |
| `startPaneMoveMode` | Start Pane Move Mode |
| `openPaneMenu` | Open Pane Menu |

Keyboard move mode uses Arrow keys to select a zone, Tab/Shift+Tab to change targets, Enter to request the move, and Escape to cancel. It remains available when pane headers are hidden.

The existing Terminal action schema is retained for serialized split and move actions. No existing user keybinding is overwritten.
37 changes: 37 additions & 0 deletions docs/pane-context-menu.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Pane Context Menu

Right-clicking a pane handle or pressing the overflow button opens the same command model:

```text
Pane
├── Split
│ ├── Top
│ ├── Bottom
│ ├── Left
│ └── Right
├── Move
│ ├── Move to New Tab
│ └── Move to New Window
├── Close Pane
└── More
├── Focus Pane
├── Zoom Pane
└── Pane Settings
```

The menu uses explicit labels. It does not use ambiguous terms such as Pop or Release.

## Capability state

- Move to New Tab is disabled when the pane is already the only pane in the tab.
- Move to New Window is disabled when the current window host cannot reattach a live pane in the same process.
- Split directions are disabled when the focused pane is too small for the requested axis.
- Close and layout-changing commands are disabled while a transaction protects the pane.

Every disabled command exposes a reason as tooltip/secondary text and in its accessible name.

## Safety

Move operations retain the existing pane node and session ownership. The source is removed only as part of a validated transaction after the target is prepared. Close Pane delegates to the existing safe close path and does not bypass close confirmation.

Terminal-content right-click remains governed by terminal copy/paste settings. Pane-header right-click always requests the pane menu.
45 changes: 45 additions & 0 deletions docs/pane-controls.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Pane Controls

winTerm 0.7 defines a compact pane header for every pane in a split layout. The header is outside the terminal buffer, so its pointer input is never sent to the shell.

## Visibility

Pane header visibility supports:

- Automatic: hidden for a one-pane tab and shown for every pane when the tab has two or more panes.
- Always: shown even for a one-pane tab.
- Never: hidden without removing Command Palette, keyboard move mode, or the pane-menu shortcut.

The supported logical height is 24–30 pixels; the default is 26. Showing or hiding a header changes the space offered to the terminal control, which must trigger the normal row and column recalculation.

## Header content

The compact header contains a drag grip, a pane title, focus/status text exposed to accessibility, and an optional overflow button. It does not contain a large toolbar.

Title precedence is:

1. User-defined pane title.
2. Shell-reported title.
3. Profile name.
4. Shell type.

Absolute paths are reduced to their final component before display. Long titles are ellipsized while the accessible pane name remains meaningful.

Focused, running, failed-command, and read-only states have text or automation state and do not rely on color alone.

## Settings

Pane Controls are part of Docking and Layout settings:

- Show Pane Headers
- Pane Header Height
- Show Pane Title
- Show Profile Icon
- Show Overflow Button
- Enable Pane Handle Dragging
- Show Snap Layout Overlay
- Enable Corner Zones
- After Split
- Split Profile

These are view/profile settings. They do not add fields to the Workspace schema.
30 changes: 30 additions & 0 deletions docs/pane-handle-dragging.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Pane Handle Dragging

Pane docking starts only from the explicit drag grip in a pane header. Pointer movement in terminal content, the scrollbar, or an overflow button cannot start a pane drag. This preserves selection, mouse reporting, Vim/tmux interaction, application mouse input, and right-click copy/paste behavior.

## Drag lifecycle

The pane-handle source reuses the v0.5 docking components:

1. `DragThreshold` validates mouse or touch movement.
2. `DragPayloadRegistry` creates an opaque, expiring, single-use token.
3. `DockDragStateMachine` tracks drag, target, drop, commit, and cancellation.
4. `LayoutTransformer.BuildProposedLayout()` produces the proposed layout.
5. `DockPreview` derives preview geometry from that proposed tree.
6. `LayoutTransactionCoordinator` reserves live session ownership and commits or rolls back.

Hovering does not mutate the runtime layout, launch a shell, transfer a session, save a Workspace, write a file, or change focus.

## Zones

Top, Bottom, Left, and Right are always the core zones. Corner zones appear only when enabled and when the target is large enough. Center means move as a new tab; it never silently replaces or closes an existing pane. An Empty Slot is filled without adding a split.

Same-tab movement removes the source pane, normalizes the tree, and reinserts the same pane node around the target. It does not duplicate the source pane.

Dropping on the tab strip creates a standalone tab. Dropping outside the window requests a new same-process window. Cross-process live pane transfer is disabled with an explanation because the terminal session must not be restarted to imitate a move.

## Cancellation and failure

Escape, pointer-capture loss, invalid targets, closed source/target objects, display changes, expired tokens, and commit failure cancel or roll back the operation. The source remains in its original layout unless the complete target transaction succeeds.

Mixed-DPI adapters must express pointer and target rectangles in the target window's coordinate space before building the overlay or preview.
6 changes: 5 additions & 1 deletion docs/user/accessibility.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# Accessibility

Core flows must have a keyboard path and accessible labels. The v1.0 manual audit for Narrator, high contrast, scaling, and pseudo-localization remains open; see the [accessibility audit](../accessibility-audit-v1.0.md) before relying on an unverified path.
Core flows have a keyboard path and accessible labels. Pane handles are announced as **Move _title_ pane**, overflow buttons as **Open pane menu**, and directed split commands describe above, below, left, or right.

Pane focus and running, failure, and read-only status are not represented only by color. Keyboard move mode announces the source, target, zone, Enter action, and Escape cancellation.

The runtime Narrator, High Contrast, scaling, and pseudo-localization audit remains open; see the [v0.7 acceptance report](../v0.7-acceptance.md) before relying on an unverified path.
8 changes: 7 additions & 1 deletion docs/user/getting-started.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# Getting started

Launch winTerm, choose an available shell profile, open a tab, and split a pane using configured keybindings or the command palette. Themes, fonts, Workspaces, and safe shell helpers are described in the linked guides. Visual Docking runtime is disabled in the current beta preparation branch.
Launch winTerm, choose an available shell profile, and open a tab.

To split the focused pane, choose **Split Pane** and then **Top**, **Bottom**, **Left**, or **Right**. The selected profile opens on the chosen side of the focused pane, not around the complete tab.

In a split layout, each pane can show a compact header with a drag grip, title, focus/status indication, and overflow menu. Right-click the handle or select the overflow button for Split, Move to New Tab, Move to New Window, Close Pane, focus, zoom, and settings commands. Unsupported live-window moves are disabled rather than restarting the shell.

Keyboard and Command Palette alternatives remain available when pane headers are hidden. Visual Docking runtime and live session preservation still require the evidence listed in the [v0.7 acceptance report](../v0.7-acceptance.md).
4 changes: 4 additions & 0 deletions docs/user/keyboard-shortcuts.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# Keyboard shortcuts

Use the existing configurable Windows Terminal keybinding system. winTerm does not invent default Docking shortcuts; unassigned commands remain unassigned until the user binds them. Verify bindings in Settings or the command palette.

Pane commands include Split Pane Top/Bottom/Left/Right, Move Pane to New Tab, Move Pane to New Window, Close Focused Pane, Start Pane Move Mode, and Open Pane Menu. See the [command ID reference](../keyboard-shortcuts.md).

In pane move mode, use Arrow keys to select a zone, Tab or Shift+Tab to change the target, Enter to commit, and Escape to cancel.
10 changes: 9 additions & 1 deletion docs/user/visual-docking.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
# Visual Docking

The beta model includes edge zones, corner zones, empty slots, undo/redo, rollback planning, and keyboard descriptions. Live Visual Docking is disabled by default pending Windows runtime validation. Cross-process pane transfer is unsupported.
Start pane docking from the grip in the pane header. Dragging terminal text, the scrollbar, or the overflow button does not move a pane.

The Snap-like overlay offers Top, Bottom, Left, and Right. Corner zones appear when enabled and when the target is large enough. Center over tab content or the tab strip means **Move to New Tab**; it never replaces a live pane. Empty Slots can be filled directly.

The preview comes from the same proposed layout used by commit. Escape or pointer-capture loss cancels without changing the layout. A failed commit rolls back the layout and session ownership.

Keyboard move mode uses Arrow keys for zones, Tab/Shift+Tab for targets, Enter to move, and Escape to cancel.

Live same-process pane transfer must preserve the Shell PID, ConPTY session, buffer, running command, alternate screen, and working-directory metadata. Cross-process live transfer is unsupported and is shown as disabled. Runtime Visual Docking remains gated by the [v0.7 acceptance report](../v0.7-acceptance.md).
71 changes: 71 additions & 0 deletions docs/v0.7-acceptance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# winTerm 0.7 acceptance report

Version: `0.7.0-beta.1`
Feature: Directed Split & Pane Controls
Status: **In progress — do not tag or publish**

This report distinguishes implemented source boundaries from compiled, runtime, and manual verification. An unchecked item must not be described as passed.

## Implemented source boundaries

- [x] Four explicit split directions map to the correct child order and orientation.
- [x] Directed split targets the focused pane node in nested layouts.
- [x] Profile policy and explicit profile selection are retained.
- [x] Invalid directions and insufficient dimensions reject the plan before shell launch.
- [x] Pane-header Automatic, Always, and Never presentation rules are modeled.
- [x] Pane title precedence, path privacy, focus, running, failed, and read-only accessibility text are modeled.
- [x] Right-click and overflow menu invocations use one capability-aware command model.
- [x] Pane drag can start only from the explicit grip and observes a movement threshold.
- [x] Same-tab drag uses remove/normalize/reinsert semantics in the existing transformer.
- [x] Snap overlay and preview reuse the existing v0.5 models.
- [x] Preview derives from the proposed layout and invalid preview cannot request drop.
- [x] Move-to-new-tab/window plans retain the existing pane node and session identity.
- [x] Unsupported cross-process transfer is disabled with a reason.
- [x] Keyboard move mode supports arrows, Tab/Shift+Tab, Enter, Escape, and announcements.
- [x] Workspace and Docking schema versions remain unchanged.

## Build and automated execution evidence

- [x] Debug x64 build.
- [x] Release x64 build.
- [x] Settings Model compiled unit tests.
- [x] Terminal App compiled unit tests.
- [x] Control compiled unit tests.
- [x] Unsigned Release x64 MSIX generated and inspected.
- [ ] Full regression suite.

Local build and automated validation completed on 2026-07-20:

- The repository-recommended PowerShell 7, Visual Studio 2022 C++/UWP, MSBuild, Windows SDK, XAML, MSIX, MakeAppx, and SignTool environment was installed and selected by the build module.
- `build.ps1 -Configuration Debug -Platform x64 -IncludeTests` passed.
- `build.ps1 -Configuration Release -Platform x64 -IncludeTests` passed.
- The Debug and Release Relevant suites each passed 203 Settings Model, 51 Terminal App, and 30 Control tests with no failures, blocked tests, skipped tests, or tests not run.
- `test-pane-controls.ps1 -SourceOnly` passed as part of both Relevant suites.
- The layout-transformation, docking-transaction, layout-history, session-transfer, and docking-presentation source checks passed.
- The local UI automation manifest and privacy boundary validation passed; runtime UI automation was not executed.
- A local unsigned `0.7.0.1` x64 MSIX was generated. Its `HelloThisWorld.winTerm` identity, `CN=winTerm Development` publisher, `winterm.exe` alias, absence of `wt.exe`, and terminal-host product metadata passed package-output inspection.
- A self-signed development copy of the candidate passed signature and checksum verification. Installation was not used as runtime evidence because Windows correctly refused to replace an installed `1.0.2.0` package with the lower `0.7.0.1` package version; the temporary test-certificate trust was removed.
- The Release Full suite was attempted, but the runner stopped before the full test set could execute because `Conhost.Unit.Tests.dll` was not built by the current `-IncludeTests` path. Full regression therefore remains unchecked.
- Directly launching the unpackaged Release host is not an MSIX runtime substitute; it exited with `0xC0000409` outside package dependency context and is not counted as a runtime acceptance result.
- Version consistency, branding, Release Smoke, PowerShell syntax, JSON, XML, and `git diff --check` passed.
- The inspected MSIX is an unsigned local candidate only. It is not a release asset and was not installed or published.

## Runtime and manual evidence

- [ ] Pane headers are rendered in the running application.
- [ ] Terminal rows/columns recalculate without partial rows.
- [ ] Handle right-click and overflow open the running pane menu.
- [ ] Handle drag displays the running Snap overlay.
- [ ] Top/Bottom/Left/Right drop commits the previewed layout.
- [ ] Tab-strip drop creates a live standalone tab.
- [ ] Outside-window drop creates a live same-process window.
- [ ] Shell PID, ConPTY session, buffer, command, alternate screen, and CWD metadata remain unchanged.
- [ ] Failure rollback and Undo/Redo preserve the live session.
- [ ] Workspace restore recreates the resulting layout.
- [ ] 100%, 125%, 150%, 200%, mixed-DPI, negative-coordinate, and portrait-monitor tests.
- [ ] Narrator and High Contrast audit.
- [ ] 20/40-pane, 100-split, 500-drag, large-output, latency, and leak checks.

## Release gate

Do not create `v0.7.0-beta.1`, do not publish a Beta Release, and do not resume any Stable Release process until every required build/runtime/manual item above has evidence and no relevant P0/P1 issue remains.
Loading