diff options
Diffstat (limited to 'src/CHANGELOG.md')
| -rw-r--r-- | src/CHANGELOG.md | 75 |
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 |
