Commit Graph

2064 Commits

Author SHA1 Message Date
Mitchell Hashimoto
142f8ca6db terminal: Screen.selectLine uses new semantic boundaries 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
b62ac468dc terminal: change Screen.resize to take an options struct 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
07dce38cc5 terminal: Screen tracks semantic content seen 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
fd016fdb2a terminal: move cursor semantic content functions into Screen 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
4dd5df6c05 terminal: PageList.highlightSemanticContent 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
f9aa759767 terminal: promptIterator needs to respect limits 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
c74889124a terminal: PageList uses new semantic_prompt2 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
123e4ea325 terminal: PageList delta_prompt scroll uses new promptIterator 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
3c0fe02238 terminal: PageList.promptIterator 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
a80b3f34c0 terminal: add semantic_prompt2 to Row to track prompt state 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
84cfb9de1c restore old marking behavior so everything keeps working 2026-01-31 11:01:02 -08:00
Mitchell Hashimoto
ae65998d5b terminal: OSC 133;I 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
4d555f878e terminal: OSC 133 N 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
af12241d88 terminal: OSC 133 P 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
acd7a448e1 terminal: OSC 133 B handling 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
3fa6320478 terminal: handle fresh_line_new_prompt 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
24bf642bdc terminal: start implementing proper semantic prompt behaviors 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
7a69e2bf86 terminal: printCell writes with the current pen's content type 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
487b84da0e terminal: add semantic_content enum to cell 2026-01-31 11:01:01 -08:00
Mitchell Hashimoto
75eac6e3ea terminal: stream handleManually => vtRaw 2026-01-31 08:47:15 -08:00
Mitchell Hashimoto
9056fa7fd1 inspector: cell inspector 2026-01-31 08:47:14 -08:00
Mitchell Hashimoto
51ce210833 terminal: add helpers to BitmapAllocator for sizing 2026-01-31 08:47:14 -08:00
Mitchell Hashimoto
c8e048f309 inspector: pagelist 2026-01-31 08:47:14 -08:00
Mitchell Hashimoto
c9e60b322b terminal: OSC133 options parse from raw string
This changes our OSC133 parser to parse options lazily. We do this for
multiple reasons:

1. Parsing all our options ahead of time balloons our required
   osc.Command tagged union type which has C ABI implications. Adding
   all supported options (including Kitty extensions) today already
   breaks our C ABI.

2. Invalid options are allowed by the specification and should be 
   explicitly ignored, so we don't need to validate options at all
   during parse time.

3. Semantic prompt markers don't need to be high throughput, so we
   can afford to do some extra work at processing time to gather
   the options. They're also rather short usually.
