Files
ghostty/example/c-vt-paste/README.md
Mitchell Hashimoto da27e6c908 libghostty: paste reads clipboard contents on demand, streams to pty
Follow up to #13978

`ghostty_terminal_paste` no longer takes the clipboard's data up front.
The request now carries only the list of available MIME types plus a
a callback that writes one representation's bytes into a `GhosttyWriter`. 

Previously an embedder had to load every representation for every MIME
type into memory before pasting. For a clipboard holding a large image
or video next to some text that could be hundreds of megabytes that
were never used.

I also took care to make sure that the data is only read once, to avoid
any time-of-check/time-of-use (TOCTOU) issues.

There is only one case where data might be fully buffered in memory now:
unsafe text data that needs to be checked. This is true for how Ghostty
GUI works today too.
2026-08-23 20:40:40 -07:00

865 B

Example: ghostty-vt Paste

This contains a simple example of how to paste into a ghostty-vt terminal with ghostty_terminal_paste: plain and bracketed (mode 2004) text pastes, the unsafe-paste confirmation flow, and Kitty clipboard protocol paste events (mode 5522) including the program's follow-up clipboard read. The clipboard's data is produced on demand through a read callback, so only what is actually pasted is ever read, and the result streams to the pty in chunks. It also shows the terminal-free building blocks for checking paste safety and encoding paste data.

This uses a build.zig and Zig to build the C program so that we can reuse a lot of our build logic and depend directly on our source tree, but Ghostty emits a standard C library that can be used with any C tooling.

Usage

Run the program:

zig build run