Commit Graph

16758 Commits

Author SHA1 Message Date
Mitchell Hashimoto
f50bdfab20 terminal/snapshot: screen plus active encoding 2026-07-30 11:22:48 -07:00
Mitchell Hashimoto
6508cbbb49 terminal/snapshot: screen record 2026-07-30 11:22:48 -07:00
Mitchell Hashimoto
e8e56e782c terminal/snapshot: small edits 2026-07-30 11:22:47 -07:00
Mitchell Hashimoto
83ffa74e2b terminal/snapshot: page records 2026-07-30 11:22:47 -07:00
Mitchell Hashimoto
406f5e7d82 terminal/snapshot: encode sparse page grids 2026-07-30 11:22:47 -07:00
Mitchell Hashimoto
2fc238ed01 terminal/snapshot: decode directly into pages 2026-07-30 11:22:47 -07:00
Mitchell Hashimoto
d44baa9147 terminal/snapshot: setup the snapshot main 2026-07-30 11:22:47 -07:00
Mitchell Hashimoto
805c3b0baf terminal/snapshot: start page encoding 2026-07-30 11:22:47 -07:00
Mitchell Hashimoto
b4fd26f0d9 terminal/snapshot: hyperlink and style encoding 2026-07-30 11:22:47 -07:00
Mitchell Hashimoto
fdf8dfd7b1 terminal/snapshot: define v0 record framing 2026-07-30 11:22:46 -07:00
Mitchell Hashimoto
4d605bf0d8 Misc improvements for future binary snapshot API (#13525)
Extracted out the raw `src/terminal` changes needed for the future
snapshot work, 4 separate changes. These are uncontroversial and
relatively simple, summarized below. Tests AI assisted but the rest
including commit messages, this PR message, etc. all organic.

* **Add iterator to ref counted set.** Iterate over live entries and
their IDs. Const, doesn't mutate the set.
* **lib.Enum produces stable enums for Zig.** Basically the same as C
except it uses the smallest fitting integer including the holes.
* **PageList: a couple helpers for manually creating pages.** There is
`PageList.Builder` for creating a new pagelist and
`PageList.allocatePage` for modifying an existing one. This allows
PageList construction from raw pages.
tip
2026-07-30 11:21:45 -07:00
Mitchell Hashimoto
457c5a0a64 terminal: PageList align Builder/PageAllocation APIs better
Rename Builder.addPage and PageAllocation.cancel to their consistent allocatePage and deinit forms. Track successful ownership transfers so both builder APIs can use unconditional deferred cleanup without releasing pages transferred to a PageList.
2026-07-30 11:02:12 -07:00
Mitchell Hashimoto
506de8517a terminal: fix string capacity check in hyperlink reflow (#13524)
Fixes #13522

Fixes unreachable when reflow dupes a hyperlink into a destination page
whose string allocator is nearly full.

The capacity precondition in ReflowCursor.writeCell performed a single
test allocation of `uri.len + id.len` bytes before duping a hyperlink
into the destination page. But PageEntry.dupe allocates the URI and the
explicit ID as two separate allocations, and the string allocator rounds
every allocation up to its 32-byte chunk size independently, so the two
separate allocations can require one more chunk than the single combined
test allocation.

Write a new helper to make sure we get the right amount of space using
the same allocation pattern of dupe.

**AI note:** Verified upstream via Fable. I told it to ignore any
conclusions and do its own validation and fix suggestion. It did
validate it with a failing test which I studied. It implement a fix, I
rewrote it to be more idiomatic.
2026-07-30 09:45:58 -07:00
Mitchell Hashimoto
d5c7e54ae4 terminal: fix string capacity check in hyperlink reflow
Fixes #13522

Fixes unreachable when reflow dupes a hyperlink into a destination page 
whose string allocator is nearly full.

The capacity precondition in ReflowCursor.writeCell performed a single
test allocation of `uri.len + id.len` bytes before duping a hyperlink
into the destination page. But PageEntry.dupe allocates the URI and
the explicit ID as two separate allocations, and the string allocator
rounds every allocation up to its 32-byte chunk size independently, so
the two separate allocations can require one more chunk than the
single combined test allocation.

Write a new helper to make sure we get the right amount of space
using the same allocation pattern of dupe.
2026-07-30 09:36:20 -07:00
Mitchell Hashimoto
e77c2612e5 lib: Zig enums have stable values 2026-07-30 08:51:38 -07:00
Mitchell Hashimoto
35db32078b terminal: PageList allocatePage 2026-07-30 07:22:03 -07:00
ghostty-vouch[bot]
70c498ac32 Update VOUCHED list (#13521)
Triggered by [discussion
comment](https://github.com/ghostty-org/ghostty/discussions/13520#discussioncomment-17837792)
from @pluiedev.

Vouch: @carlvillads

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-30 08:51:35 +00:00
ghostty-vouch[bot]
96e39f8235 Update VOUCHED list (#13518)
Triggered by [discussion
comment](https://github.com/ghostty-org/ghostty/discussions/13516#discussioncomment-17834904)
from @jcollie.

Vouch: @fallintoplace

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-30 03:17:51 +00:00
Mitchell Hashimoto
fc1bd06a1a terminal: PageList builder to build from raw pages 2026-07-29 14:04:39 -07:00
Mitchell Hashimoto
6ad1fe7d8c url: exclude trailing spaces from path matches (#13505)
This change improves the user experience for Pi TUI users on macOS.

As a user of Ghostty 1.3.1, Pi 0.80.7, and macOS 26.5, I noticed that
Command-click was not working.

With Pi's help (GPT-5.6 Terra High), I narrowed the cause down to Pi's
redraw
behavior and `src/config/url.zig`'s regular expression. More details are
in
[Vouch Request
#13491](https://github.com/ghostty-org/ghostty/discussions/13491).

The `trailing_spaces_at_eol` behavior in `src/config/url.zig` was
introduced in
[PR #9921](https://github.com/ghostty-org/ghostty/pull/9921) while
improving
Command-click handling for relative and local paths. The concern about
matching
trailing whitespace was also noted in [a review
comment](https://github.com/ghostty-org/ghostty/pull/9921#issuecomment-3661107609).

However, supporting file paths with trailing spaces does not seem like a
good
trade-off because it blocks Command-click for file paths displayed by Pi
TUI.

This PR removes that behavior.

I tested this on my Mac with a patched Ghostty build, and Command-click
worked
correctly for file paths in Pi TUI.

AI disclosure: I used Pi with GPT-5.6 Terra High to investigate and
implement this change.
I reviewed the code and tested the result myself.
2026-07-29 08:18:20 -07:00
Jeffrey C. Ollie
adfef29776 wayland/Hotkeys: polish & simplify (#13512)
I've come up with a way to avoid manually allocating each entry which
honestly makes the code flow much more smoothly. Basically you collect
all the applicable keybinds first, then try to bind them with their
stable memory addresses.
2026-07-29 10:10:34 -05:00
Leah Amelia Chen
c3b5cab941 wayland/Hotkeys: polish & simplify
I've come up with a way to avoid manually allocating each entry which
honestly makes the code flow much more smoothly. Basically you collect
all the applicable keybinds first, then try to bind them with their
stable memory addresses.
2026-07-29 22:18:55 +08:00
ghostty-vouch[bot]
a34bf0dce7 Update VOUCHED list (#13511)
Triggered by [discussion
comment](https://github.com/ghostty-org/ghostty/discussions/13508#discussioncomment-17828581)
from @jcollie.

Vouch: @simonbcn

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-29 14:17:15 +00:00
Mitchell Hashimoto
ae8727401d docs: clarify macOS dependencies (#13498)
reword: The doc said "macOS doesn't need any dependencies" and then
immediately listed things you needed to install for macOS 😁. This is
just rewording the doc to be more consistent.
2026-07-28 20:02:19 -07:00
Mitchell Hashimoto
6bbbf59e9f update zig-gobject to 0.3.2 (#13502)
Includes better ZIg 0.16 compat and updates for Gnome 50.
2026-07-28 20:02:06 -07:00
r
9fc2a30852 url: exclude trailing spaces from path matches
#13491
#9921

Path matching previously included end-of-line spaces. Pi redraws can
leave blank cells after a path, causing cmd-click to open a pathname
that includes those cells. Do not include trailing whitespace in path
matches.

AI disclosure: Pi using GPT-5.6 Terra High was used to investigate
and write this change. I reviewed it personally.
2026-07-29 09:49:14 +09:00
Jeffrey C. Ollie
1cc5e7bec1 update zig-gobject to 0.3.2
Includes better ZIg 0.16 compat and updates for Gnome 50.
2026-07-28 15:52:01 -05:00
ghostty-vouch[bot]
232d40c062 Update VOUCHED list (#13499)
Triggered by
[comment](https://github.com/ghostty-org/ghostty/issues/13498#issuecomment-5109104876)
from @mitchellh.

Vouch: @vegerot

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-28 20:07:22 +00:00
Max Coplan
4b586231af docs: clarify macOS dependencies
reword: The doc said "macOS doesn't need any dependencies" and then immediately listed things you needed to install for macOS 😁.  This is just rewording the doc to be more consistent.
2026-07-28 13:04:19 -07:00
ghostty-vouch[bot]
7bea975bd3 Update VOUCHED list (#13497)
Triggered by [discussion
comment](https://github.com/ghostty-org/ghostty/discussions/13458#discussioncomment-17817388)
from @jcollie.

Vouch: @RoniJacobson

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-28 19:46:53 +00:00
Mitchell Hashimoto
4133c6e48c mirror deps (#13496) 2026-07-28 09:22:54 -07:00
Mitchell Hashimoto
07f6c6bb07 mirror deps 2026-07-28 09:13:49 -07:00
Mitchell Hashimoto
03eaa01d48 terminal: add visibility reports with GTK suspension tracking (#13494)
## Summary

Applications cannot reliably determine whether an unfocused terminal is
still
visible, so focus reports alone are insufficient for avoiding
unnecessary
rendering.

This adds terminal visibility reporting by:

- implementing private mode 2033
- supporting `CSI ? 998 n` visibility queries and `CSI ? 999 ; Ps n`
responses
- reporting effective visibility changes while mode 2033 is enabled
- preserving host-owned visibility state across terminal resets
- treating unknown visibility conservatively as potentially visible

On GTK 4.12 and newer, surface visibility now combines widget mapping
with the
toplevel `suspended` state. This allows Ghostty to recognize windows
hidden on
another workspace or otherwise known by the compositor to be
non-visible.
Older GTK versions retain the existing conservative behavior.

## Testing

Added coverage for:

- mode 2033 support and enable/disable behavior
- explicit visibility queries
- immediate reports when enabling the mode
- visible and non-visible responses
- visibility persistence across terminal resets
- suppression of visibility queries in read-only mode

## AI disclosure

Amp assisted with the implementation, tests, commit messages, and this
pull
request description. I reviewed the resulting changes and understand how
they
interact with the terminal, termio, surface, and GTK visibility paths.

Implements: #13451 
Reference: https://rockorager.dev/misc/visibility-reports/
2026-07-28 09:13:43 -07:00
Tim Culverhouse
6c8c07981d terminal: add visibility reports
Applications cannot infer whether an unfocused terminal remains visible, so
focus reports are insufficient for avoiding expensive rendering while a
view is hidden.

Implement private mode 2033 and the visibility query/report sequences.
Track conservative per-surface visibility, report every effective change
while enabled, and always answer explicit queries and mode enables. Keep
view visibility across terminal resets because it is owned by the host,
not terminal state.

Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019fa965-aa5f-7099-85b4-a9679d2c8bd3
2026-07-28 11:04:13 -05:00
Tim Culverhouse
2f3814ca5e gtk: honor suspended window state
GTK exposes the Wayland xdg_toplevel suspended state when the
compositor knows a window is not visible. Ghostty previously only used
widget map state, so it could continue rendering a mapped surface on an
inactive workspace or behind other windows.

Combine the mapped and suspended states for surface occlusion and update
all displayed surfaces whenever the toplevel suspension state changes.

Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019fa965-aa5f-7099-85b4-a9679d2c8bd3
2026-07-28 10:47:58 -05:00
ghostty-vouch[bot]
95befb3377 Update VOUCHED list (#13495)
Triggered by [discussion
comment](https://github.com/ghostty-org/ghostty/discussions/13491#discussioncomment-17814823)
from @tristan957.

Vouch: @ruseel

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-28 15:12:57 +00:00
Jeffrey C. Ollie
6e21f41c0c cli: fix list-themes preview lifecycle (#13466)
Start the vaxis event loop so the theme preview can receive terminal
input, and retain its environment map for as long as vaxis may access
it.
2026-07-28 09:21:34 -05:00
Mitchell Hashimoto
74f45b3219 config: update info about global keybinds on Linux (#13492) 2026-07-28 06:10:42 -07:00
Jon Parise
d320cd7df2 cli: fix list-themes preview lifecycle
Start the vaxis event loop so the theme preview can receive terminal
input, and retain its environment map for as long as vaxis may access
it.
2026-07-28 06:21:58 -04:00
Leah Amelia Chen
d71695550d config: update info about global keybinds on Linux 2026-07-28 13:26:08 +08:00
Mitchell Hashimoto
a60cd15bb5 renderer/metal: fix 2x sizeof over-allocation in Buffer.sync (#13490)
Seems to me the grow path in `Buffer.sync` (and `syncFromArrayLists`)
multiplies by `@sizeOf(T)` twice: `req_bytes` is already a byte count,
it gets doubled into size, and then the `newBufferWithLength:` call does
`size * @sizeOf(T)` on top of that. So every reallocation ends up being
`data.len` × `@sizeOf(T)`^2 × 2 bytes instead of the intended `data.len`
× `@sizeOf(T)` × 2.

The OpenGL version of this same helper does it what seems to be the
intended way, so this looks like a mixup rather than a deliberate safety
margin.

This makes the Metal implementation match the OpenGL one: track the new
length in units of T (which also fixes self.len going stale after a
grow. It's documented as the allocated element count but was never
updated here)
2026-07-27 19:55:34 -07:00
Uzair Aftab
4a22eed6d9 renderer/metal: fix 2x sizeof over-allocation in Buffer.sync
Buffer.sync and Buffer.syncFromArrayLists computed the new buffer size
in bytes (req_bytes * 2) and then multiplied by @sizeOf(T) again when
passing it to newBufferWithLength:, allocating data.len * sizeOf(T)^2 * 2
bytes. For the 32-byte CellText buffers this is a 64x over-allocation
and for the 4-byte CellBg buffers 8x, per swap-chain frame (e.g. ~9.4MB
instead of ~300KB per frame for a full 120x40 screen of text).

Match the OpenGL buffer implementation: track the new length in units
of T and multiply by @sizeOf(T) exactly once.
2026-07-27 23:42:06 +02:00
Mitchell Hashimoto
b61fd5fbb6 terminal: add iterator to ref counted set 2026-07-27 13:37:24 -07:00
Mitchell Hashimoto
2dd79f3bc6 Expose additional events: desktop and progress (#13483)
This exposes libghostty-vt callbacks for additional terminal events.

* Desktop notifications from OSC 9/777
* Progress reports from OSC 9;4, including state and optional percentage
* Uses the `lib.Enum` progress state
* Exposes both through the existing terminal option/effect API

AI disclosure: Sol-5.6 was used extensively to write the code, I
reviewed it personally.
2026-07-27 13:22:01 -07:00
Mitchell Hashimoto
eb9faed28b font/sprite: update to z2d 0.12.1, use native path insetting (#13489)
This change updates z2d to 0.12.1 and changes the sprite font path
insetting functionality to use the new path offset abilities released in
the update.

In addition, there has been a slight change to the drawing of E0B5 and
its respective reflection; we now add a 1-pixel horizontal line segment
to each end to force them to be perpendicular. This is because
offsetting pre-expands the curves and ultimately causes the end segments
of the curve itself to have slight non-horizontal angles, which produce
small artifacts at the ends without the forced horizontal ends.
2026-07-27 13:20:50 -07:00
Chris Marchesi
d0e72a3ab6 font/sprite: update to z2d 0.12.1, use native path insetting
This change updates z2d to 0.12.1 and changes the sprite font path
insetting functionality to use the new path offset abilities released in
the update.

In addition, there has been a slight change to the drawing of E0B5 and
its respective reflection; we now add a 1-pixel horizontal line segment
to each end to force them to be perpendicular. This is because
offsetting pre-expands the curves and ultimately causes the end segments
of the curve itself to have slight non-horizontal angles, which produce
small artifacts at the ends without the forced horizontal ends.
2026-07-27 12:08:24 -07:00
Jeffrey C. Ollie
c14cb5196a GhosttyI18n: fix build on freebsd with zig 0.16 (#13485) 2026-07-27 13:11:39 -05:00
Jack Pearkes
2729996eab terminal: update event tests for constructor API 2026-07-27 13:19:37 -04:00
Jack Pearkes
628adaf30f terminal: share progress state enum 2026-07-27 13:19:37 -04:00
ghostty-vouch[bot]
28f02ac3ce Update VOUCHED list (#13487)
Triggered by
[comment](https://github.com/ghostty-org/ghostty/issues/13485#issuecomment-5094118020)
from @jcollie.

Vouch: @svmhdvn

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-27 16:44:59 +00:00