summaryrefslogtreecommitdiff
path: root/src/CHANGELOG.md
diff options
context:
space:
mode:
Diffstat (limited to 'src/CHANGELOG.md')
-rw-r--r--src/CHANGELOG.md75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md
index 71e47f82..714497b6 100644
--- a/src/CHANGELOG.md
+++ b/src/CHANGELOG.md
@@ -1,5 +1,80 @@
# Changelog
+## 0.0.2
+
+- A filtered terminal costs what an unfiltered one does. `Filter`'s second
+ stage asked `RGB.contrast` for every cell it painted, and that call ends in
+ `std.math.pow` six times over — a libm round trip per cell, per frame, to
+ re-derive a ratio against a background that had not moved. The indexed path
+ takes a `u8`, so all 256 of its answers are now enumerated once per pass,
+ after the two default roles are fixed and before the first cell is read;
+ what a cell names is an array index into them. Only truecolour, whose
+ 16.7M inputs cannot be tabulated, still reduces, and the direct-mapped RGB
+ cache is what keeps that cheap. Tracy over the AppKit shell, ReleaseFast,
+ 190x56: the recolour pass falls 3.09 ms to 0.130 ms and the whole frame
+ 3.37 ms to 0.299 ms. The luminance table is comptime-evaluated from
+ ghostty's own expression and a test pins it to `RGB.luminance` and
+ `RGB.contrast` exactly, across every channel value and all 65 536 palette
+ pairs, because the filter's decision is a threshold comparison where one
+ ULP is a different colour on screen.
+- A pardes launched from the Dock finds the same programs a pardes launched
+ from a terminal does. LaunchServices hands a bundle launchd's own
+ environment, whose `PATH` is `/usr/bin:/bin:/usr/sbin:/sbin`, and every pty
+ shell, `|` filter and language server inherited it — so `yazi` in
+ `/opt/homebrew/bin` was missing in the app and present in the same build run
+ from a shell, which reads as "the Dock build is broken". `shell_bin`
+ composes `/etc/paths` then `/etc/paths.d/*` in the order `path_helper`
+ reads them and adopts the result before the first fork in all four native
+ hosts. It appends, so an inherited entry is never demoted and a configured
+ `PATH` is left byte-for-byte alone: the rule is that only a `PATH` nobody
+ configured gets repaired.
+- Language servers other than ZLS start on macOS. The protocol client opened
+ its control socket with `SOCK.CLOEXEC`, which Zig defines for Linux and
+ which Darwin answers with `EPROTONOSUPPORT` — so `socketpair` failed before
+ any fork, every spec in the table reported "no server", and rust-analyzer,
+ clangd and gopls were unreachable in every macOS build. It is a plain
+ socket plus `fcntl(FD_CLOEXEC)` now, the route `fuse.zig` and `nested.zig`
+ already used. Verified end to end against a 200-crate Rust workspace:
+ rust-analyzer indexes, and `gd`, `document_symbols` and `hover` answer.
+- `SPC l i` reports what the language backends are doing in the macOS app,
+ and `|` filters a selection there. Both effects were unimplemented host
+ methods — `lsp` and `pipe` were absent from the AppKit vtable, so the core
+ answered its own empty answer and the panel rendered blank while a sort
+ filter silently did nothing. The snapshot-plus-worker body each shell had
+ its own copy of is one module (`src/lsp_host.zig`), and the in-flight pipe
+ table is `selection_pipe.Tasks`; all three native shells share both.
+ Unsolicited server news ("rust-analyzer indexing 45%") reaches the message
+ row because the status sink is registered rather than merely defined.
+- Animation runs at the speed it claims. `pardes_animation_tick` advanced one
+ scene frame per callback and reported time as `frame_count / 60`, so
+ animation time was a count of how often the callback happened rather than
+ how much time had passed — and the AppKit chain re-armed `asyncAfter(.now()
+ + 0.016)` only AFTER the previous frame's work, making the real period 16 ms
+ plus all of it. Motion ran at roughly three quarters of wall clock,
+ unevenly. The tick measures elapsed monotonic time and spends it in whole
+ 16 ms steps, banking the remainder, so a late callback advances two frames
+ instead of stretching one; the arithmetic is a pure function with its own
+ tests, no display attached. On macOS 14 and later the run is driven by one
+ `CADisplayLink` phase-locked to vsync instead of a chain rebuilt per frame.
+- A filtered terminal's colours are mapped in two stages, and the second one
+ keeps text off the page. `Filter` reduces every colour to its nearest
+ canonical xterm key and reads that key out of ghostty-vt's theme-derived
+ 256-colour projection — a comparison of RGB triples, which knows about hue
+ and nothing about the background. The projection is generated FROM the
+ default foreground and background, so its cube corners are those two
+ anchors, and the nearest key to a truecolour extreme was therefore the
+ background itself: `\x1b[38;2;255;255;255m` on acme's `#ffffea` paper
+ resolved to `#ffffea`, a WCAG ratio of 1.000, text painted the colour of the
+ page under it. Every curated theme owned such a key — 231 on the light one,
+ ANSI black on both dark ones, which is a bare `\x1b[30m`. The two default
+ roles are now mapped first and named as the anchors they are, and every
+ other FOREGROUND has to clear `config.tty_filter_min_contrast` (1.5) against
+ the mapped background; one that cannot is not mapped at all, and takes
+ whichever anchor is still visible there. Backgrounds are exempt, because a
+ background is the page the floor is measured against. Measured across the
+ curated three the floor refuses 12, 16 and 7 of 256 keys, where a WCAG
+ body-text 4.5 would refuse 61, 154 and 91 and flatten the palette.
+
## 0.0.1
- Pane taglines sit where they do in the SDL window. The macOS shell had its own