2026-01-24 13:48:31 -08:00
Mitchell Hashimoto
c98e3e6fc7 terminal/osc: rename the prompt2 file 2026-01-23 14:38:28 -08:00
Mitchell Hashimoto
afea12116d terminal/osc: Kitty extensions to semantic prompt options 2026-01-23 14:38:06 -08:00
Mitchell Hashimoto
d23722dbd7 terminal: remove old semantic prompt handling 2026-01-23 14:35:10 -08:00
Mitchell Hashimoto
389439b167 terminal: handle semantic prompt same as old 2026-01-23 14:30:27 -08:00
Mitchell Hashimoto
6ce45fb65a terminal/osc: semantic prompt redraw option from Kitty 2026-01-23 14:19:43 -08:00
Mitchell Hashimoto
9f2808ce40 terminal: stream handles new SemanticPrompt type 2026-01-23 14:14:28 -08:00
Mitchell Hashimoto
edafe86203 terminal/osc: semantic prompt is a struct not tagged union 2026-01-23 14:04:27 -08:00
Mitchell Hashimoto
a9e23c135f terminal/osc: semantic prompt 'D' 2026-01-23 13:56:29 -08:00
Mitchell Hashimoto
9d1282eb95 terminal/osc: semantic prompt 'C' 2026-01-23 13:44:34 -08:00
Mitchell Hashimoto
7421e78f1e terminal/osc: semantic prompt 'I' 2026-01-23 13:43:08 -08:00
Mitchell Hashimoto
fdc6a6b10a terminal/osc: semantic prompt 'B' 2026-01-23 13:39:33 -08:00
Mitchell Hashimoto
0d9216bb5a terminal/osc: semantic prompt 'N' 2026-01-23 13:37:34 -08:00
Mitchell Hashimoto
39c0f79b8d terminal/osc: semantic prompt 'P' 2026-01-23 13:35:16 -08:00
Mitchell Hashimoto
7968358234 terminal/osc: semantic prompt options 2026-01-23 13:26:45 -08:00
Mitchell Hashimoto
65c56c7c77 terminal/osc: add 'A' 2026-01-23 13:19:11 -08:00
Mitchell Hashimoto
d040c935e2 terminal/osc: boilerplate new OSC 133 parsing 2026-01-23 13:02:23 -08:00
Jeffrey C. Ollie
e1b82ff398 osc: parse iTerm2 OSC 1337 extensions
Add a framework for parsing iTerm2's OSC 1337 extensions. Implement
a couple (`Copy` and `CurrentDir`) that map easily onto existing OSC
commands.
2026-01-22 22:06:39 -06:00
Mitchell Hashimoto
01f1611c9f tripwire: change backing store from ArrayHashMap to EnumMap
This eliminates all allocation from Tripwire.
2026-01-21 15:30:49 -08:00
Mitchell Hashimoto
fbc1e326d6 Introduce Tripwire to test errdefer and fix some found issues (#10401)
This adds a new single-file library called "Tripwire" in
`src/tripwire.zig`. This library helps inject failures around `try`
cases for the purpose of testing `errdefer`. It is fully optimized away
in non-test builds (even debug), turning into zero space and zero
assembly.

From this, I've verified (via unit tests w/ tripwire) and fixed a number
of errdefer issues:

* PageList init with non-standard pages that requires more than 1 page
can leak on allocation error on the 2nd+ loop
* Tabstop allocation failure on resize corrupts the internal state
(invalid cols)
* `Screen.selectionString` would leak memory on late allocation failures
* Screen search could leak memory on late allocation failures
* `SharedGrid.renderGlyph` in our font subsystem would corrupt the glyph
cache if failure occurred
* `SharedGrid.init` could leak memory if loading font metrics failed

In addition to the bugs found, there is now tripwire coverage around
more of our core and we should continue to add more. I've also added
significantly more explicit error sets as I found them.

**AI disclosure:** AI wrote some of the tests, but tripwire itself is
all handwritten and everything was reviewed.
2026-01-21 12:50:55 -08:00
Mitchell Hashimoto
64ccad3a75 terminal: fix memory leak on error handling in screen search 2026-01-21 12:01:59 -08:00
Mitchell Hashimoto
c1b22a8041 terminal: fix leak on error in selectionString 2026-01-21 11:53:25 -08:00
Mitchell Hashimoto
82b10ae7af terminal: explicit error sets in Screen and ScreenSet 2026-01-21 11:34:59 -08:00
Jeffrey C. Ollie
9ee27d2697 OSC 9: Finish parsing all ConEmu OSCs
Adds support for parsing OSC 9;7, 9;8, 9;9, 9;10, 9;11, 9;12
2026-01-21 13:34:30 -06:00
Mitchell Hashimoto
3d2152f5e8 terminal: Tabstops fix state corruption on error in resize 2026-01-21 09:50:53 -08:00
Mitchell Hashimoto
baa9dd6b2a terminal: use tripwire with PageList init, fix an errdefer bug 2026-01-21 09:42:31 -08:00
Mitchell Hashimoto
49b2b8d644 unicode: switch to uucode grapheme break to (mostly) match unicode spec (#9680)
This PR builds on https://github.com/ghostty-org/ghostty/pull/9678 ~so
the diff from there is included here (it's not possible to stack PRs
unless it's a PR against my own fork)--review that one first!~

This PR updates the `graphemeBreak` calculation to use `uucode`'s
`computeGraphemeBreakNoControl`, which has [tests in
uucode](215ff09730/src/x/grapheme.zig (L753))
that confirm it passes the `GraphemeBreakTest.txt` (minus some
exceptions).

Note that the `grapheme_break` (and `grapheme_break_no_control`)
property in `uucode` incorporates `emoji_modifier` and
`emoji_modifier_base`, diverging from UAX #29 but matching UTS #51. See
[this comment in
uucode](215ff09730/src/grapheme.zig (L420-L434))
for details.

The `grapheme_break_no_control` property and
`computeGraphemeBreakNoControl` both assume `control`, `cr`, and `lf`
have been filtered out, matching the current grapheme break logic in
Ghostty.

This PR keeps the `Precompute.data` logic mostly equivalent, since the
`uucode` `precomputedGraphemeBreak` lacks benchmarks in the `uucode`
repository (it was benchmarked in [the original PR adding `uucode` to
Ghostty](https://github.com/ghostty-org/ghostty/pull/8757)). Note
however, that due to `grapheme_break` being one bit larger than
`grapheme_boundary_class` and the new `BreakState` also being one bit
larger, the state jumps up by a factor of 8 (u10 -> u13), to 8KB.

## Benchmarks

~I benchmarked the old `main` version versus this PR for
`+grapheme-break` and surprisingly this PR is 2% faster (?). Looking at
the assembly though, I'm thinking something else might be causing that.
Once I get to the bottom of that I'll remove the below TODO and include
the benchmark results here.~

When seeing the speedup with `data.txt` and maybe a tiny speedup on
English wiki, I was surprised given the 1KB -> 8KB tables. Here's what
AI said when I asked it to inspect the assembly:
https://ampcode.com/threads/T-979b1743-19e7-47c9-8074-9778b4b2a61e, and
here's what it said when I asked it to predict the faster version:
https://ampcode.com/threads/T-3291dcd3-7a21-4d24-a192-7b3f6e18cd31

It looks like two loads got reordered and that put the load that
depended on stage1 -> stage2 -> stage3 second, "hiding memory latency".
So that makes the new one faster when looking up the `grapheme_break`
property. These gains go away with the Japanese and Arabic benchmarks,
which spend more time processing utf8, and may even have more grapheme
clusters too.

### with data.txt (200 MB ghostty-gen random utf8)

<img width="1822" height="464" alt="CleanShot 2025-11-26 at 08 42 03@2x"
src="https://github.com/user-attachments/assets/56d4ee98-21db-4eab-93ab-a0463a653883"
/>

### with English wiki dump

<img width="2012" height="506" alt="CleanShot 2025-11-26 at 08 43 15@2x"
src="https://github.com/user-attachments/assets/230fbfb7-272d-4a2a-93e7-7268962a9814"
/>

### with Japanese wiki dump

<img width="2008" height="518" alt="CleanShot 2025-11-26 at 08 43 49@2x"
src="https://github.com/user-attachments/assets/edb408c8-a604-4a8f-bd5b-80f19e3d65ee"
/>

### with Arabic wiki dump

<img width="2010" height="512" alt="CleanShot 2025-11-26 at 08 44 25@2x"
src="https://github.com/user-attachments/assets/81a29ac8-0586-4e82-8276-d7fa90c31c90"
/>


TODO:

* [x] Take a closer look at the assembly and understand why this PR (8
KB vs 1 KB table) is faster on my machine.
* [x] _(**edit**: checking this off because it seems unnecessary)_ If
this turns out to actually be unacceptably slower, one possibility is to
switch to `uucode`'s `precomputedGraphemeBreak` which uses a 1445 byte
table since it uses a dense table (indexed using multiplication instead
of bitCast, though, which did show up in the initial benchmarks from
https://github.com/ghostty-org/ghostty/pull/8757 a small amount.)

AI was used in some of the uucode changes in
https://github.com/ghostty-org/ghostty/pull/9678 (Amp--primarily for
tests), but everything was carefully vetted and much of it done by hand.
This PR was made without AI with the exception of consulting AI about
whether the "Prepend + ASCII" scenario is common (hopefully it's right
about that being uncommon).
2026-01-20 09:44:15 -08:00