Commit Graph
501 Commits
Author SHA1 Message Date
l0ng-ai 9a34576877 fix(theme): split the selection ladder into a resting and a cursor rung
Folding three signed-off values into one `SELECTED` target is what made
the chrome shout. The old ladder had `hover` 0.09, `sidebar_sel` 0.12 and
`list_active` 0.17; the ratio rewrite kept only the loudest of them and
pointed every selected fill in the app at it. On the Light theme the
rail's selected row went from #E2E2E2 to #C0C0C0 — a silver slab at twice
the perceived step it had ever had — and it took the switch tracks, the
input grounds, the plain buttons' active state and every chrome tile's
*hover* (which paints the sidebar's selected grey by design) with it.

The two jobs were never the same:

- A resting selection — a rail row, a lit toggle, a switch track — sits
  there all session next to unselected siblings. It stays quiet and leans
  on the text channel, which is what `Surface` carries both for.
- A cursor — the one menu row under the pointer, the palette's keyboard
  row — is transient and alone on its surface, and the eye is already
  tracking it. It gets the loud rung.

So `SELECTED` drops to 1.30:1 and a new `CURSOR` takes 1.70:1, each
anchored to the Dracula value it was signed off at (`mix(bg, fg, 0.12)`
and `0.17` respectively). Dracula lands within 1.02:1 of both old greys,
and every other theme is pulled onto the same two perceived steps instead
of the same one. `PRESSED` follows `SELECTED` down to 1.55:1 — it is
"one step past selected", not a fixed distance from the surface.

Only `accent` (gpui-component's name for a menu row highlight) and
`list_active` move to the new rung; everything else was already asking
for a resting selection and now gets one.

The per-surface ladder test drops its floors to match and gains a
cursor-vs-selected assertion, so the two rungs can't quietly re-merge.
2026-07-28 16:39:04 +08:00
l0ng-ai 68683647ee feat(remote): build remote panes off the UI thread, and redraw the switcher
Opening, restoring, closing or listing a remote pane each ran a routed,
blocking connection straight from a gpui input callback, freezing the whole
window for the length of an SSH setup. Pane tree leaves become a PaneSlot that
can be Ready or Connecting, so the slot lands in the layout immediately and the
wait happens in it. connect_routed now carries the same debug UI-thread guard
the Host trait uses, so the class of bug fails loudly instead of shipping.

The workspace switcher is redrawn on one alignment axis with one icon size, a
guide rail tying a remote machine's rows to it, and the command palette's card
geometry. Launch restores only the workspace the user was last in.
2026-07-28 16:32:29 +08:00
l0ng-ai 1996f2ae12 chore(release): v26.7.6 v26.7.6 2026-07-28 14:52:21 +08:00
l0ng-ai 540255e6a1 refactor(panel): give the detail panel's top zone back to the panel
The panel's title-bar-height top zone carried seven controls belonging to
three different layers: four panel tabs, the panel toggle, the "..." menu,
and the workspace chip. All seven at chrome scale, in a column the user can
drag down to MIN_WIDTH. The row wants 268px there — it overflows by 68px
before anything else goes wrong.

The layers are the real defect; the crowding is a symptom. Switching to
Files is "what does this panel show", the workspace chip is "which machine
am I on", and they sat side by side, same size, same weight.

Three changes, none of which touch the window layout — both columns stay
full-height and the corner controls stay where they are:

- The workspace chip moves to the head of the rail, as a full row with the
  workspace's name rather than a monogram in a corner. The rail below it
  enumerates that workspace's tabs, so this is where the name belongs; it
  also stops a window-scoped control from competing for the panel's width.
  Note it is *not* folded into the repo group headers under it — those are
  repositories, and one workspace holds several.

- The panel's tab tiles drop to TILE_SIZE_SM. That constant exists for
  tiles inside a panel, which is exactly what these are, and the one size
  step separates them from the window chrome sharing their row without
  spending a divider on it.

- On macOS panel_title draws nothing. The tile row above it already says
  which tab you are on, and so does the content — a file tree is Files, a
  diff is Changes. It cost a whole row: tiles, then a title, then a search
  box, before one line of content. Changes' file count moves into that
  tab's tooltip, where it stays readable without switching tabs. Outline's
  count does not survive: it needs the active leaf, which needs a &Window
  right_panel_tabs has no reason to take, and its list is one click away.
  A tab passing `trailing` still gets the row; none currently do.

Off macOS nothing changes: the panel hangs below a spanning title bar
there, and panel_title is still that panel's tab switcher.

The top zone now needs ~164px against a 200px minimum.
2026-07-28 14:19:23 +08:00
l0ng-ai 6888fd2bc8 Merge pull request #238 from l0ng-ai/chore/dedupe-resvg-component
chore: finish the resvg dedupe — bump gpui-component to 0.47
2026-07-28 12:55:14 +08:00
thomasandClaude Fable 5 c2da286a7f docs(changelog): reference the dedupe PR number
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 12:40:53 +08:00
thomasandClaude Fable 5 5cf767c9d9 chore: finish the resvg dedupe — bump gpui-component to 0.47
resvg 0.47 landed in tty7 (#227) and the gpui fork (#237), but
gpui-component still declared its own resvg = 0.45.1, keeping a
legacy resvg/usvg/tiny-skia 0.45/0.11 stack in the tree. The fork now
pins 0.47 (l0ng-ai/gpui-component@2264ff99 — no source changes needed;
its only resvg user, the Windows native-menu rasterizer, uses APIs
unchanged across the bump), so this moves the pin and drops the last
duplicate: the lockfile now carries a single resvg/usvg/tiny-skia
stack at 0.47/0.12, and `cargo tree -i resvg@0.45.1` matches nothing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 12:40:25 +08:00
l0ng-ai 191eda4460 Merge pull request #237 from l0ng-ai/chore/dedupe-resvg
chore: dedupe the resvg stack with the gpui fork
2026-07-28 12:29:17 +08:00
thomasandClaude Fable 5 d2808f8225 docs(changelog): reference the dedupe PR number
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 12:19:00 +08:00
thomasandClaude Fable 5 c04f0ab8f6 chore: dedupe the resvg stack with the gpui fork
PR #227 bumped tty7's direct resvg to 0.47 while the gpui fork still
pinned 0.45, so the tree compiled two resvg/usvg/tiny-skia stacks. The
fork's tty7 branch now carries resvg 0.47 (l0ng-ai/zed@3aac3ef); move
the gpui pin there so gpui's SVG renderer and tty7's tray-icon
rasterizer share one 0.47 stack again.

gpui-component still declares its own resvg 0.45.1 (semver-incompatible
with 0.47), so one legacy 0.45 stack remains until that fork catches up
- noted in the manifest comments.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 12:18:04 +08:00
l0ng-ai 8cb3e2cf2a Merge pull request #228 from l0ng-ai/dependabot/cargo/sha2-0.11.0
deps: bump sha2 from 0.10.9 to 0.11.0
2026-07-28 11:56:15 +08:00
l0ng-ai d534bdbb75 fix(remote): keep a remote workspace's layout across reconnects
A remote workspace came back empty every time. The layout was thrown away
on both sides of design §10's storage split: `record_session` blanked a
remote entry's `session` before anything could push it, and
`claimable_session` blanked it again on the way out, so the record pulled
from the machine on connect was discarded the moment the window opened
from it. Nothing ever called `push_remote_layout` outside workspace
creation either, which left the machine's own `workspaces.json` holding a
record with no tabs in it.

The entry's `session` is now what it was always meant to be — this
client's cache of a record the machine owns — and the split is enforced
by reachability instead of by erasure:

- `claim` / `record` ask `machine_is_connected` first. A connected remote
  window stores and reopens its layout like any other; an unreachable one
  opens empty and, the half that matters, leaves the cached layout alone
  so there is still something to rebuild from.
- `save_session` pushes to the machine that owns the record, so the
  remote's copy tracks every structural change rather than only the
  workspace's creation.
- `finish_attempt` hydrates a window that came up before its machine did.
  Only an empty one: a window with tabs is one the user is working in.

The invariant the erasure was protecting still holds, and holds where it
belongs — every leaf routes through `pane_workspace_for`, so a remote
workspace's panes attach or spawn over there, and an unreachable machine
fails the spawn rather than falling back to a local shell.

Also stop matching a native-SSH leaf's `pane_id` against a remote
workspace's alive set. That pane lives in this client's daemon however
the window is bound, and pane ids are unique only within one daemon, so a
collision would have swapped the user's SSH tab for whatever the machine
happened to be running under the same number.
2026-07-28 11:46:08 +08:00
l0ng-ai 4814d94b81 fix(remote): keep file-tree listings on screen while they refresh
A watcher event dropped the cached listing for the directory it touched, so
on a remote host every row under that directory left the screen for a whole
round trip and came back — a file rewritten a few times a second made the
tree strobe. Mark the listing stale instead: it keeps painting while the
replacement flies, and is swapped out when that lands.

Also stop relisting a directory for its own watcher event. Whatever changed
inside it arrives as an event on that child, while the directory's own event
fires for everything inside it including the dot-files the row filter skips
on purpose — so relisting for it handed back exactly the round trip that
filter exists to save. A remote $HOME with an agent rewriting
`~/.claude.json` went from two relists a second to none.
2026-07-28 11:45:48 +08:00
thomas 2c18d6b7f4 Merge origin/main into dependabot/cargo/sha2-0.11.0 2026-07-28 11:42:19 +08:00
l0ng-ai d23b509091 Merge pull request #227 from l0ng-ai/dependabot/cargo/resvg-0.47.0
deps: bump resvg from 0.45.1 to 0.47.0
2026-07-28 11:41:35 +08:00
thomas 2794be9ff3 Merge remote-tracking branch 'origin/main' into dependabot/cargo/resvg-0.47.0 2026-07-28 11:31:12 +08:00
l0ng-ai fd2cf5825a Merge pull request #226 from l0ng-ai/dependabot/cargo/cargo-minor-patch-ef56ca0698
deps: bump the cargo-minor-patch group across 1 directory with 4 updates
2026-07-28 11:30:35 +08:00
thomas ccfd7a06a7 Merge remote-tracking branch 'origin/dependabot/cargo/cargo-minor-patch-ef56ca0698' into dependabot/cargo/cargo-minor-patch-ef56ca0698 2026-07-28 11:26:40 +08:00
thomas d13aca58f9 Merge remote-tracking branch 'origin/main' into dependabot/cargo/cargo-minor-patch-ef56ca0698 2026-07-28 11:24:05 +08:00
l0ng-ai b3b394b4c1 Merge pull request #222 from l0ng-ai/feat/local-editor-parity
feat(editor): readline parity at the prompt — Ctrl-P/N, Ctrl-Y, Alt-. and shell fallthrough
2026-07-28 11:22:55 +08:00
thomas ac47531a1b Merge remote-tracking branch 'origin/main' into feat/local-editor-parity 2026-07-28 11:15:25 +08:00
l0ng-ai ffee5cc576 Merge pull request #234 from l0ng-ai/fix/boxdraw-underline-and-fractional-dpi
fix(render): keep underlines on natively-drawn cells, and stroke weight uniform at fractional DPI
2026-07-28 11:14:49 +08:00
dependabot[bot] bd97d1878a deps: bump the cargo-minor-patch group across 1 directory with 4 updates
Bumps the cargo-minor-patch group with 4 updates in the / directory: [ignore](https://github.com/BurntSushi/ripgrep), [tokio](https://github.com/tokio-rs/tokio), [tray-icon](https://github.com/tauri-apps/tray-icon) and [libc](https://github.com/rust-lang/libc).


Updates `ignore` from 0.4.26 to 0.4.31
- [Release notes](https://github.com/BurntSushi/ripgrep/releases)
- [Changelog](https://github.com/BurntSushi/ripgrep/blob/master/CHANGELOG.md)
- [Commits](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.26...ignore-0.4.31)

Updates `tokio` from 1.53.0 to 1.53.1
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.53.0...tokio-1.53.1)

Updates `tray-icon` from 0.24.1 to 0.24.2
- [Release notes](https://github.com/tauri-apps/tray-icon/releases)
- [Changelog](https://github.com/tauri-apps/tray-icon/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/tauri-apps/tray-icon/compare/tray-icon-v0.24.1...tray-icon-v0.24.2)

Updates `libc` from 0.2.186 to 0.2.189
- [Release notes](https://github.com/rust-lang/libc/releases)
- [Changelog](https://github.com/rust-lang/libc/blob/0.2.189/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/libc/compare/0.2.186...0.2.189)

---
updated-dependencies:
- dependency-name: ignore
  dependency-version: 0.4.31
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: libc
  dependency-version: 0.2.189
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: tokio
  dependency-version: 1.53.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: tray-icon
  dependency-version: 0.24.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-28 03:07:19 +00:00
thomas 52b1a64e8a Merge remote-tracking branch 'origin/main' into pr-234-review 2026-07-28 11:03:39 +08:00
l0ng-ai 6722e35f06 Merge pull request #233 from l0ng-ai/fix/windows-italic-cjk-mojibake
fix(render): stop italic CJK rendering as unrelated CJK on Windows
2026-07-28 11:00:53 +08:00
l0ng-ai 208454e202 feat(remote): remote workspaces — a window that is one machine
Split the framework-free half of tty7 into `tty7-core` and add a headless
`tty7-server` built on it, so a workspace's filesystem, git and session state
can live on another machine while the GUI stays where it is.

- `crates/tty7-core`: wire protocol, session daemon, PTY, native SSH engine and
  the domain model, with no gpui dependency. Module paths are unchanged.
- `crates/tty7-server`: the same daemon with no GUI attached, linked fully
  static against musl and pushed onto the remote box. One dependency, on
  purpose — a second one the GUI also needs belongs in core.
- `Host` trait + `HostId`/`HostRegistry`: every fs/git/watch call a workspace
  makes goes through the machine it belongs to. `LocalHost` answers on this
  box, `RemoteHost` over a routed control connection.
- `ui::host_ops`: the GUI's single door to a `Host`. Host calls block, so all
  of them run on the background executor with the result landed on the UI
  thread; de-duplication, staleness and error reporting live here rather than
  at each call site. Enforced by a CI grep.
- Connect flow: home page → pick a configured SSH host → the machine's own
  workspace list → a window bound to one workspace on it. Workspace switcher
  groups by machine, this computer included.
- CI: static musl builds of `tty7-server` for x86_64/aarch64 via
  cargo-zigbuild, a host-boundary grep, and version stamping factored out of
  the nightly workflow. Both new jobs are non-required so branch protection
  does not wedge open PRs.

Design and the interface contract it was built to are in
`docs/2026-07-27-remote-workspace-{design,impl-contract}.md`.
2026-07-28 10:59:46 +08:00
thomas 39d21edf47 Merge origin/main into fix/windows-italic-cjk-mojibake 2026-07-28 10:50:51 +08:00
l0ng-ai 664ff5bea8 Merge pull request #219 from l0ng-ai/feat/term-program-env
feat(daemon): tell every pane which terminal it is running in
2026-07-28 10:49:33 +08:00
thomas c3ebc28393 Merge remote-tracking branch 'origin/main' into feat/term-program-env
# Conflicts:
#	CHANGELOG.md
2026-07-28 10:44:13 +08:00
l0ng-ai 36a7e67a80 Merge pull request #232 from l0ng-ai/fix/dim-inactive-panes-followup
chore(settings): finish off the dim-inactive-panes setting
2026-07-28 10:42:59 +08:00
thomasandClaude Fable 5 f6d0b30312 fix(editor): make the alt-. walk survive bypass edits, selections, and shifted meta chords
Three holes in the readline-parity work, found in review:

- The walk's reset lived only in `handle_editor_key`, but edits arrive by
  other doors too — IME-committed text (all typing on macOS and Windows),
  paste, a completion pick, cmd-Z. A repeat alt-. after any of those deleted
  the recorded span even though it no longer held the walk's word. The walk
  now stores the word itself and resumes only while the line still shows it
  at `at` with the caret at its end; `commit_text` also clears the walk
  outright, mirroring the key path's reset.

- A fresh alt-. over an active selection recorded `at` from the pre-insert
  caret, but `insert_str` collapses the selection to its start first — so
  the span pointed past the inserted word and the next press ate the wrong
  text. `at` is now derived from where the caret actually landed.

- The unknown-Meta handoff built `ESC` + the key name, which gpui reports
  unshifted — alt-shift-U shipped `ESC u` instead of `ESC U`. The shared
  encoder now goes first (it knows the shifted character and the Kitty form
  when `key_char` is present), with the hand-built fallback uppercasing
  under Shift.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 10:42:26 +08:00
thomasandClaude Fable 5 042bb784ed fix(daemon): match capability env keys case-insensitively on Windows
Windows environment blocks are case-insensitive: portable-pty's
CommandBuilder keeps one slot per lowercased key, so a configured
`Term`/`ColorTerm` in `env` would land in the same slot as
`TERM`/`COLORTERM` and, coming later, replace it -- sidestepping the
rule that user env may rename the terminal but not contradict what the
pane's decoder implements. Filter capability keys with the platform's
own notion of "the same variable": case-insensitive on Windows, exact
elsewhere (where a differently-cased key is a genuinely distinct
variable and stays the user's to set). Pinned by a Windows-only test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 10:40:58 +08:00
thomasandClaude Fable 5 99f40122f8 deps: align resvg manifest requirement with the 0.47 lockfile bump
Dependabot only rewrote Cargo.lock, but the manifest still required
resvg 0.45, so every `cargo build --locked` CI job failed with
"cannot update the lock file". Bump the requirement to 0.47 and update
the pin-rationale comment: gpui/gpui-component still carry resvg
0.45.x, so a second resvg/usvg/tiny-skia stack now compiles until the
fork catches up (no type conflicts; only image::RgbaImage crosses the
tty7/gpui boundary).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 10:38:57 +08:00
thomas 07b00c2a0b Merge branch 'main' into fix/dim-inactive-panes-followup 2026-07-28 10:37:51 +08:00
thomasandClaude Fable 5 e36717a19e deps: align Cargo.toml sha2 requirement with 0.11 lockfile bump
Dependabot bumped sha2 to 0.11.0 in Cargo.lock but left the manifest
requiring 0.10, so --locked builds failed on every platform. tty7's
only sha2 usage (Sha512::digest in core::keychain) is unchanged in 0.11.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 10:37:32 +08:00
thomasandClaude Fable 5 7ffd6afe65 docs(render): reattach seg_clip_width's doc comment
native_cell_residue was inserted between seg_clip_width's doc block and
the function itself, so rustdoc attached the clip-width prose to the
residue helper and left seg_clip_width undocumented. Move the helper
(with its own doc) above the block instead. No code change.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 10:36:46 +08:00
thomasandClaude Fable 5 4d09df3b71 chore: drop stale "focus rings" comment the show_focus rename missed
The render call site still said "show focus rings only when split" -- the
same misdescription the parameter rename in this PR removes: nothing ever
drew a ring, the flag only gated the fade, and the fade condition is now
spelled out two lines below.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 10:36:28 +08:00
l0ng-ai 38975ab97e Merge pull request #230 from mingrath/feat/thai-sara-am
fix(terminal): shape Thai SARA AM with the base it belongs to
2026-07-28 09:48:07 +08:00
l0ng-ai 0a01970f76 Merge branch 'main' into feat/thai-sara-am 2026-07-28 09:43:59 +08:00
thomasandClaude Opus 5 063e4a5064 fix(render): keep underlines on natively-drawn cells, and stroke weight uniform at fractional DPI
Two follow-ups to #229.

Underlines ride on the `TextRun` that `paint_glyphs` builds, and the Solo
arm returned early for every natively-drawn cell — so an `ESC[4m` span or a
hovered URL showed a one-column hole wherever it crossed a box-drawing
character. The mechanism predates #229 (the Powerline branch has always had
it), but #229 widened it from a dozen private-use separators to all 256
characters of U+2500–U+259F. Such a cell now shapes a space in its own
style instead of returning, so gpui draws the line from the same
`UnderlineStyle` — curly and double included — that every other cell uses.

Stroke weight varied between cells at fractional device scale. `rectb`
snaps a rect's two edges independently, which is what makes neighbouring
cells tile, but two edges `w` apart land `w × scale` device pixels apart:
when that is not a whole number the two roundings straddle it, so a
1-logical-pixel rule came out 1 device pixel wide in one column and 2 in
the next. At Windows' default 125%/150% scaling that alternated thin/thick
across every column of a TUI table, and down every row for horizontal
rules. Integer scales are blind to it by construction, which is why 1x and
2x looked right.

`light_thickness` now quantises to whole device pixels, and `vstroke` /
`hstroke` lay that width off from the snapped near edge rather than
inferring it from a second snap — float ties at `.5` made the quantisation
alone insufficient. Stroke ends still snap, so #229's tiling guarantee is
untouched. Block elements stay on `rectb`: they are area fills, not
strokes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 09:14:14 +08:00
l0ng-ai 19c979b84c Merge pull request #229 from yetone/fix/native-box-drawing
fix(render): draw box-drawing and block characters natively
2026-07-28 09:04:49 +08:00
l0ng-ai e19f4acbc7 Merge branch 'main' into fix/native-box-drawing 2026-07-28 08:55:26 +08:00
thomasandClaude Opus 5 0be3b67640 fix(render): stop italic CJK rendering as unrelated CJK on Windows
Every character came out as a different character, one for one, consistently
— it read as a broken locale or a mangled encoding, and it was neither.

Hack, the bundled default, has no CJK, so those cells are shaped through the
font-fallback chain. gpui's Windows backend then threw away the face
DirectWrite shaped the run with and looked a fresh one up by family, weight and
style. That round trip mapped DirectWrite's italic to oblique — the enum is
numbered OBLIQUE = 1, ITALIC = 2, and the mapping had them the other way around
— so an italic fallback face resolved to a request for an oblique one, and a
family with no oblique face (Maple Mono NF CN, first in our Windows chain) came
back as its upright face instead. The glyph indices were right; the outlines
they indexed belonged to a different face, at a fixed glyph-id skew.

Fixed upstream in our gpui fork by registering the face DirectWrite actually
chose rather than re-deriving one, which also closes a latent use-after-free in
the same cache: it keyed fonts by a raw pointer to a face nothing held a
reference to, so a released face could be aliased by any later allocation.

Bumps the fork pin; no tty7 code changes. Covered there by two tests in
`gpui_windows::direct_write` — one asserting a shaped run's glyphs round-trip
through the font id the run reports, one asserting every font-face cache key is
owned by the font it maps to.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 08:42:08 +08:00
thomasandClaude Opus 5 c21508df6f chore(settings): finish off the dim-inactive-panes setting
#214 added the switch itself; this is the wiring around it that a new
setting in this codebase is expected to carry.

- Index the row in `settings_search_entries`, which the settings search
  box matches against. Without an entry, searching "dim", "fade" or
  "unfocused" — the words someone actually looks for — finds nothing,
  and the switch is only reachable by scrolling to it. Pinned in
  `index_titles_match_rendered_row_labels` so the title cannot drift.

- Pin the default and the round trip, as every other `default_true`
  flag here does (see `confirm_window_close_defaults_on_and_round_trips`):
  a config written before the switch existed must still dim, and a
  `false` must survive save/load or the effect comes back next launch.

- Hand the flag to `Pane::render` instead of reading the `Config` global
  from inside it. `pane.rs` had no global state before, deliberately —
  the leaf type is generic so the tree logic can be tested with plain
  values. The caller already computes the split test the dimming was
  gated on, so it can compute this too: one lookup per frame rather than
  one per leaf, and the tree stays renderable without a Config global.
  While there, `show_focus` is now named for what it does — nothing
  drew a focus ring; it only ever gated the fade.

- Move the row below "Follow theme". That button clears the opacity and
  blur overrides only, and a third row directly above it read as
  something it would also reset.

- Changelog entry.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 08:04:36 +08:00
l0ng-ai 58a1cb53be Merge pull request #214 from qiudaomao/feat/inactive_pane_dimm_optional
feat: make inactive pane fade optional
2026-07-28 08:00:22 +08:00
l0ng-ai 30077b2871 Merge branch 'main' into fix/native-box-drawing 2026-07-28 07:57:06 +08:00
l0ng-ai d6ce35043e Merge branch 'main' into feat/inactive_pane_dimm_optional 2026-07-28 07:55:25 +08:00
l0ng-ai e86cfb356a Merge pull request #224 from yetone/feat/one-dark-pro-theme
feat(theme): add One Dark Pro built-in theme
2026-07-28 07:52:47 +08:00
Qiu Daomao 91532f7a0b feat: make inactive pane fade optional 2026-07-27 19:55:54 +08:00
yetone 0cb5679842 fix(render): analytically antialiased rounded corners
The polyline arc band couldn't match kitty's corners on two counts,
both dictated by how gpui rasterizes paths:

* Separately painted segments composite as premultiplied sprites, so
  two abutting antialiased edges meet at 75% opacity — a lighter seam
  at every joint. All contours now ride in ONE Path (via move_to),
  where the 4x-MSAA samples partition cleanly across shared edges.
* Straight path edges only get 4-level MSAA antialiasing, while
  `curve_to` quadratics are antialiased analytically (Loop–Blinn
  signed distance) — a continuous ramp, the same quality kitty gets
  from supersampling. The outer arc edge is now a real quadratic per
  30° slice (control point at the tangents' intersection).

The inner edge stays a fine polyline: gpui accumulates coverage with
no winding cancellation, so a concave-side curve bulge can only
over-cover (the origin of the original quarter-disc blob). Its chord
error at 7.5° steps is under 0.1px and hides inside the MSAA. Each 30°
contour is star-shaped from its start vertex, which is what the fan
fill actually requires.
2026-07-27 18:15:58 +08:00